***** "Classic" B&B ***** For each of the core map data types (points, lines, sides, polys) you have a second array of "inserts". These function to hold the re-added sections in each one. Each insert has an (integer) element which is the index of the next insert of that type for the object it applies to or NONE if it is the last one. Points and inserts hold simply a top and bottom. Side inserts have a top and bottom height, and also texture and light information. Polygon inserts have a top and bottom height and texture and light information for each. The map data is also modified as follows: Points, lines, sides and polygons get a new (integer) element which is the index of the first insert in that object or NONE. The player motion and collision functions are modified to use the highest floor and lowest ceiling around the player's center. The rasterizer is modified to draw polygon insert's tops and bottoms and side inserts in the appropriate places. Moving inserts are accomplished by the use of "attachables" and "attachments". Liquids and platforms are made subclasses of 'attachable', which has an API to add an attachment. All the insert types are given their own attachment subclass. To attach an insert to an object a new object of the appropriate attachment subclass is created and it's variables assigned to point to the insert, it is then passed through the API of the desired attachment. ***** "Modern" B&B ***** Sides are replaced entirely with "wall segments" which have the ability to have their top and bottom edges be diagonal (for shadow and fancy texture effects, this is TRIVIAL to implement in rasterization). The classic polygon and line are slimmed down to simply vertex and line/polygon links, and an index into the polygon/line space array. It also has accessors to get the floor/ceiling around a given height. Polygon/line inserts are replaced with polygon/line spaces, containing a top and bottom height/texture/light, and now represent negative space. They have arrays of the polygon and line space(s) on each side of them. In vising, nodes are generated for each polygon space visible, and then sorted using the old-style polygon data. My new vis code is set up to handle this with minimal modifications. Also in partially in my new vis code (but untested) is support for portals, 'cause who doesn't like some good non-Cartesian map geometry every once in a while? :) If you have any additional questions about how any of this would work (but not about why I'm not doing it myself), feel free to email me.