/*-----------------------------------------------------------------------------
	tim@epicgames.com: Work log
-----------------------------------------------------------------------------*/

Legend:	(blank)	Need to do it
		!!		Important
		+		Done
		??		Look into this
		X		Decided not to
		>>		A heading

<savant> i'm going to make Worldcraft a better Unreal editor than 
UnrealEd.

///////////////////////////////////////////////////////////////////////////////
>>Changes to be wary of for error symptoms

	INDEX_NONE = MAXDWORD
	ARoot/AActor reorg
	FClassProperty::AddToFrame change
	Actor properties are now 4-aligned with #pragma pack (push,4)
	Actors.Num != Actors.Max
	GClasses.Associate,GGame.Init order
	UnEngine.cpp game init order
	Debugger says overreading/overwriting ShadeData
	NF_Bounded
	Unres.cpp: UnclaimedNames->Element(i).Kill();

///////////////////////////////////////////////////////////////////////////////
Notes for others

>>Mark & Ammon:
	Anything that includes <windows.h> or relies on any of the Windows DLL's (winmm.dll,
		etc) needs to go in the Windows project.

>>Ammon:
	Can you always include a debug version of SoundEng.lib along with the release
		version in the future? Just name it dSound.lib.
	The sound system has been acting quite stably since the last merge, good job
		Ammon & Carlo!

>>Mark:
	It's not worthwhile merging any of the stuff in the Game project at the moment.
		As I prepare for scripting, this is going to undergo so many changes that the
		best strategy is to reconcile all of the code after my work on scripting
		is done. In the meantime the code in the Game project is a warzone.

	I'm not sure that I merged your Delta84 properly, because I found that most of the files
		I'd checked were unchanged changed (relative to the original I posted)...

	I merged some of my debugging code into your UnChecks.h, and now that's available 
		everywhere for convenience.

	Note the new "#if defined(_DEBUG) || defined(CHECK_ALL)" in UnChecks.h - CHECK_ALL is
		useful for enabling checks in individual files during development.

	You have some memory leaks. See the "Unfreed:" entries in the log upon exit for a 
		list of them.

	And now we need a "Video" tab with these options...
		Texture smoothing (note: no performance impact)
			Full texture smoothing
			Adaptive texture smoothing (high-res only) <- default
			No texture smoothing
		Default color depth
			8-bit color
			16-bit color (recommended on Pentiums)
			32-bit color (recommended on PentiumPro's)
			Always use current Windows color depth <- default
		Use MMX Multimedia Extensions (a checkbox; default is checked, but must 
			be greyed when no MMX support is available. You can detect this with GApp->MMX).
		Use Direct3D Hardware Acceleration (a checkbox; default is checked, but must be 
			greyed when no Direct3D support is available. This isn't detectable yet.)

>>James:
	Mesh skins need 1-pixel drawn boundary on all sides due to dithering; see the dark lines down
		the woman's face in the mesh viewer to see an example.

>>Art crue:
	Important: If there are more than 16 different texture palettes in view, performance
		will be significantly decreased. So, use as many common palettes as you can.
		16 is an actual, hardcoded limit (due to memory limitations): 16 or fewer textures 
		in view will be fast, more than 16 will be much, much slower.
	We need a good font (not the cheesy one we have now). Check out the awesome,
		kick-ass Age of Wonders intro font for an example of a font that doesn't suck.
	Need several cool backdrop textures for the sky. You can load and replaced the ones
		in UnrealEd to test them out. Be sure to use a full 256-color ramp; the sky texture
		in there now only uses about 64 colors so it's not very smooth.
	Make sure that the # of unique palettes are reasonably small in each texture set.
		The reason that the engine jerks when you go around corners and see new areas
		is because Unreal has to build a bunch of 128K palette lighting tables, so reducing
		the number of palettes helps to smooth out the performance.
	Need truecolor skins for everything (alien dragon, etc).
	Please use mixed-case filenames for anything that is visible within UnrealEd, such
		as texture filenames (use WinZip CabArc instead of PKZIP.EXE to compress files 
		and preserve case).
	Seed some cool marble base textures like we used to have. Bring on the texture CD's!
	Need icons for
		All actor classes
		Need 1 pixel border on all sides
	Need a really awesome, fine-tuned backdrop!
	Smooth out sample cloud texture beautifully, possibly use blur effect

///////////////////////////////////////////////////////////////////////////////
Major subsystem tasks to do

	>>Scripting
		Need static variables, init once per class. Can be edited, but only in default props.
		Need static const's.
		Non-class code modules?
		Special commands
			Let with proper type checking and conversion
			SetState, Goto, Label
			While, For, If, Select with address fixup
		Functions
			Overhaul all intrinsics
			StateStr
			IIf
			Print
			C Function pointer prebinding for fast intrinsics
		Member operator
			GetContextExpr (function or variable)
			Deal with vector and rotation components properly
			Actor references, use of context class pointer in expr evaluator
		Resource and actor class hierarchies
			Need strong type checking on resource and actor types
			Recognize generic resource type and generic actor type somehow?
		Script query and expr query work 100% as-is
		Type conversions
			Compile all basic conversions as intrinsic fast autoconversions in Root.tcx
			Call explicit conversions
			FindConversion(srctype,desttype)
			Function-caller use two passes: Exact-match, followed by conversion attempt
		Type conversions
			Non-precedenced binary operators with exact-match and simple type conversion
			Operator precedence option, enforce overload/override matching
			Precedenced operators
			Torture test all expression error handling
			Proper type checking in all cases
		All actors need
			Const class
			Const StateHierarchy[MAX_STATE_HIERARCHY], NumStateHierarchy to represent current state
			FScriptExecutionThread
		Execution
			QuakeC stolen ideas
				Runaway counter to prevent infinite loops
				Profile counter for each function
			Server log function
			and/or short circuit logic
		Maybe define anim seqs and stuff in script?
		Need a Fork function for actors duplicating themselves in order to preserve weapon
			pickup properties, for example?
		Support bSleeping to avoid ticking, ScriptRate, ScriptCountdown, ScriptTickRate.
		Timer messages.
		RayHit auto aiming.

	>>Scripts
		triggerable lights, bTempLightingChange.
		Zone name text messages
		Dispatcher
			One input, up to 8 outputs
			OutputEvent(8)
			OutputDelay(8)
		Timer
			Can be on/off, can be turned off by an optional trigger
			Can fire 1-8 events in sequence (default 1) on a specified period
		Overall brightness scaling value!
		First mesh texture is script replaceable by resource (doable).
		Messages
		>>Is it possible for you to code a new MoverTriggerType called
		>>ProximityToggle.  The brush would move to key frame 1 when the player moves
		>>within its collision radius and would only move back to key frame 0 when the
		>>player again moves near the brush.  This MoverTriggerType would be useful in
		>>conjunction with brushes that are triggers with the TriggerOnceOnly property
		>>set to true.  An example would be a switch that would recede into the wall,
		>>and not come back out,  to open a door permanently.  Currently in the
		>>editor, you can set a brush to trigger once only, however, the brush will
		>>still move back and forth between key frames 0 and 1 (since you have to set
		>>the brush's MoverTriggerType to ProximityOpenTimed), even though it's not
		>>triggering the event anymore.  This looks silly, as in the switch example
		>>above.  This added functionality would help alot.  Thanks.  TTYL!

		Lights respond to triggers

		Script animation:
			PlayAnim/LoopAnim/PlayAnimWait,LoopAnimWait <SeqName>, [<Start>], [<Count>], [<FramesPerTickFloat>]
			' Plays animation sequence once then continues with script execution.
			' MeshMap implied.
			' Speed is optional, otherwise uses AnimSpeed (CurrentAnimSpeed).
			' Set speed to 0 if you want to play a still frame

			PlaySound <SoundName>,[<VolumeScaler>],[<PitchScaler>]
			' Play one-shot sound (set AmbientSound if you want to play an ambient).

			BreakAnim
			' Breaks the animation sequence.

			FinishAnim
			' Waits until the current animation sequence is finished.

			Open questions:
			* If you play multiple animations without waiting or finishing, do they queue up
			  or is there only one pending at a time?

			BlockEvents, HoldEvents, ReleaseEvents
			Sleep <# tics>

	>>Rendering
		Optimizations - n*log n is a LOT less than n*n!
		Temporal oversampling possibilities
		Optimize SetupForPoly (1.2 msec for nothing)
		Dirty shadows alignment problem? Shadow fuzz visibility problem? Coplanar crack problems?
			Can solve all of these problems with NoMerge tag, and pre-raytrace merging of all
			identical iSurfs, even those coming from different brushes. Followed by separate
			merging of all identical iLightMeshes (only care about coplanarity and data size, 
			not absolute alignment).
		Raytracer point out of polygon rejection and nearest-shadow/light propagation?
		Span buffer encoding and decoding
			Span buffer encoding and decoding instead of mask map?	
				FSpanBuffer::DecodeFrom(const BYTE *Stream); // Assumes StartY,EndY already set
				FSpanBuffer::EncodeTo(BYTE *Stream);
				dword: num bytes comprising decompressed span buffer
				word: num empty spans
				word: num nonempty spans
				7-byte start/end, 0x7e = must use word start/end, start&0x80 = empty row, end&0x80=end of row,
					0x7d = clone previous row exactly.
			Savings: Save space whenever: Avg span/unspan length > 16, or row is identical to last row, or row is empty.
			Shadow map and illum map, use the span buffers!
		How much time is wasted in matrix inversion? Worth caching?
		Rewrite chunk filtering code
			- Use new dynamics classes
			- Figure out lighting in split zones
			- Figure out span merging strategy
		Proper rebuild order:
		1. Rebuild geometry excluding detail brushes
		2. Rebuild and optimize Bsp
		3. Rebuild detail brushes (adds & subtracts), performing coplanar overlays for subtraction
	Creature optimizations
		Shared-side rasterizer setup
		Build clipping span buffer rather than current awful raster clipping hack
		Optimize for speed
		Spanline z-buffer em

	>>Actors
		WeaponCalcView is limited.  Should:
			Call for each thing in the inventory
			Draw each thing that returns a 1 from CalcView, as it returns it
			This allows for dual weapons, cool powerups, mutliple active inventory items
			Need weapon freeform movement option
		h & vseek function, returns iPotentialTarget or INDEX_NONE
		AutoVSeek & AutoHSeek based on bProjTarget
		Projectiles need Hit and HitNotify logic
		Compute ray/actor-sphere intersection and do the appropriate pyrotechnics spawns

	>>Volumetric lighting extras
		Tag leaves with v-light idynamics and manage list of active v-lights as traverse
			bsp from front to back, with stats.
		Implement polygon-sphere-cone rejection, or reject with simple sphere--plane
			intersection per span (side of plane reject, passthrough reject), with stats.
		C dual light and fog code with full darkening integration.
		Mask overflow problems with zmin/zmax checking.

	>>Moving brushes
		Test moving brush ambient sounds
		Test doors that don't exist on particular net levels or difficulty settings
		Moving brush view in UnrealEd
		Moving brush trains, setforward/setreverse/on/off/toggle
		Implement MoverBump sensing
		Build list of newly-encroached actors as add brush
		ReturnWhenBump & stuff
		bSlave
		MT_TriggerCycleOn, MT_TriggerCycleOff, MT_Instant, MT_Destruct?
		MV_Sinusoid
		Gyrate by period option (for lights & such!)
		Test moving brush fillup conditions
		Send shoot msg to shot moving brushes
		Perfect brush/player interaction
		Slave brushes = huge moving brush optimization (4X faster for iris doors)
		Raytrace world brush nowhere option.
		Really need an "Edit Brush" option for texturing the brush (COOL!)
			Edit current brush, Edit level brushes, Use current brush
		Show moving brushes properly in UnrealEd
			Clean out moving brush stuff before csg, loads, saves
			Re-add moving brush stuff after csg, loads, saves
		Mover proximity stuff - don't fool with actor sphere, just place refs at all leaves
			below owned nodes and use Touch messages with slightly enlarged radius.

	>>Networking (handed over to Mark)
		DPlay UI, code
		WinSock UI, code
		Pending connection UI clean
		Simple 1-level server
		Multithread server
		Proper player recognition, join (with limits), abandon, timeout
		Full chat
		SpawnPlayActor sense net mode & spawn into playerstart farthest from opponent player team
		SpawnPlayActor handle whether player fits or not, handle optional team name & teleporter name

		Packetizer
			Build list of visible, nonstatic actors
			Sort by priority first, then by class
			Build packet of draw types, stopping when filled
			Update sent actor counters

		Depacketizer
			Delete nonstatic actors after expiry time
			Unpacketize packet, merging actors based on uniqueness
			Use AUnknown class

	>>Textures
		FireEngine support
		Animating texture support

	>>Resource subsystem
		Occasional LRU data purge?
		Res add keep file open via CreateFileMapping?
		Use hash as resource name and global name starting point?
		Need a compelling way to manage multiple resources and disk cached resources

	>>Lighting
		Lights need QWORD zone masks saying which zones their rays hit
			and which zones their radii fall into volumetrically, set in raytracer
			and in DoDynamicLighting.

	>>Internal format changes:
		Reduce memory usage
			PreLoadQuery shrink:
				Actor list
				Bsp nodes
				Bsp surfaces
				Points
				Vectors
				VertPool
				Bound
				Terrain
			Don't load level brushes for play at all
			Do purge
		Don't add Root.ucx when playing game?
		Teleporter load/save

	>>Teleporters:
		Handle same-level URL's
		Handle other-local-level URL's
		Stub [unreal:][//]server[/[level]] URL's
		Spawn Web browser on http:// ??

	Level brushes = actors w/ associated breps/bsps?  Cool for editability, one less thing to track.
		Can store brushes as classes
		CSG_Add, CSG_Subtract, etc.
		Brush selection popups (map edit mode & non) for setting properties
		Quake-like entity stuff, no bizarre brush list hacks

	>>Game logistics
		Idle state, begin, end, pause - via GEngine.Pause()
		Implement demo
		Load/save game, load level + proper resource purge

	>>Server/User/Player/Camera/Task association

		Server - controls one level
			* Server mode (local server)
			* Server spoof mode (remote server)

		Camera - client's perception of a player
			* A camera resource always corresponds to a window on the local machine
			* Separate task?

		User - server's perception of a player
			* Corresponds to??
			* Separate task?

	>>UnrealEd projects
		Texture properties
		Sound properties
		.BMP importer/exporter
		External tools
			Doom Importer
			Quake importer
			Quake exporter?
		2D lofter
			Rewrite using plain outline editor paradigm?
			Optimizations
			Extra functions
		UnrealEd online help
			HTML help format
			Expand docs in all important areas
		UnrealEd color prefs
		UnrealEd -> UnrealStudio?
		Eventually need drag box and brush grouping, group showing/hiding?
		Need Edit Brush option! Yeah!

	Main loop
		Start in clean, no-level play state (later demo loop etc)
		Space = load & start level
		Load game & save game 100% in all cases
		Add res file based on *one* name/type; only adds that and its dependents?
		Macro system for cramming multiple levels and Classes.ucx stuff together
		Auto purge always work
		Save game, load game with purge
		Dehack camera levels
		Dehack edsrv levels

	Gfx ideas:
		Dynamic shadows antialiased via sublimation
		Alpha-blended texture type using palette
		Edge antialiasing
		Palette entries that are not lit by lookup table (how to do in 24-bit?)
		Lens flare
		Light highlight via alpha-blended sprite
		Underwater 3-way blur
		Sheafs of span-z light fading in and fading out
		Corona of light visible through water surface
		Xmas lighting
		Volumetrically lit fog with proper Z-clipping

	Game ideas:
		Girders with high-res masked textures
		Huge spider with thick legs
		Flashlight, perhaps gun-mounted
		Actor shadows via cone sampling
		Weapon powerups, including getting two of a kind of weapon
		Weapon body mounts, i.e. side cannons
		Create playerview mesh for all nonhuman morph targets
		Stolen Quake hammer
		Moonlight-shining-through-rain lighting effect
		Rain volumetric effect?
		Bots on equal terms with players - same movement primitives?
		Team play: Devil takes the highmost play (dead players can't reincarnate until
			only one team or player is left alive).
		Team skins; if you don't want to d/l em you get the defaults. Separate from resource system.
		Spawn other creatures to attack your opponents (friendly to own team).
		Indestructable admin players, can become invisible etc.

	>>Edge renderer

		Hedge links
		Perfect ael clipping and sorting
		Debug checks from hell

		Perfect ael z realization, z-shading
		Ael span generation
		Ael silhoette edge resorting
		Perfect nonconvex volume rendering
		Perfect portal rendering
		Optimize everything like hell!

	>>New bsp pass:
		35% of all points are near duplicates (within 0.2 units of each other), many of the others aren't
			relevant if they are only intrasurface!
		640x400: 11.5 msec; 320x200: 9.5 msec: This code is cache and geometry bound.

		Generate leaf numbers in leaves.
		Generate new format leaf side lists with duplicate removal.
		Special case portal surfs.

		60% of time is spent in GRender.GetPoint, 60% of points are cached!
		10%-20% of all lines are clipped depending on the scene.
		<0.5% of all lines are multiply clipped.

		2 classes of edges - static edges whose relative depth sorting does not change,
		and floating edges whose relative depth sorting can change. Handle each separately
		and merge them per scanline?

		Unordered flatshaded rendering.
		Unordered flatshaded rendering with proper clipping.
		Clip via per-surface effectiveness count.
			Clip via inherent start/end effective count.
		Unordered span buffer building.
		Z-aware span buffer building.
		100% pixel-perfect.

		* Merge surfaces.
		* Merge light meshes.
		* Run 1/2 unit wielding pass.
		* Each bsp leaf is a cv containing polys and portals.
		* Bsp heuristic adjusted to minimize added portal sides while balacing the
		  tree half decently.

	Phase 2.
	* Massively high-level optimized and tested in full unoccluded Jorus.
	   - Perform minimum possible sorting (bucket or myqsort) or, better yet, avoid.
	   - Perform minimum possible surface transformation and work, save stuff in Surf
	     area for later usage.
	   - Perform very fast front/back test.
	   - Very fast subpixel accuracy.
	   - Integrated point and vector transformation.
	   - Outcode rejection.
	   - Use vertical exact intersection if that's fastest.

	Phase 3.
	* Portal rendering with faulting.

	Phase 4.
	* Rebuild for play option.
	* Bsp portal generation and extraside minimization.
	* No redundent edge setup.
	* 0.5-unit point merging with dead-surface elimination.
	* Duplicate side elimination.
	* Superduo edge resolution.
	* Surface merging.
	* Lightmesh merging.
	* 640x400 Jorus always <= 3.0 msec occlusion on PPro-200.

	Phase 5.
	* Integrated creature feelers and creature occlusion rendering.

	>>New rendering technique notes
	New stats: Performance is now a function of 2 things: pvedges and vsurfs
		(not counting dynamic lighting and gameplay processing).
		pvedges reflects the number of "potentially visible edges" in the view;
		you can reduce it by occluding your levels and building simpler architecture.
		vsurfs is the number of visible surfaces in the view; reduce it by using
		simpler brushes and building simpler architecture.
		Polygon counts aren't relevant because Unreal knows not of polygons.
	Note that the editor and game use a very different rendering algorithm (use
		the "optimize for game" option in the rebuilder to optimize a level for
		gameplay rendering).  The game's is much faster but is not versatile enough to
		be edited.  However, you're always just a rebuild away from either format.
	Semisolids are no longer needed or supported.
	Zones and portals are now useful only for setting ZoneDescriptor properties; 
		they don't speed up (or slow down) the engine anymore.

///////////////////////////////////////////////////////////////////////////////
	Past work log entries are in TimOld.txt

///////////////////////////////////////////////////////////////////////////////
10-24-96

+			Unzoned polys are drawing with backdrop shading
+			DaySkyBrightness, NightSkyBrightness
+			Scale backdrop lights by brightness, use effects
+		Backdrop lights zero effect on surfaces
+		Finish up any remaining needed parametrization (level entry text)
+		Change BT_'s to remove ghost, glow.
+		Bumped MAX_CLASS_PROPERTIES=384.

+	Kill UnrealEd farceiling.
+	Rearranged UnrealEd surface flags
+	Mirror sky option
X	UnrealEd NoteClassChange leaves unwanted slider visible -> Gone?
+	No GServer refs in rendering code!

+	Merged Mark's latest code. Piece o' cake!
+	Added all .tcx files to a new 'Classes' project in project for convenience.

+	Better solution to requiring power of two textures in fonts -> now they don't show up in browser
+	Renamed bStaticActor to bStatic
+	Added bNoDelete to inhibit actor deletion
+	LevelDescriptor = non-static, nodelete

+	Pawn needs editable 'Camera' properties tab for fov and other cool params.
+	Changed unused bInactive to bSleeping, will be used to indicate that an actor need not be
+		ticked.
+	Changed bPegged to bUnused4.

+	Added ScriptRate, which defaults to 1. This is the number of ticks between script updating for
+	each actor, so that actor scripts don't have to continually execute for low priority actors.

+	Added ASpotlight to ALight

///////////////////////////////////////////////////////////////////////////////
10-25-96

+	Implemented volumetric lighting.  Unbelievably cool!
+	It is unlikely that anybody will accuse the volumetric lighting code of being too fast.
X	Only get 640x400x16 on 2meg cards? -> Must be your DirectDraw driver

///////////////////////////////////////////////////////////////////////////////
10-26-96

+	V-lighting improvements:
+		Sphere fast intersect rejection at the point level.
+		What's up with the random artifacts?
+		Adjust smoothly to avoid interior and edge aliasing of volumetric regions.
+		Any more inner loop optimizations

+		Separate volumetric and regular lighting via zone, systemize the code.

>	That virtual memory bug is on your list, right?
>	The bug where, if you scroll through the texture browser too much by holding
>	the slider bar, the editor crashes.
+	Fixed, I think. Send log if anyone sees this again.

+	Wavy bug in unshaded mode.

+	SIOBHAN26a.ZIP in my directory under /maps has this problem with the
+	rotating bridge... You'll see it as soon as you walk through the door and
+	come to the top of the ramp. (Doors and simple lifts aren't a problem. ) 

+	Fake Backdrop etc should equate to unlit.

+	no alt enter in camera children

+	Lessen ambient scaling, 0.5 or 0.3 (is this nonlinear?)

>	I get a 'Error 13 Type Mismatch' and a massive crash when I type two
>	periods (as in 1..0 instead of 1.0) in the custom scaling number fields
>	on the Polygon Properties request and then select 'apply' 
>	This is 100% reproducible. 
>	I attached the log if you need it.
+	Fixed

>	BTW An autosave with number will be cool : auto01 , auto02 ... (One more
>	Barracuda please :-)) - as an *option*.
+	One barracuda implemented, see preferences for option.

+	dbg ver fails link

///////////////////////////////////////////////////////////////////////////////
10-27-96

+	Renamed all FVirtualXyz classes to FXyzBase for better class browsing.
+	Renamed all AXyzHelper classes to AXyzBase for consistency.
+	Had to change UNGAME_API to DLL_EXPORT in Root.h to prevent linker errors.

+	Rewrote creature rendering code adding good support for 16/32-bit.
+	16/32-bit texture viewer works!

+	16/32-bit texture viewer and span drawing code (q&d)

///////////////////////////////////////////////////////////////////////////////
10-28-96

+	Changed cheetah to cheat. Quirky != fun.
+	Added FVector::Normalize.
+	Fix flatshaded drawing code.
+	Fix highlighting in high color modes.
+	Icons.

+	Creature optimization.
+		Build and save out span buffers, skipping empty span buffers.
+		Sped up creature rendering in the game by a factor of 2, with a
+			brilliant optimization -- stop drawing them twice per frame. :-P
X		Chunk pool, reuse nonleaf chunks as filter new ones down.
+		Prepare rasterization cutter for optimization.
+		Span clipped flat shaded.
+		Separate span rendering loop into two passes for better MMX support.

///////////////////////////////////////////////////////////////////////////////
10-29-96

+	Common sense optimizations:
+		MeshesGen!=0 with all static lighting! -> No player lightsource.
+		Eliminated stupid iUniquePlane usage.
+		Discovered and fixed many zone-related moving brush bugs. :-P
+		Fixed moving brushes
+		Fixed moving brush coplanar bug (Kootch et al)
+		Gack!!! Actor lighting code was performing O(n^3*log n) line of sight logic! I'm an idiot!
+		Optimize all physics code using PlaneDot!

+	Quick test: Rebuild bsp heuristic that tries hard to minimize the number of
+		zones that are shared between front and back. -> Bizarre unbalanced performance,
+		why???

///////////////////////////////////////////////////////////////////////////////

New rendering technique:

L1 cache thrashing due to span buffering and bsp traversal in the occlusion 
phase of Unreal is now the main performance bottleneck, and will become a 
larger and larger bottleneck as levels grow in complexity.  As a result, I am
trying to switch to a new, non-bsp portal rendering mechanism which has the 
following characteristics:

 - Generates seamless, not necessarily convex, zones bounded by occluding 
   polygons and by portals.

 - For game rendering, zones contain only linked sidelists, in no special order.

 - Begins by active-edge-table rendering the edges in the viewer's zone and 
   adding edges from adjacent zones as visible portals are encountered using
   seh.

 - Zoning process generates fewer zones than Bsp leaves, opting to merge adjacent
   convex volumes when generating portals would be wasteful.

 - Rebuilds the Bsp with the intent of minimizing portal area and balancing the tree.

 - Maybe perform interpenetration checking between world polys and moving brush polys so
   that moving brushes need not be added to the Bsp.

 - Eliminates redudent sides (sides which have the same surface on both sides).

 - Generates merged spans, as do the current routines.

 - Processes creatures using the same technique, by placing cutout feelers in the
   aet and using seh to generate creature polys on demand.

 - The resulting solid world spans are drawn in order of texture than light mesh,
   while masked spans are drawn in order of polygon z-sort.

Note that this requires no Bsp traversal, is entirely L1 cacheable, and can
be designed with o(n log n) sorting throughout.

On 3D hardware, the same setup can be used with a vertical intersection
algorithm to compute the numerically exact list of visible polys to render
without resorting to any rasterization or discretization.  Note that vertical
intersection can be ordered with o(n log n) sorting which requires only floating
point multiplies.  This is awesome for exploiting concurrency between the rendering
hardware and the processor.

On multiprocessor PC's, and on 3D accelerated PC's, one processor can be set to do 
all dynamic lighting calculations for the previous frame's set of visible polys 
(using a locked caching mechanism) and v-lighting, while the other performs 
visibility computations and texture mapping.

///////////////////////////////////////////////////////////////////////////////
10-30-96

+	Fixed way off msec timer
+	Edge list experimentation

///////////////////////////////////////////////////////////////////////////////
10-31-96 Halloween

+	Fixed sidelink crack bug.
+	Edge renderer work.
+	Note: 1000 polygons @ 640x480 = 300  pixels each, 25 scanlines each = 300K span buffer mem.
+	Note: 200 polygons  @ 640x480 = 1500 pixels each, 60 scanlines each = 150K span buffer mem.

///////////////////////////////////////////////////////////////////////////////
11-1-96 & 11-2-96 & 11-3-96

+	Optimized transformation cache.

	+	Worst case occlusion performance in Jorus at starting point =
	+	33.0 msec to begin with.
	+	25.0 with removal of intrasurface edges.
	+	23.0 with duplicate division removal.
	+	22.0 with assembly language clipper and outcode generator.
	+	21.0 with some FGlobalRender statics.
	+	20.5 with some branch minimization.
	+	19.5 with some lameass VC++ workarounds.
	+	19.0 with better cache alignment of FTransforms and extraneous edge removal.
	+	20.0 after implementing surface cache.
	+	18.5 after backface rejection.
	+	16.7 by changing backface order.
	+	20.5 after fixing bug preventing all vertices from being recognized. :-P
	+	20.4 after full, proper cosidal merge.
	+	19.9 by customizing optimization options (shouldn't have effect!) Augh.
	+	17.3 by disabling guard mechanism. Aha!
	+	17.2 with minor GetPoint optimization.
	+	15.4 after previous-frame coherent pretransformation outcode reject.
	+	14.4 with some simple reorg to appease the VC++ optimizer.
	+	14.3 by padding FTransform and performing memset optimizations.
	+	14.2 by merging duplicate surfs (should be a huge rendertime improvement though!).
	+	14.0 after merging duplicate points (expected more).
	+	13.9 by fixing broken merging code.
	+	13.8 by eliminating collapsed polygon fragments.
	+	11.5 by removing semisolids and reoptimizing Bsp. Wow!
	+	11.0 by hellishly optimizing Bsp.
	+	10.9 by modifying point cache code to improve branch prediction.
	+	10.8 by minor improving conditional branching.
	+	11.1 with surface cleanup routine (will be faster on average).
	+	Overall: 3X speedup, not bad.

	+	PentiumPro has some strange alignment<->performance characteristics. It often
	+		favors 8-aligned stuff for no apparent reason.
	X	Early backface reject based on side's last-frame backfacing. -> Complexity slowdown.
	+	Fast bitvector code (asm get/set).
	X	Optimize backface removal for caching with surface plane table -> Slowdown due to L2 usage.
	X	Optimize GetPoint. -> Slower for some reason.

+	Properly-clipped convex volume renderer:
+		Flatshade routine.
+		Properly set LeftSurf, RightSurf according to up/down facing.
+		Perfect unclipped convex volume rendering.

///////////////////////////////////////////////////////////////////////////////
11-4-96, 11-5-96

+	Active edge list x-clipper.
+	Struggling with active edge list clipping logistics.

///////////////////////////////////////////////////////////////////////////////
11-6-96

+	Phase 1.
+		Build list of all edges in the world excluding duplicates, pass to code.
+		Draw edges as 3D lines.
+		Clip edges as 3D lines.
+		Proper start bucket and active edge tracking and line rendering.

///////////////////////////////////////////////////////////////////////////////
11-7-96

+	Created IUnrealServer Ole interface to UnrealServer.

///////////////////////////////////////////////////////////////////////////////
11-8-96

+	Full UnrealGate user interface prototype.

///////////////////////////////////////////////////////////////////////////////
11-9-96

+	UnrealGate protocol design.
+	UnrealGate basic server implementation.

///////////////////////////////////////////////////////////////////////////////
11-10-96

+	UnrealGate client design.
+	UnrealGate client & server communication.

///////////////////////////////////////////////////////////////////////////////
11-11-96

+	Research RFC1459

+	Notes:
+		Spanning tree master server architecture or peer master servers?
+		Operator class users = server admins or dm's? Figure out hierarchy.
+		Freeform client channel creation? Reserved channels?
+		#channelname
+		invite & kick
+		topic

+		Names:
+		#Channel
+		*Server
+		@Operator
+		!Admin

+	Morn:
+	>  Well, we could have a basic rfc1459-like message format like this
+	>
+	>[:<nick>!<username>@<hostname>] <command> [<par1> [<par2> [...]]]
+	>[:<trailing>]
+	>
+	>  This is basically how IRC works... ok, now let's say someone enters a
+	>level/chatroom/whatever, the message would be
+	>
+	>  :Tim!tim@timpentium.epicgames.com JOIN 2
+	>
+	>  ..."2" being the level number on the server. Now every player on that
+	>level would get a message "Tim has joined the game. Feel his wrath". :)
+	>
+	>  A message would be this:
+	>
+	>  :Tim!tim@timpentium.epicgames.com SAY 2 :Hey guys... you will die now!
+	>
+	>  ...and everyone on that level (2) would get the message "Tim says: Hey
+	>guys... you will die now!".
+	>
+	>  A message to an "external" channel would work like this:
+	>
+	>  :Tim!tim@timpentium.epicgames.com INVITE Morn unreal.epicgames.com 12999
+	>
+	>  ...this would invite "Morn" to join the game running at
+	>unreal.epicgames.com port 12999... a message would pop up in Morn's client
+	>saying "Tim has invited you to join his game at unreal.epicgames.com. What
+	>would you like to do? Join/Get level info/Deny"... etc, I think you get the
+	>idea.

+	Neutral zones?
+	Cult homeworlds?
+	Cult skin accumulators?

+	UnrealGate testing & experimentation

///////////////////////////////////////////////////////////////////////////////
11-12-96 & 11-13-96

+	Speedup geometry rebuild while keeping exactness of bsp rebuild.

X	Reduce ULevel locks per frame to 1 (collision locking is very very slow).
X	Only perform collision and moving brush work when locking level for tick.
X	Don't lock collision stuff for rendering. -> Eliminated speed impact.

X	>Engine limitations may prevent this, but what would be truly 
X	>awesome and realistic, IMHO, is for light to flood a room
X	>when opening a door to a bright room, from say a very dark room.
X	>It would be truly incredible to do, to see a beam of light illuiminate
X	>a section of floor (fanning out) and perhaps cast a bright light on 
X	>an opposing wall in the room, perhaps revealing a secret etc....
X	>When the door closes, the light is gone, just as would happen in 
X	>a real situation. Is there any way to accomplish this?
X	-> Maybe later.

+	>>If I try to select "INVISIBLE COLLISION HULL" from the "ADD SPECIAL"
+	>>dialogue box, I get a RTE 380- Invalid Property Value.
+	Fixed invisible collision hulls.
	
+	Moving brush coplanar bug: Kootch entryway.
+	Fixed all known moving brush bugs.

///////////////////////////////////////////////////////////////////////////////
11-14-96

+	The CyberLore team are experiencing an UnrealEd crash when entering numbers
+	in the primitives properties boxes. This is on a fairly regular but random
+	basis. I've sent their log files (2) to the /bugs directory.
+	Line(4) bug, fixed.  What the heck is this about Windows font smoothing???

+	>>The other thing we're doing now is to save it as a T3D, and then import it
+	>>in the current map. What we need to do then is to select all brushes in this
+	>>sub-map, and move the whole selection around.
+	>When you import a new map into the current map, the new brushes should all
+	>be selected.  Are they not?
+	They're not selected when you import them into an existing map.

+	debugf (LOG_Info,"Error opening %s",DataFile);
+	where data file is of type FILE *.  -> Thanx Mike

///////////////////////////////////////////////////////////////////////////////
11-15-96

+	Gatekeeper protocol definition.
+	Gatekeeper experimentation.

///////////////////////////////////////////////////////////////////////////////
11-16-96

+	Gatekeeper Ole interface.

///////////////////////////////////////////////////////////////////////////////
11-17-96

+	Gatekeeper remote property editing and browsing.
+	Scrapped Ole interface in favor of cleaner TCP interface.

///////////////////////////////////////////////////////////////////////////////
11-18-96

+	Rewrote Gatekeeper using database/subscriber paradigm.

///////////////////////////////////////////////////////////////////////////////
11-19-96

+	Silhoette edge occluded experimentation
+	Integrated Eric's new spanbuffer code

///////////////////////////////////////////////////////////////////////////////
11-20-96

+	Gatekeeper database grid updating

///////////////////////////////////////////////////////////////////////////////
11-21-96

+	Researched HTTP protocol.
+	Researched FTP protocol.
+	Revised Gatekeeper protocol.

///////////////////////////////////////////////////////////////////////////////
11-22-96

+	Gatekeeper docs overhaul
+	Started gatekeeper discussion group
+	Experimented with edge rendering code some more

///////////////////////////////////////////////////////////////////////////////
11-23-96

+	Next generation gaming interview - cool!
+	Played a bunch of new games.
+		Sorry but Tomb Raiders looks and plays awful.
+		Amok is extremely cool - I think this team will go on to produce major hits.

///////////////////////////////////////////////////////////////////////////////
11-24-96

+	Worked on Gatekeeper stuff.

///////////////////////////////////////////////////////////////////////////////
11-25-96

+	Gatekeeper level launching and crash detection
+	Unreal 0.85 cleanup

///////////////////////////////////////////////////////////////////////////////
11-26-96

+	Can't click on menu-down in add-actors mode.
+	Highlight meshes in 3d views.

+	jschreiber bug indicates that 24-bit (or some weird colordepth?) crashes. -> Fixed it.
	
X	Texture browser needs Find filter (checkbox, goes to all). -> No it doesnt get out of
X	the DOS ages my friend.

X	>I can't select individual verticies of moving brushes in order to make them
X	>pivot on a particular vertex. (used to be able to)
X	-> You HAVE to select your pivot before you add it as a moving brush.

+	We used to be able to replace a moving brush in MapEdit mode by loading the
+	desired brush, going to Display on the moving brush properties, and then
+	hitting Use Current under Brush. This isn't working anymore, in case no one
+	else noticed (or did I miss an earlier post). -> Fixed

+	UnrealEd fixes
+		After load tex fam, try to go to that family
+		New Level while actor props dialog is up crashes

+	Rotating brushes need to move the player according to their rotation: Kootch.

X	Make copy-to-brush work w/ moving brushes. -> No way to select them.

+	Invisible polys: cast no shadows.
+	Eliminate unused special brush types.

+	Pawn:
+		Player-name=string
+		Player-team=string
+		Renamed Woman to Human.

+	ZoneDescriptor:
X		NoBot zones.
+		Team-only zones.

+	Zone color and volumetry screwed when not in a zone

+	Root:
X		MeshSkin1 & MeshSkin2 -> handle via team name associations (separate system).
+		SoundRadius, SoundVolume

+	Major actor class overhaul.

X	FName -> FName pointer! -> It's faster not to, since names can be hashed consistently.

+	Show actor selection with meshes by highlighting them.

///////////////////////////////////////////////////////////////////////////////
11-27-96

+	Gatekeeper level launching and management

///////////////////////////////////////////////////////////////////////////////
11-28-96

+	Scripting experimentation.
+	Played Tomb Raiders.
+	Played Amok.

///////////////////////////////////////////////////////////////////////////////
11-29-96

+	Thanksgiving and stuff.

///////////////////////////////////////////////////////////////////////////////
11-30-96

+	Pawn needs buttons & axes

+	FovAngle
+	Bump ResFile version
+	PF_Gouraud for Gouraud surfaces? This is getting messy...

+	Lighting fixes
X		Dynamic lights should have no incidence effects. -> Looks weird.

+	Test unguardf
+	Eliminate #ifdef PARANOID
+	Added string array support
+	Fixed alignment problem with class inheretance.

+	NameAddHardcoded "None!"
+	No purge hardcoded names.

+	Internal fixes
+		UnBuild version

+	Use IsPerActor! No AActorBase::EPropertyBins directly.
+	Remove (void)s
+	FClassProperty::IsTrue -> Deleted.
+	FClassProperty::Compare

+	Event lines are drawn with NAME_NONE!
+	Fix header exporting.

///////////////////////////////////////////////////////////////////////////////
12-1-96 & 12-2-96

+	Rewrote FMemoryCache
+		This is an example of the kind of subsystem implementation that is
+			appropriate for Unreal:
+			- Simple design.
+			- Algorithmically fast implementation.
+			- Minimal use of weird advanced C++ features.
+			- No extraneous class definitions, typedefs, etc.
+		Get is >4X faster!
+		Create is >50% faster.
+		Can see what's happening with the cache graphically.
+		Half as much code.
+		Time to implement and debug, 11 hours.

+	Importing maps needs to remap actor indices (right now to account for
+		leveldescriptors and for merge imports). Test carefully.
+	Sensible cache stats: Num gets, num creates, create time.

+	Load texture family is broken!
+	ExportActorProperty: Unknown name in light class.

+	Static variables - SCRAP THEM! AUGH!

X	Astoundingly bizarre frame of reference bug with moving brushes! -> Fixed.

///////////////////////////////////////////////////////////////////////////////
12-3-96

+	Flush: Unhashed item after rebuild.
+	After full flush assure that there's only one item.
+	Changing zone properties doesn't always cause relight.
+	No Actor Index=, just use Me=...
+	Weird new node disappearing rendering problem. Seems to have disappeared (great).
+	Delete old tmapping code.

+	Consolidated Cache ID's.
+	Now have a global system for assigning cache id's (no overwrites anymore).

+	Totally moronic bug found: The reason 8-bit color thrashes so horribly is because
+	I was allocating >10 times the amount of space that's actually required. 
+	(Stupid programmer!)

+	Full proper cache locking everywhere in highcolor.
+	Proper cache locking in 256-color (gets each texture 8 times).
+	16-bit palette scalers are busted.
+	Tex remapping allocating more space than needed for each mip?
+	Must allow for multiple locks properly - one unlock per lock. Underflow check.

+	Standard zone palette lookup table functions for actor shading.
+	UnrealEd with cache locking.

+	Is TexSetup doing unnecessary cache lookups?
+	FGlobalSpanTextureMapper::SetupForPoly needs to hold lock.

+	Get rid of GBlit.Setup stuff, use ITexture instead (somehow).
+	Get proper zone lighting table for actors.
+	Check !!
+	Compute and show fps even if stats not defined.

+	UnrealEd
+		PF_Gouraud
+		Version
+		Results window - move down.
+		curved stair text
+		Isn't going to default category on select anymore?

X	Add more noise to mips to hide shadow flaws.

X		AllowEdit, PreventEdit in scripts to retract/publish parent properties
X		Use saved last-CacheIDs
+		Proper cache item locking/unlocking
X		Need 'update zones' button
X		Semisolid -> 'detail' brush, allow subtractive?
+		Build and merge creature clipping span buffer as filter through BSP
+		Draw polys clipped to span, with 2-pass setup

+		Zone fog enabling, use existing ambient and nonambient parameters.
+	Fix player standing on moving brushes that rotate
+		Test touch/untouch carefully
+		The moving brushes sometimes disappear (when frame 0)?
+		The moving brushes disapppear when in same plane of Zone Portal?
+		Compute all light brightnesses once per frame, and share them
+	Implement NF_SEE_THROUGH, NF_SHOOT_THROUGH
+		Pause key & menu option FUnreal.Pause, IsPaused() (Mark did this)
+		Collision exclusion (blocks monsters, only triggered by players, only hit by projectiles)
+			(Mark did this)
+		Touch detection bugs - fixed a while ago
+		Object cache size impact on performance -> if working set exceeds cache size
+			then thrashing is the least of your problems.

+		Actor variables
+			ScriptCountdown for slow script execution
+			TimerCountdown for the user timer
X		Preload fire/alpha palettes.

X		Tasks -> No multitasking
X			Separate server task for each level?
X			Separate task for each remote player?
X			Proper player/camera associations in
X				Local server, local client
X				Local server, remote client
X				Remote server, local client
X			No server task in UnrealEd

X		UnrealEd External tools interface -> not very useful
X			Tools interface
X			Example tool
X			Tools documentation

+	Lighting fixes
+		Stat for palette and texture regens
+		Synchronize CloudCast, CloudReflect to backdrop.
+		Fixed cylinder lighting.
+		Make sure not rebuilding meshes unnecessarily.
X		CloudReflect? -> Killed it, didn't work out, new effect coming soon.
+		Cyllinder is static unless otherwise tagged dynamic.
+		Fine tune spotlight class -> Use LightCone! Very cool!
+		Static spotlights & dynamic spotlights.
X		Update brightness via tick, from day & night bright.
+		Count palette regenerates. Is this slowing things down? -> No.

///////////////////////////////////////////////////////////////////////////////
12-4-96

+		New properties: VolumetricRadius, VolumetricBrightness.
X		Investigate overwriting shadow meshes with lighting when possible.
+		New zone inconsistencies.
X		Move LightSqrt to GRender for speed.
+		Investigate second degree interpolation instead of SizeSquared() -> Done!
+		Good default light volumetric properties.
+		All lights act volumetric in fog zones, no special type.
+		Adaptive subdivision criteria in fog zones based on projected light v-radius.
+		Fix fog and ambients not coexisting.
+		WorldRaytraceKey works.

+	>I don't know exactly how to use the brushRaytrace key but it seems to be
+	>broken in 0.83, the brushes always have the lighting of the key "0"
+	Fixed all of this stuff.

+	Efficiency of RLE light mesh encoding vs. bitmask:
+		Timstros: 142K Meshpts, 12K Changes
+		SPQR: 142K/41K
+		Aug: 515K/135K
+		Conclusion: Bitmasks are fine.

///////////////////////////////////////////////////////////////////////////////
12-5-96

+	UnrealEd: When switching actors from zone descriptor to other, doesn't set
+		default category.

+	Subtracting huge brush gives error on EdcamMove - easily repeatable.

+	Sine fx use sine table.

X	Tag moving brush surfaces for relighting when they move (PF_DynamicLight).
X		-> This just exacerbases the lack of dynamic shadows.

+	Fix enviro map water.

+	UnrealEd command line for ignoring registry settings.

+	Rotate actor in UnrealEd set bTempLightingChange for static spotlights but
+		not bTempDynamicLight.

+	Test new .ucx.

+	Don't require .UCX for play.
+	Builtin classes referenced in FGlobalClasses:
+		Actor:				Must be in memory.
+		Camera:				Must be in memory.
+		LevelDescriptor:	Is required.
+		Light:				Editor only.
+		Projectile:			Not needed.
+		Pawn:				Not needed.
+		Human:				Not needed.
+		PlayerStart:		Not needed.
+		Inventory:			Not needed.
+		Weapon:				Not needed.
+		Pickup:				Not needed.
+		Mover:				Not needed.
+		ZoneDescriptor:		Not needed.
+		Ammo:				Not needed.
+		PowerUp:			Not needed.
+	Need: UClass.IsKindOfNamed, UClass.IsNamed (same for AActorBase).

+	Test possession.
+	Test basic gameplay.
+	Fix player scaling.
+	New KillMonsters bug.

+	Documented console commands in Console.txt.

///////////////////////////////////////////////////////////////////////////////
12-6-96

+	Meetings

///////////////////////////////////////////////////////////////////////////////
12-7-96

+	UnBlastC.cpp is overly bright without ASM.
+	Zone building code still isn't quite right (6) -> Fixed it!

+	Legend map:
+		I broke Unlit again.
X		Light numbers are mapped wrong! -> They are ok.
+		Fix spotlight class!
+		New disappearing polys problem is with bounds -> Fixed, was zoning bug.
+		Make Legend map work in 0.84 properly!
+		Panning >256? No. Keep textures <256x256 if you want to pan them. That's final.

///////////////////////////////////////////////////////////////////////////////
12-8-96

+	Mult shared sides = due to microslivers!
+	Opt geom after zoning?
+	Fixed that awful light edge bug.

+	MergeZonePortals should be redundent.

///////////////////////////////////////////////////////////////////////////////
12-9-96

X	Handle bTempLightChange for non-visible cached surfs (flush surf from cache!)
X	Lighting change propagation:
X		Set bTempLightChange in:
X			UnActLst.cpp (editing actor)
X		MakeCacheID(CID_ResultantMap,iLightMesh); <- How to change?
X		MakeCacheID(CID_StaticMap,iLightMesh); <- How to change?
X		MakeCacheID(CID_IlluminationMap,iLightMesh,Info-FirstLight); <- Could replace w/ iActor.
X		Zone palettes & zone scalers <- Easy enough.
X	Can do all of this later via update tagging.

X	Reintegrate creature dithering -> Later, will rewrite.

X	Wielding process often misses lots of sides. -> Expand later in gameopt rebuilder.

+	Internal fixes
+		Crashes with stats on when you make the window really small.
+		Resource services: Purge & display output, memory used by resource type & total.
+		Figure out Unreal and UnrealEd working set sizes.

+	Count items in cache.

+	Fixed Legend mesh import bug (was an overflow).
+	Fix busted timer in Win95.
+	Flush when change cdepth.

+	Unreal 0.84 prerelease.
+		Test import & rebuild.
+		UnrealEd sanity check.

///////////////////////////////////////////////////////////////////////////////
12-10-96

+	No .htm file, launch URL directly.
+	Kill screenshot key.

+	One cannot import a .3d file (from James' tool) into UnrealEd  if the .3d file 
+	is read-only. Makes storing .3d files in SourceSafe inconvenient. meshImport() 
+	opens the file with "r+b" permission which fails, though I don't think the .3d 
+	is ever modified. You might want to change it in the original source. -> Fixed.
+	Kill launch web.

+	Flame:
+	Light steady
+	Effect Fire Waver
+	Light Brightness 40
+	Light Radius 32

+	Fix ver - says 0.85.
+	VB remove unneeded control associations.
X	Set version number to autoincrement -> Couldn't find an option for this.
+	Downgrade to VC++ 4.0. :(
+	UNREAL.EXE
+	Make comprehensive file list.

X	Legend mesh backfacing problem -> This is not a bug, there's nothing
X	texture mapped on his back. Just texture map his back.

+	ddExit no fail if crashing.
+	Mesh viewer contents has zone or backdrop tint.

+	Unreal 0.84 release
+		UnrealEd installation & test on clean system.
+		Unreal installation.
+		Graphics directory.
+		Models directory.
+		Classes directory.
+		UnSrc installation (include Gate).

///////////////////////////////////////////////////////////////////////////////
Major changes from 0.83 to 0.84:

Actor properties:
	* Setting bNoSmoth=True turns off dithering of the actor's mesh.

Rendering:
	* Creatures and sprites now render in 8, 16, and 32-bit color.
	* Volumetric fog now works. This is somewhat limited in its current incarnation
	  and only works decently in small levels. On non-MMX machines, fog and shadows
	  won't coexist so use for zone sparingly.
	* Cool new backdrop code: go into "Level Properties" to fool around with the sky
	  properties. Everything is very versatile now.
	* Static and dynamic spotlights are now supported, with adjustable beam width.
	* Fixed all known portal bugs.
	* New Cylinder lights - great for placing near light textures on walls.

Optimizations:
	* Rewrote and optimized caching.
	* Optimized a lot of the dynamic lighting code, but many more optimizations remain.
	* Fixed major problem that caused 8-bit color to be extremely slow.

UnrealEd:
	* Check out the cool new "Level Properties" options!
     	* In the 'surface properties' popup, 'editor' tab, you can see how many static and dynamic lights are incident on the surfaces you have selected, as well as the amount of memory 
     	  occupied by the light meshes.
	* The world now starts out "filled" and you begin level building by subtracting
	  rather than adding. This shouldn't impact any existing maps (you can just
	  delete your world cubes now).
	* New "Level Properties" dialog.
	* Run UnrealEd with the parameter "Reset", i.e. "UnrealEd RESET", to
	  reset all of your settings to their defaults. Useful if your settings
	  get corrupted somehow.
	* Show-radii modes now shows collision and light radii.
     	* Fixed major bug in portals that are flush with other surfaces in the world. Coplanar portals are now ok, and more efficient than non-flush portals.

Level design recommendations:
	* Don't cut holes in the floor, ceiling, and walls for your moving brushes to
	  go into. This adds a lot of polygons and messes up collision. The better
	  approach is to design your moving brushes so that they never go completely
	  through the wall. That way, they look physically realistic, and they don't
	  require extra polygons.
	Use low shadow detail everywhere you can, especially in large areas.
	    Shadowing/lighting time is killing performance in a lot of our levels.

Limitations:
	* Fog zones don't mix properly with:
	  - Portals to non-fog zones.
	  - The sky.
	  - Environment mapped water.
	  This is a general limitation with the fogging method on non-MMX machines and
	  this is not going to change, so restrict levels accordingly.

Known problems:
	* When you reimport maps in 0.84, you will need to manually reset the "Event"
	  properties of all of your triggers and moving brushes which trigger other
	  properties. Alternatively: If you have a lot of triggers, that would be a
	  pain, so you can update your .t3d file manually. Just:
	  1. Edit your *.t3d file with Notepad or Wordpad.
	  2. Replace all occurances of "EventName=" with "Event=".
      3. Save it.
	  4. Import it.
	* Player collision is still sloppy.
	* The player jumping and rotation controls aren't scaled well.
	* Texture mapping and visibility code needs major optimizations.
	* I haven't integrated with the new version of the sound system, so sound
	  support is the same (still limited) as 0.83. I'll have an update soon
	  once I've merged Ammon's latest code into 0.84.
	* Creature drawing code needs major optimizations.
	* UnrealEd is still quite the memory hog. If you get messages like
	  "Unreal has run out of virtual memory; you need to free up more hard disk space"
	  then that means, surprise! Unreal has run out of memory; you need to free up
	  more hard disk space. This is not a bug.
	* Creatures are always unlit. Creature lighting will be back later.
	* Transparent and masked textures don't display in most video modes. They will be 
	  back much later.

I will attend to the above once scripting is done.  I want to get the engine 
feature complete first, and then work on perfecting it, so that we can all get the 
most work done in parallel. Otherwise we'll be 6 months down the road and have the 
fastest rendering and physics engine around but no game elements and scripting 
language.  The current approach is the lesser of the two evils...

///////////////////////////////////////////////////////////////////////////////

	Map edit "To brush" causes brush to max out! Thanx for finding this Danc.
	Scripting prep.
		Cleanse Game.
		UnRandom.h.
		Input system.

	Later
		Light rect regions for small dynamic lights.
		Sporadic collision fragments.
		Merge world and creature rendering code? With fog?
		Creature vertex shading.
		Using a fractional coherent beam bundle filter would be best for avoiding shadow aliasing?
		Replace UTexture::GetData, UTexture::GetOriginalData with UTexture::Lock,
			only lock mipmaps once! Eliminate mips from GBlit. Update rendDrawAcrossSetup.


///////////////////////////////////////////////////////////////////////////////
