Listing 1

global D3D_WORLD

on ghCameraStartup
  vPos = vector(0,0,0) --default lookAt position
  vUp =  vector(0,1,0) --default up vector

  D3D_WORLD[#g_3DWorld] = member("WORLD")  -- castmember of the WORLD

  --default camera
  D3D_WORLD[#g_Camera] = D3D_WORLD[#g_3DWorld].camera(1)
  
  --set initial position
  D3D_WORLD[#g_3DWorld].cameraPosition = vector(0,0,1000)
  
  --look at the default lookAt position
  D3D_WORLD[#g_Camera].pointAt(vPos, vUp)
  
  --rotate up to stare 'down' at our game world
  D3D_WORLD[#g_Camera].rotate(-90,0,0,#world)
  
  --make global camera ortho
  --(render groups can be either ortho or perspective, not to worry)
  D3D_WORLD[#g_Camera].projection = #orthographic
  D3D_WORLD[#g_Camera].orthoHeight = (D3D_WORLD[#g_iWorldHeight])
  D3D_WORLD[#g_Camera].rect = rect(0,0,D3D_WORLD[#g_iWorldWidth], \
  D3D_WORLD[#g_iWorldHeight])
  
end ghCameraStartup

Listing 2: Calls to set up initial render groups

on ghSetupRenderGroups
  --setup a manager for Render Groups
  D3D_WORLD[#g_oRenderGroupMgr] = script("RENDER_GROUP_MGR").new()
  
  --create the basic render groups
  D3D_WORLD[#g_oRenderGroupMgr].mAddRenderGroup("GROUND"    )
  D3D_WORLD[#g_oRenderGroupMgr].mAddRenderGroup("WEAPONS"   )
  D3D_WORLD[#g_oRenderGroupMgr].mAddRenderGroup("OBJECTS"   )
  D3D_WORLD[#g_oRenderGroupMgr].mAddRenderGroup("EXPLOSIONS")
  D3D_WORLD[#g_oRenderGroupMgr].mAddRenderGroup("WINDOWS"   )
  
  --explicitly set the window camera to ortho
  D3D_WORLD[#g_oRenderGroupMgr].mGetRenderGroup("WINDOWS").mToggleCameraOrtho(TRUE)
end ghSetupRenderGroups


Listing 3: Render Group Manager (a glorified property list)

property p_plRenderGroups

--create a new render group manager
--and store a propList of render groups to manage
on new me
  p_plRenderGroups = [:]
  return me
end new

on mAddRenderGroup me, a_sName
  --create render group and add it to internal list
  oRenderGrp = script("RENDER_GROUP").new("RG_" & a_sName)
  p_plRenderGroups.addProp(a_sName, oRenderGrp)
  
end mAddRenderGroup me


--get a specific render group by name from the manager
on mGetRenderGroup me, a_sName
  return p_plRenderGroups.getProp(a_sName)
end mGetRenderGroup

Listing 4: The Render Group object

-------------------------------------------------------
--  RENDER_GROUP
-------------------------------------------------------

global D3D_WORLD

property p_sName
property p_camCamera
property p_grpRenderGroup

on new me, a_sName
  p_sName = a_sName
  
  --make the render group
  p_grpRenderGroup = D3D_WORLD[#g_3DWorld].newGroup(p_sName)
  
  --void its parent
  p_grpRenderGroup.parent = void
  
  --create a camera
  --we clone the main scene camera if it has no children,
  --otherwise we clone the last child.  We have to avoid
  --cloning a camera that already has children.
  if D3D_WORLD[#g_Camera].child.count = 0 then
    p_camCamera = D3D_WORLD[#g_Camera].clone(p_sName & "_cam")
  else
    p_camCamera = D3D_WORLD[#g_Camera].child[D3D_WORLD[#g_Camera \
                  ].child.count].clone(p_sName & "_cam")
  end if
  
  --don't let them clear each other's color buffers
  p_camCamera.colorBuffer.clearAtRender = FALSE
  
  --group camera with the renderGroup
  p_camCamera.rootNode = p_grpRenderGroup
  
  iCurNumRenderGroups = D3D_WORLD[#g_3DWorld].cameraCount()
  --add camera to the world
  D3D_WORLD[#g_sprWorldSprite].addCamera(p_camCamera, iCurNumRenderGroups+1)
  D3D_WORLD[#g_sprWorldSprite].camera(2).rect = rect( \
  0,0, D3D_WORLD[#g_iWorldWidth ], D3D_WORLD[#g_iWorldHeight])
  
  --link camera to the "real" one
  p_camCamera.parent = D3D_WORLD[#g_Camera]
  p_camCamera.transform = transform()
  
  return me
end new

on mToggleCameraOrtho me, a_bIsOrtho
  if a_bIsOrtho then
    --setup for orthographic projection
    p_camCamera.projection = #orthographic
    p_camCamera.orthoHeight =  (D3D_WORLD[#g_iWorldHeight])
    p_camCamera.rect = rect(0,0,D3D_WORLD[#g_iWorldWidth ], \
    D3D_WORLD[#g_iWorldHeight])
  else
    --setup for "real 3D" projection
    p_camCamera.projection = #perspective
    p_camCamera.rect = rect(0,0,D3D_WORLD[#g_iWorldWidth ], \
    D3D_WORLD[#g_iWorldHeight])
  end if
end mToggleCameraOrtho

--add a light to this render group
on mAddLight me, a_ltLight
  a_ltLight.parent = p_grpRenderGroup
end mAddLight

--remove a light from this render group
on mSubLight me, a_ltLight
  a_ltLight.parent = void
end mSubLight

--add a light to this render group by name
on mAddLightByName me, a_sLightName
  D3D_WORLD[#g_3DWorld].light(a_sLightName).parent = p_grpRenderGroup
end mAddLight

--remove a light from this render group by name
on mSubLightByName me, a_sLightName
  D3D_WORLD[#g_3DWorld].light(a_sLightName).parent = void
end mSubLightByName

--add a model to this render group by name
on mAddModelByName me, a_sModelName
  D3D_WORLD[#g_3DWorld].model(a_sModelName).parent = p_grpRenderGroup
end mAddModelByName

--remove a model from this render group by name
on mSubModelByName me, a_sModelName
  D3D_WORLD[#g_3DWorld].model(a_sModelName).parent = void
end mSubModelByName

--add a model to this render group
on mAddModel me, a_mModel
  a_mModel.parent = p_grpRenderGroup
end mAddModel

--remove a model from this render group
on mSubModel me, a_mModel
  a_mModel.parent = void
end mSubModel

--add a group to this render group by name
on mAddGroupByName me, a_sGroupName
  D3D_WORLD[#g_3DWorld].group(a_sGroupName).parent = p_grpRenderGroup
end mAddGroup

--remove a group from this render group by name
on mSubGroupByName me, a_sGroupName
  D3D_WORLD[#g_3DWorld].group(a_sGroupName).parent = void
end mSubGroup

--add a group to this render group
on mAddGroup me, a_grpGroup
  a_grpGroup.parent = p_grpRenderGroup
end mAddGroup

--remove a group from this render group
on mSubGroup me, a_grpGroup
  a_grpGroup.parent = void
end mSubGroup

--get a handle to the camera for this render group
on mGetCamera me
  return p_camCamera
end mGetCamera

Listing 5

  --create a model resource
  mrSphere = D3D_WORLD[#g_3DWorld].newModelResource("SphereMR01", #sphere)
  --create a model
  mSphere = D3D_WORLD[#g_3DWorld].newModel("SphereM01", mrSphere)
  --add the model to a specific render group created in ghSetupRenderGroups
  D3D_WORLD[#g_oRenderGroupMgr].mGetRenderGroup("GROUND").mAddModel(mSphere)