Explorar el Código

Initial parts of SceneRenderer (forward lighting)

seanpaultaylor hace 12 años
padre
commit
b18cc5a0f7

+ 7 - 0
gameplay/gameplay.vcxproj

@@ -314,6 +314,8 @@
     <ClCompile Include="src\RenderTarget.cpp" />
     <ClCompile Include="src\Scene.cpp" />
     <ClCompile Include="src\SceneLoader.cpp" />
+    <ClCompile Include="src\SceneRenderer.cpp" />
+    <ClCompile Include="src\SceneRendererForward.cpp" />
     <ClCompile Include="src\ScreenDisplayer.cpp" />
     <ClCompile Include="src\ScriptController.cpp" />
     <ClCompile Include="src\ScriptTarget.cpp" />
@@ -341,6 +343,7 @@
     <ClCompile Include="src\VertexAttributeBinding.cpp" />
     <ClCompile Include="src\VertexFormat.cpp" />
     <ClCompile Include="src\VerticalLayout.cpp" />
+    <ClCompile Include="src\VisibleSetDefault.cpp" />
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="src\AbsoluteLayout.h" />
@@ -603,6 +606,8 @@
     <ClInclude Include="src\RenderTarget.h" />
     <ClInclude Include="src\Scene.h" />
     <ClInclude Include="src\SceneLoader.h" />
+    <ClInclude Include="src\SceneRenderer.h" />
+    <ClInclude Include="src\SceneRendererForward.h" />
     <ClInclude Include="src\ScreenDisplayer.h" />
     <ClInclude Include="src\ScriptController.h" />
     <ClInclude Include="src\ScriptTarget.h" />
@@ -634,6 +639,8 @@
     <ClInclude Include="src\VertexAttributeBinding.h" />
     <ClInclude Include="src\VertexFormat.h" />
     <ClInclude Include="src\VerticalLayout.h" />
+    <ClInclude Include="src\VisibleSet.h" />
+    <ClInclude Include="src\VisibleSetDefault.h" />
   </ItemGroup>
   <ItemGroup>
     <None Include="res\logo_black.png" />

+ 355 - 334
gameplay/gameplay.vcxproj.filters

@@ -18,78 +18,12 @@
     </Filter>
   </ItemGroup>
   <ItemGroup>
-    <ClCompile Include="src\Animation.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\AnimationClip.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\AnimationController.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\AnimationValue.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\BoundingBox.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\BoundingSphere.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\Camera.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\Curve.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\Effect.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\FileSystem.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\Font.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\Frustum.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\Game.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\Light.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\Matrix.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\Mesh.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\MeshPart.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\MeshSkin.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\Model.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\Node.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
     <ClCompile Include="src\Plane.cpp">
       <Filter>src</Filter>
     </ClCompile>
-    <ClCompile Include="src\gameplay-main-blackberry.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
     <ClCompile Include="src\PlatformBlackBerry.cpp">
       <Filter>src</Filter>
     </ClCompile>
-    <ClCompile Include="src\gameplay-main-windows.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
     <ClCompile Include="src\PlatformWindows.cpp">
       <Filter>src</Filter>
     </ClCompile>
@@ -132,36 +66,12 @@
     <ClCompile Include="src\VertexFormat.cpp">
       <Filter>src</Filter>
     </ClCompile>
-    <ClCompile Include="src\AudioController.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\AudioListener.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\AudioSource.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\AudioBuffer.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\AnimationTarget.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\MaterialParameter.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\Joint.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
     <ClCompile Include="src\ParticleEmitter.cpp">
       <Filter>src</Filter>
     </ClCompile>
     <ClCompile Include="src\Properties.cpp">
       <Filter>src</Filter>
     </ClCompile>
-    <ClCompile Include="src\Material.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
     <ClCompile Include="src\Technique.cpp">
       <Filter>src</Filter>
     </ClCompile>
@@ -171,9 +81,6 @@
     <ClCompile Include="src\RenderState.cpp">
       <Filter>src</Filter>
     </ClCompile>
-    <ClCompile Include="src\DebugNew.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
     <ClCompile Include="src\PhysicsController.cpp">
       <Filter>src</Filter>
     </ClCompile>
@@ -201,45 +108,15 @@
     <ClCompile Include="src\SceneLoader.cpp">
       <Filter>src</Filter>
     </ClCompile>
-    <ClCompile Include="src\Image.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
     <ClCompile Include="src\RenderTarget.cpp">
       <Filter>src</Filter>
     </ClCompile>
-    <ClCompile Include="src\FrameBuffer.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\DepthStencilTarget.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\MeshBatch.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\gameplay-main-android.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
     <ClCompile Include="src\PlatformAndroid.cpp">
       <Filter>src</Filter>
     </ClCompile>
     <ClCompile Include="src\AbsoluteLayout.cpp">
       <Filter>src</Filter>
     </ClCompile>
-    <ClCompile Include="src\Button.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\CheckBox.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\Container.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\Control.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\Label.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
     <ClCompile Include="src\RadioButton.cpp">
       <Filter>src</Filter>
     </ClCompile>
@@ -249,9 +126,6 @@
     <ClCompile Include="src\VerticalLayout.cpp">
       <Filter>src</Filter>
     </ClCompile>
-    <ClCompile Include="src\Form.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
     <ClCompile Include="src\Theme.cpp">
       <Filter>src</Filter>
     </ClCompile>
@@ -273,18 +147,6 @@
     <ClCompile Include="src\ThemeStyle.cpp">
       <Filter>src</Filter>
     </ClCompile>
-    <ClCompile Include="src\Layout.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\Bundle.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\FlowLayout.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\Joystick.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
     <ClCompile Include="src\ScriptController.cpp">
       <Filter>src</Filter>
     </ClCompile>
@@ -618,9 +480,6 @@
     <ClCompile Include="src\lua\lua_Gamepad.cpp">
       <Filter>src\lua</Filter>
     </ClCompile>
-    <ClCompile Include="src\Gamepad.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
     <ClCompile Include="src\ScreenDisplayer.cpp">
       <Filter>src</Filter>
     </ClCompile>
@@ -744,12 +603,6 @@
     <ClCompile Include="src\AIMessage.cpp">
       <Filter>src</Filter>
     </ClCompile>
-    <ClCompile Include="src\AIState.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\AIStateMachine.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
     <ClCompile Include="src\lua\lua_AIAgent.cpp">
       <Filter>src\lua</Filter>
     </ClCompile>
@@ -780,9 +633,6 @@
     <ClCompile Include="src\lua\lua_ScriptTarget.cpp">
       <Filter>src\lua</Filter>
     </ClCompile>
-    <ClCompile Include="src\gameplay-main-linux.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
     <ClCompile Include="src\PlatformLinux.cpp">
       <Filter>src</Filter>
     </ClCompile>
@@ -804,12 +654,6 @@
     <ClCompile Include="src\lua\lua_PhysicsVehicleWheel.cpp">
       <Filter>src\lua</Filter>
     </ClCompile>
-    <ClCompile Include="src\MathUtil.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
-    <ClCompile Include="src\Logger.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
     <ClCompile Include="src\lua\lua_LoggerLevel.cpp">
       <Filter>src\lua</Filter>
     </ClCompile>
@@ -834,18 +678,12 @@
     <ClCompile Include="src\lua\lua_RenderStateDepthFunction.cpp">
       <Filter>src\lua</Filter>
     </ClCompile>
-    <ClCompile Include="src\HeightField.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
     <ClCompile Include="src\lua\lua_HeightField.cpp">
       <Filter>src\lua</Filter>
     </ClCompile>
     <ClCompile Include="src\Platform.cpp">
       <Filter>src</Filter>
     </ClCompile>
-    <ClCompile Include="src\ImageControl.cpp">
-      <Filter>src</Filter>
-    </ClCompile>
     <ClCompile Include="src\lua\lua_ImageControl.cpp">
       <Filter>src\lua</Filter>
     </ClCompile>
@@ -888,78 +726,183 @@
     <ClCompile Include="src\SocialSessionListener.cpp">
       <Filter>src</Filter>
     </ClCompile>
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="src\Animation.h">
+    <ClCompile Include="src\AIState.cpp">
       <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\AnimationClip.h">
+    </ClCompile>
+    <ClCompile Include="src\AIStateMachine.cpp">
       <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\AnimationController.h">
+    </ClCompile>
+    <ClCompile Include="src\Animation.cpp">
       <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\AnimationTarget.h">
+    </ClCompile>
+    <ClCompile Include="src\AnimationClip.cpp">
       <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\AnimationValue.h">
+    </ClCompile>
+    <ClCompile Include="src\AnimationController.cpp">
       <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\Base.h">
+    </ClCompile>
+    <ClCompile Include="src\AnimationTarget.cpp">
       <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\BoundingBox.h">
+    </ClCompile>
+    <ClCompile Include="src\AnimationValue.cpp">
       <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\BoundingSphere.h">
+    </ClCompile>
+    <ClCompile Include="src\AudioBuffer.cpp">
       <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\Camera.h">
+    </ClCompile>
+    <ClCompile Include="src\AudioController.cpp">
       <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\Curve.h">
+    </ClCompile>
+    <ClCompile Include="src\AudioListener.cpp">
       <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\Effect.h">
+    </ClCompile>
+    <ClCompile Include="src\AudioSource.cpp">
       <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\FileSystem.h">
+    </ClCompile>
+    <ClCompile Include="src\BoundingBox.cpp">
       <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\Font.h">
+    </ClCompile>
+    <ClCompile Include="src\BoundingSphere.cpp">
       <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\Frustum.h">
+    </ClCompile>
+    <ClCompile Include="src\Bundle.cpp">
       <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\Game.h">
+    </ClCompile>
+    <ClCompile Include="src\Button.cpp">
       <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\gameplay.h">
+    </ClCompile>
+    <ClCompile Include="src\Camera.cpp">
       <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\Light.h">
+    </ClCompile>
+    <ClCompile Include="src\CheckBox.cpp">
       <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\Matrix.h">
+    </ClCompile>
+    <ClCompile Include="src\Container.cpp">
       <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\Mesh.h">
+    </ClCompile>
+    <ClCompile Include="src\Control.cpp">
       <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\MeshPart.h">
+    </ClCompile>
+    <ClCompile Include="src\Curve.cpp">
       <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\MeshSkin.h">
+    </ClCompile>
+    <ClCompile Include="src\DebugNew.cpp">
       <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\Model.h">
+    </ClCompile>
+    <ClCompile Include="src\DepthStencilTarget.cpp">
       <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\Node.h">
+    </ClCompile>
+    <ClCompile Include="src\Effect.cpp">
       <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\Plane.h">
+    </ClCompile>
+    <ClCompile Include="src\FileSystem.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\FlowLayout.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\Font.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\Form.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\FrameBuffer.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\Frustum.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\Game.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\Gamepad.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\gameplay-main-android.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\gameplay-main-blackberry.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\gameplay-main-linux.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\gameplay-main-windows.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\HeightField.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\Image.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\ImageControl.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\Joint.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\Joystick.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\Label.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\Layout.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\Light.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\Logger.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\Material.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\MaterialParameter.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\MathUtil.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\Matrix.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\Mesh.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\MeshBatch.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\MeshPart.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\MeshSkin.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\Model.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\Node.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\SceneRendererForward.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\SceneRenderer.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+    <ClCompile Include="src\VisibleSetDefault.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="src\Node.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\Plane.h">
       <Filter>src</Filter>
     </ClInclude>
     <ClInclude Include="src\Platform.h">
@@ -1004,33 +947,12 @@
     <ClInclude Include="src\VertexFormat.h">
       <Filter>src</Filter>
     </ClInclude>
-    <ClInclude Include="src\AudioController.h">
-      <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\AudioListener.h">
-      <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\AudioSource.h">
-      <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\AudioBuffer.h">
-      <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\MaterialParameter.h">
-      <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\Joint.h">
-      <Filter>src</Filter>
-    </ClInclude>
     <ClInclude Include="src\ParticleEmitter.h">
       <Filter>src</Filter>
     </ClInclude>
     <ClInclude Include="src\Properties.h">
       <Filter>src</Filter>
     </ClInclude>
-    <ClInclude Include="src\Material.h">
-      <Filter>src</Filter>
-    </ClInclude>
     <ClInclude Include="src\Technique.h">
       <Filter>src</Filter>
     </ClInclude>
@@ -1040,9 +962,6 @@
     <ClInclude Include="src\RenderState.h">
       <Filter>src</Filter>
     </ClInclude>
-    <ClInclude Include="src\DebugNew.h">
-      <Filter>src</Filter>
-    </ClInclude>
     <ClInclude Include="src\PhysicsController.h">
       <Filter>src</Filter>
     </ClInclude>
@@ -1070,51 +989,15 @@
     <ClInclude Include="src\SceneLoader.h">
       <Filter>src</Filter>
     </ClInclude>
-    <ClInclude Include="src\Image.h">
-      <Filter>src</Filter>
-    </ClInclude>
     <ClInclude Include="src\RenderTarget.h">
       <Filter>src</Filter>
     </ClInclude>
-    <ClInclude Include="src\FrameBuffer.h">
-      <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\DepthStencilTarget.h">
-      <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\Keyboard.h">
-      <Filter>src</Filter>
-    </ClInclude>
     <ClInclude Include="src\Touch.h">
       <Filter>src</Filter>
     </ClInclude>
-    <ClInclude Include="src\MeshBatch.h">
-      <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\Mouse.h">
-      <Filter>src</Filter>
-    </ClInclude>
     <ClInclude Include="src\AbsoluteLayout.h">
       <Filter>src</Filter>
     </ClInclude>
-    <ClInclude Include="src\Button.h">
-      <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\CheckBox.h">
-      <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\Container.h">
-      <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\Control.h">
-      <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\Label.h">
-      <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\Layout.h">
-      <Filter>src</Filter>
-    </ClInclude>
     <ClInclude Include="src\RadioButton.h">
       <Filter>src</Filter>
     </ClInclude>
@@ -1124,9 +1007,6 @@
     <ClInclude Include="src\VerticalLayout.h">
       <Filter>src</Filter>
     </ClInclude>
-    <ClInclude Include="src\Form.h">
-      <Filter>src</Filter>
-    </ClInclude>
     <ClInclude Include="src\Theme.h">
       <Filter>src</Filter>
     </ClInclude>
@@ -1154,18 +1034,6 @@
     <ClInclude Include="src\ThemeStyle.h">
       <Filter>src</Filter>
     </ClInclude>
-    <ClInclude Include="src\Bundle.h">
-      <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\FlowLayout.h">
-      <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\Joystick.h">
-      <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\MathUtil.h">
-      <Filter>src</Filter>
-    </ClInclude>
     <ClInclude Include="src\ScriptController.h">
       <Filter>src</Filter>
     </ClInclude>
@@ -1499,9 +1367,6 @@
     <ClInclude Include="src\lua\lua_Gamepad.h">
       <Filter>src\lua</Filter>
     </ClInclude>
-    <ClInclude Include="src\Gamepad.h">
-      <Filter>src</Filter>
-    </ClInclude>
     <ClInclude Include="src\lua\lua_AnimationClipListenerEventType.h">
       <Filter>src\lua</Filter>
     </ClInclude>
@@ -1613,21 +1478,12 @@
     <ClInclude Include="src\lua\lua_VertexFormatUsage.h">
       <Filter>src\lua</Filter>
     </ClInclude>
-    <ClInclude Include="src\AIStateMachine.h">
-      <Filter>src</Filter>
-    </ClInclude>
     <ClInclude Include="src\AIAgent.h">
       <Filter>src</Filter>
     </ClInclude>
     <ClInclude Include="src\AIController.h">
       <Filter>src</Filter>
     </ClInclude>
-    <ClInclude Include="src\AIMessage.h">
-      <Filter>src</Filter>
-    </ClInclude>
-    <ClInclude Include="src\AIState.h">
-      <Filter>src</Filter>
-    </ClInclude>
     <ClInclude Include="src\lua\lua_AIAgent.h">
       <Filter>src\lua</Filter>
     </ClInclude>
@@ -1658,9 +1514,6 @@
     <ClInclude Include="src\lua\lua_ScriptTarget.h">
       <Filter>src\lua</Filter>
     </ClInclude>
-    <ClInclude Include="src\Gesture.h">
-      <Filter>src</Filter>
-    </ClInclude>
     <ClInclude Include="src\lua\lua_Gesture.h">
       <Filter>src\lua</Filter>
     </ClInclude>
@@ -1679,9 +1532,6 @@
     <ClInclude Include="src\lua\lua_PhysicsVehicleWheel.h">
       <Filter>src\lua</Filter>
     </ClInclude>
-    <ClInclude Include="src\Logger.h">
-      <Filter>src</Filter>
-    </ClInclude>
     <ClInclude Include="src\lua\lua_Logger.h">
       <Filter>src\lua</Filter>
     </ClInclude>
@@ -1709,15 +1559,9 @@
     <ClInclude Include="src\lua\lua_RenderStateDepthFunction.h">
       <Filter>src\lua</Filter>
     </ClInclude>
-    <ClInclude Include="src\HeightField.h">
-      <Filter>src</Filter>
-    </ClInclude>
     <ClInclude Include="src\lua\lua_HeightField.h">
       <Filter>src\lua</Filter>
     </ClInclude>
-    <ClInclude Include="src\ImageControl.h">
-      <Filter>src</Filter>
-    </ClInclude>
     <ClInclude Include="src\lua\lua_ImageControl.h">
       <Filter>src\lua</Filter>
     </ClInclude>
@@ -1763,17 +1607,185 @@
     <ClInclude Include="src\SocialChallenge.h">
       <Filter>src</Filter>
     </ClInclude>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="src\Game.inl">
+    <ClInclude Include="src\SceneRenderer.h">
       <Filter>src</Filter>
-    </None>
-    <None Include="src\Image.inl">
+    </ClInclude>
+    <ClInclude Include="src\AIMessage.h">
       <Filter>src</Filter>
-    </None>
-    <None Include="src\MeshBatch.inl">
+    </ClInclude>
+    <ClInclude Include="src\AIState.h">
       <Filter>src</Filter>
-    </None>
+    </ClInclude>
+    <ClInclude Include="src\AIStateMachine.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\Animation.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\AnimationClip.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\AnimationController.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\AnimationTarget.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\AnimationValue.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\AudioBuffer.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\AudioController.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\AudioListener.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\AudioSource.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\Base.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\BoundingBox.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\BoundingSphere.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\Bundle.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\Button.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\Camera.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\CheckBox.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\Container.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\Control.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\Curve.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\DebugNew.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\DepthStencilTarget.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\Effect.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\FileSystem.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\FlowLayout.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\Font.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\Form.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\FrameBuffer.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\Frustum.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\Game.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\Gamepad.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\gameplay.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\Gesture.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\HeightField.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\Image.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\ImageControl.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\Joint.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\Joystick.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\Keyboard.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\Label.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\Layout.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\Light.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\Logger.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\Material.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\MaterialParameter.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\MathUtil.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\Matrix.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\Mesh.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\MeshBatch.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\MeshPart.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\MeshSkin.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\Model.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\Mouse.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\SceneRendererForward.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\VisibleSet.h">
+      <Filter>src</Filter>
+    </ClInclude>
+    <ClInclude Include="src\VisibleSetDefault.h">
+      <Filter>src</Filter>
+    </ClInclude>
+  </ItemGroup>
+  <ItemGroup>
     <None Include="res\logo_black.png">
       <Filter>res</Filter>
     </None>
@@ -1786,15 +1798,6 @@
     <None Include="res\logo_white.png">
       <Filter>res</Filter>
     </None>
-    <None Include="src\MathUtil.inl">
-      <Filter>src</Filter>
-    </None>
-    <None Include="src\MathUtilNeon.inl">
-      <Filter>src</Filter>
-    </None>
-    <None Include="src\Joystick.inl">
-      <Filter>src</Filter>
-    </None>
     <None Include="src\ScriptController.inl">
       <Filter>src</Filter>
     </None>
@@ -1879,26 +1882,44 @@
     <None Include="res\shaders\textured-unlit.vert">
       <Filter>res\shaders</Filter>
     </None>
-  </ItemGroup>
-  <ItemGroup>
-    <None Include="src\PhysicsFixedConstraint.inl">
+    <None Include="src\BoundingBox.inl">
       <Filter>src</Filter>
     </None>
-    <None Include="src\BoundingBox.inl">
+    <None Include="src\BoundingSphere.inl">
       <Filter>src</Filter>
     </None>
-    <None Include="src\PhysicsGenericConstraint.inl">
+    <None Include="src\Game.inl">
       <Filter>src</Filter>
     </None>
-    <None Include="src\BoundingSphere.inl">
+    <None Include="src\Image.inl">
       <Filter>src</Filter>
     </None>
-    <None Include="src\PhysicsSpringConstraint.inl">
+    <None Include="src\Joystick.inl">
+      <Filter>src</Filter>
+    </None>
+    <None Include="src\MathUtil.inl">
+      <Filter>src</Filter>
+    </None>
+    <None Include="src\MathUtilNeon.inl">
       <Filter>src</Filter>
     </None>
     <None Include="src\Matrix.inl">
       <Filter>src</Filter>
     </None>
+    <None Include="src\MeshBatch.inl">
+      <Filter>src</Filter>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="src\PhysicsFixedConstraint.inl">
+      <Filter>src</Filter>
+    </None>
+    <None Include="src\PhysicsGenericConstraint.inl">
+      <Filter>src</Filter>
+    </None>
+    <None Include="src\PhysicsSpringConstraint.inl">
+      <Filter>src</Filter>
+    </None>
     <None Include="src\PhysicsRigidBody.inl">
       <Filter>src</Filter>
     </None>

+ 2 - 1
gameplay/src/Form.cpp

@@ -525,7 +525,7 @@ void Form::updateBounds()
     }
 }
 
-void Form::draw()
+unsigned int Form::draw()
 {
     // The first time a form is drawn, its contents are rendered into a framebuffer.
     // The framebuffer will only be drawn into again when the contents of the form change.
@@ -582,6 +582,7 @@ void Form::draw()
         _spriteBatch->draw(_bounds.x, _bounds.y, 0, _bounds.width, _bounds.height, 0, _v1, _u2, 0, Vector4::one());
         _spriteBatch->finish();
     }
+    return 2;
 }
 
 const char* Form::getType() const

+ 1 - 1
gameplay/src/Form.h

@@ -155,7 +155,7 @@ public:
     /**
      * Draws this form.
      */
-    void draw();
+    unsigned int draw();
 
     /**
      * @see Control::getType

+ 58 - 38
gameplay/src/Model.cpp

@@ -10,7 +10,7 @@ namespace gameplay
 {
 
 Model::Model(Mesh* mesh) :
-    _mesh(mesh), _material(NULL), _partCount(0), _partMaterials(NULL), _node(NULL), _skin(NULL)
+    _mesh(mesh), _material(NULL), _partCount(0), _partMaterials(NULL), _node(NULL), _skin(NULL), _shadowCaster(true), _shadowReceiver(true)
 {
     GP_ASSERT(mesh);
     _partCount = mesh->getPartCount();
@@ -256,6 +256,26 @@ void Model::setNode(Node* node)
     }
 }
 
+void Model::setShadowCaster(bool casts)
+{
+    _shadowCaster = casts;
+}
+
+bool Model::isShadowCaster() const
+{
+    return _shadowCaster;
+}
+
+void Model::setShadowReceiver(bool receives)
+{
+    _shadowReceiver = receives;
+}
+
+bool Model::isShadowReceiver() const
+{
+    return _shadowReceiver;
+}
+
 static bool drawWireframe(Mesh* mesh)
 {
     switch (mesh->getPrimitiveType())
@@ -332,7 +352,7 @@ static bool drawWireframe(MeshPart* part)
     }
 }
 
-void Model::draw(bool wireframe)
+unsigned int Model::draw(bool wireframe)
 {
     GP_ASSERT(_mesh);
 
@@ -388,33 +408,34 @@ void Model::draw(bool wireframe)
             }
         }
     }
+    return partCount;
 }
 
-void Model::validatePartCount()
+void Model::setMaterialNodeBinding(Material *material)
 {
-    GP_ASSERT(_mesh);
-    unsigned int partCount = _mesh->getPartCount();
+    GP_ASSERT(material);
 
-    if (_partCount != partCount)
+    if (_node)
     {
-        // Allocate new arrays and copy old items to them.
-        if (_partMaterials)
+        material->setNodeBinding(_node);
+
+        unsigned int techniqueCount = material->getTechniqueCount();
+        for (unsigned int i = 0; i < techniqueCount; ++i)
         {
-            Material** oldArray = _partMaterials;
-            _partMaterials = new Material*[partCount];
-            memset(_partMaterials, 0, sizeof(Material*) * partCount);
-            if (oldArray)
+            Technique* technique = material->getTechniqueByIndex(i);
+            GP_ASSERT(technique);
+            
+            technique->setNodeBinding(_node);
+
+            unsigned int passCount = technique->getPassCount();
+            for (unsigned int j = 0; j < passCount; ++j)
             {
-                for (unsigned int i = 0; i < _partCount; ++i)
-                {
-                    _partMaterials[i] = oldArray[i];
-                }
+                Pass* pass = technique->getPassByIndex(j);
+                GP_ASSERT(pass);
+
+                pass->setNodeBinding(_node);
             }
-            SAFE_DELETE_ARRAY(oldArray);
         }
-
-        // Update local part count.
-        _partCount = _mesh->getPartCount();
     }
 }
 
@@ -458,31 +479,30 @@ Model* Model::clone(NodeCloneContext &context)
     return model;
 }
 
-void Model::setMaterialNodeBinding(Material *material)
+void Model::validatePartCount()
 {
-    GP_ASSERT(material);
+    GP_ASSERT(_mesh);
+    unsigned int partCount = _mesh->getPartCount();
 
-    if (_node)
+    if (_partCount != partCount)
     {
-        material->setNodeBinding(_node);
-
-        unsigned int techniqueCount = material->getTechniqueCount();
-        for (unsigned int i = 0; i < techniqueCount; ++i)
+        // Allocate new arrays and copy old items to them.
+        if (_partMaterials)
         {
-            Technique* technique = material->getTechniqueByIndex(i);
-            GP_ASSERT(technique);
-            
-            technique->setNodeBinding(_node);
-
-            unsigned int passCount = technique->getPassCount();
-            for (unsigned int j = 0; j < passCount; ++j)
+            Material** oldArray = _partMaterials;
+            _partMaterials = new Material*[partCount];
+            memset(_partMaterials, 0, sizeof(Material*) * partCount);
+            if (oldArray)
             {
-                Pass* pass = technique->getPassByIndex(j);
-                GP_ASSERT(pass);
-
-                pass->setNodeBinding(_node);
+                for (unsigned int i = 0; i < _partCount; ++i)
+                {
+                    _partMaterials[i] = oldArray[i];
+                }
             }
+            SAFE_DELETE_ARRAY(oldArray);
         }
+        // Update local part count.
+        _partCount = _mesh->getPartCount();
     }
 }
 

+ 44 - 5
gameplay/src/Model.h

@@ -14,8 +14,7 @@ class Node;
 class NodeCloneContext;
 
 /**
- * Defines a Model which is an instance of a Mesh that can be drawn
- * with the specified Materials.
+ * Defines a Model (MeshRenderer) which is an instance of a Mesh that can be drawn with the specified Materials.
  */
 class Model : public Ref
 {
@@ -145,6 +144,43 @@ public:
      */
     void setNode(Node* node);
 
+    /**
+     * Sets if this model cast shadows.
+     *
+     * Note: This is only applied to a SceneRenderer.
+     * 
+     * @param casts if this model casts shadows
+     * @see SceneRenderer
+     */
+    void setShadowCaster(bool casts);
+
+    /**
+     * Returns whether this model cast shadows.
+     *
+     * Note: This is only applied to a SceneRenderer.
+     *
+     * @return if this model casts shadows
+     * @see SceneRenderer
+     */
+    bool isShadowCaster() const;
+
+    /**
+     * Sets if this object receives shadows.
+     *
+     * @param bool if this object receives shadows
+     */
+    void setShadowReceiver(bool receives);
+
+    /**
+     * Returns whether this objects recieves shadows.
+     *
+     * Note: This is only applied to a SceneRenderer.
+     *
+     * @return if this object receives shadows
+     * @see SceneRenderer
+     */
+    bool isShadowReceiver() const;
+
     /**
      * Draws this mesh instance.
      *
@@ -154,8 +190,9 @@ public:
      * and so on, should be set up before calling this method.
      *
      * @param wireframe If true, draw the model in wireframe mode.
+     * @return The number of draw calls (mesh parts).
      */
-    void draw(bool wireframe = false);
+    unsigned int draw(bool wireframe = false);
 
 private:
 
@@ -186,8 +223,6 @@ private:
      */
     void setMaterialNodeBinding(Material *m);
 
-    void validatePartCount();
-
     /**
      * Clones the model and returns a new model.
      * 
@@ -196,12 +231,16 @@ private:
      */
     Model* clone(NodeCloneContext &context);
 
+    void validatePartCount();
+
     Mesh* _mesh;
     Material* _material;
     unsigned int _partCount;
     Material** _partMaterials;
     Node* _node;
     MeshSkin* _skin;
+    bool _shadowCaster;
+    bool _shadowReceiver;
 };
 
 }

+ 27 - 1
gameplay/src/Node.cpp

@@ -20,7 +20,7 @@ namespace gameplay
 {
 
 Node::Node(const char* id)
-    : _scene(NULL), _firstChild(NULL), _nextSibling(NULL), _prevSibling(NULL), _parent(NULL), _childCount(0),
+    : _scene(NULL), _firstChild(NULL), _nextSibling(NULL), _prevSibling(NULL), _parent(NULL), _childCount(0), _visible(true),
     _tags(NULL), _camera(NULL), _light(NULL), _model(NULL), _terrain(NULL), _form(NULL), _audioSource(NULL), _particleEmitter(NULL),
     _collisionObject(NULL), _agent(NULL), _dirtyBits(NODE_DIRTY_ALL), _notifyHierarchyChanged(true), _userData(NULL)
 {
@@ -292,6 +292,32 @@ void Node::setUserPointer(void* pointer, void (*cleanupCallback)(void*))
     }
 }
 
+void Node::setVisible(bool visible)
+{
+    if (_visible != visible)
+    {
+        _visible = visible;
+    }
+}
+
+bool Node::isVisible() const
+{
+    return _visible;
+}
+
+bool Node::isVisibleInHierarchy() const
+{
+   if (!_visible)
+       return false;
+   Node* node = _parent;
+   while (node)
+   {
+       if (!node->_visible)
+           return false;
+   }
+   return true;
+}
+
 unsigned int Node::getChildCount() const
 {
     return _childCount;

+ 42 - 17
gameplay/src/Node.h

@@ -117,13 +117,19 @@ public:
     Node* getParent() const;
 
     /**
-     * Determines if a custom tag with the specified name is set.
+     * Sets a custom tag on this Node.
      *
-     * @param name Name of the tag to query.
+     * Custom tags can be used for a variety of purposes within a game. For example,
+     * a tag called "transparent" can be added to nodes, to indicate which nodes in
+     * a scene are transparent. This tag can then be read during rendering to sort
+     * transparent and opaque objects for correct drawing order. 
      *
-     * @return true if the tag is set, false otherwise.
+     * Setting a tag to NULL removes the tag from the Node.
+     *
+     * @param name Name of the tag to set.
+     * @param value Optional value of the tag (empty string by default).
      */
-    bool hasTag(const char* name) const;
+    void setTag(const char* name, const char* value = "");
 
     /**
      * Returns the value of the custom tag with the given name.
@@ -135,21 +141,13 @@ public:
     const char* getTag(const char* name) const;
 
     /**
-     * Sets a custom tag on this Node.
-     *
-     * Custom tags can be used for a variety of purposes within a game. For example,
-     * a tag called "transparent" can be added to nodes, to indicate which nodes in
-     * a scene are transparent. This tag can then be read during rendering to sort
-     * transparent and opaque objects for correct drawing order. Another example
-     * is using a "visible" tag to mark nodes as invisible to be skipped during
-     * rendering.
+     * Determines if a custom tag with the specified name is set.
      *
-     * Setting a tag to NULL removes the tag from the Node.
+     * @param name Name of the tag to query.
      *
-     * @param name Name of the tag to set.
-     * @param value Optional value of the tag (empty string by default).
+     * @return true if the tag is set, false otherwise.
      */
-    void setTag(const char* name, const char* value = "");
+    bool hasTag(const char* name) const;
 
     /**
      * Returns the user pointer for this node.
@@ -182,6 +180,28 @@ public:
      */
     void setUserPointer(void* pointer, void (*cleanupCallback)(void*) = NULL);
 
+    /**
+     * Sets if visual components themselves set as visible.
+     *
+     * @param visible if visual components themselves set as visible.
+     */
+    void setVisible(bool visible);
+
+    /**
+     * Gets if visual components themselves set as visible.
+     *
+     * @return if visual components themselves set as visible.
+     */
+    bool isVisible() const;
+
+    /**
+     * Gets if visual components are either inherited visible or they are themselves.
+     *
+     * @param inherit true if visible is based on inherited behaviour or false is its self is visible.
+     * @return if visual components attached on this node should be drawn.
+     */
+    bool isVisibleInHierarchy() const;
+
     /**
      * Returns the number of direct children of this item.
      *
@@ -230,7 +250,7 @@ public:
      * Gets the top level node in this node's parent hierarchy.
      */
     Node* getRootNode() const;
-    
+
     /**
      * Returns whether the transformation of this node is static.
      *
@@ -780,6 +800,11 @@ protected:
      */
     unsigned int _childCount;
 
+    /**
+     * If this node is visible. This may not be visiblein hierarchy if its parents are hidden
+     */
+    bool _visible;
+
     /**
      * List of custom tags for a node.
      */

+ 3 - 4
gameplay/src/ParticleEmitter.cpp

@@ -981,12 +981,10 @@ void ParticleEmitter::update(float elapsedTime)
     }
 }
 
-void ParticleEmitter::draw()
+unsigned int ParticleEmitter::draw()
 {
     if (!isActive())
-    {
-        return;
-    }
+        return 0;
 
     if (_particleCount > 0)
     {
@@ -1027,6 +1025,7 @@ void ParticleEmitter::draw()
         // Render.
         _spriteBatch->finish();
     }
+    return 1;
 }
 
 ParticleEmitter* ParticleEmitter::clone()

+ 1 - 1
gameplay/src/ParticleEmitter.h

@@ -700,7 +700,7 @@ public:
     /**
      * Draws the particles currently being emitted.
      */
-    void draw();
+    unsigned int draw();
 
     /**
      * Gets a TextureBlending enum from a corresponding string.

+ 26 - 0
gameplay/src/SceneRenderer.cpp

@@ -0,0 +1,26 @@
+#include "Base.h"
+#include "SceneRenderer.h"
+
+namespace gameplay
+{
+
+SceneRenderer::SceneRenderer()
+    : _wireframe(false)
+{
+}
+
+SceneRenderer::~SceneRenderer()
+{
+}
+
+void SceneRenderer::setWireframe(bool wireframe)
+{
+    _wireframe = wireframe;
+}
+
+bool SceneRenderer::isWireframe() const
+{
+    return _wireframe;
+}
+
+}

+ 62 - 0
gameplay/src/SceneRenderer.h

@@ -0,0 +1,62 @@
+#ifndef SCENERENDERER_H_
+#define SCENERENDERER_H_
+
+#include "Scene.h"
+#include "VisibleSet.h"
+
+namespace gameplay
+{
+
+/**
+ * Represents a class that support rendering of the active models in a scene 
+ * and that are visible to the camera. 
+ */
+class SceneRenderer
+{
+public:
+
+    /**
+     * Constructor.
+     *
+     * @param scene The scene to render.
+     * @param lighting The type of lighting system to use.
+     */
+    SceneRenderer();
+
+    /**
+     * Destructor.
+     */
+    virtual ~SceneRenderer();
+
+    /**
+     * Sets if the scene should be rendered in wireframe mode.
+     *
+     * @param wireframe if the scene should be rendered in wireframe mode.
+     */
+    void setWireframe(bool wireframe);
+
+    /**
+     * Determines if the scene should be rendered in wireframe mode.
+     *
+     * @return if the scene should be rendered in wireframe mode.
+     */
+    bool isWireframe() const;
+
+    /**
+     * Renders the scene with all the nodes visible from the active camera in the scene.
+     *
+     * @param scene
+     * param
+     * @return The number of nodes visited.
+     */
+    virtual unsigned int render(VisibleSet* set) = 0;
+
+protected:
+
+    bool _wireframe;
+
+};
+
+}
+
+#endif

+ 73 - 0
gameplay/src/SceneRendererForward.cpp

@@ -0,0 +1,73 @@
+#include "Base.h"
+#include "SceneRendererForward.h"
+#include "Terrain.h"
+#include "Model.h"
+#include "ParticleEmitter.h"
+#include "Form.h"
+
+namespace gameplay
+{
+
+SceneRendererForward::SceneRendererForward()
+    : SceneRenderer()
+{
+}
+
+SceneRendererForward::SceneRendererForward(const SceneRendererForward& copy)
+{
+}
+
+SceneRendererForward::~SceneRendererForward()
+{
+}
+
+SceneRendererForward* SceneRendererForward::create()
+{
+    return new SceneRendererForward();
+}
+
+unsigned int SceneRendererForward::render(VisibleSet* set)
+{
+    set->reset();
+    unsigned int drawCalls = 0;
+    Node* next = set->getNext();
+    do
+    {
+        drawCalls += drawNode(next);
+        next = set->getNext();
+
+    } while ( next != NULL);
+
+    return drawCalls;
+}
+
+unsigned int SceneRendererForward::drawNode(Node* node)
+{
+    unsigned int drawCalls = 0;
+
+    // Draw Terrain
+    Terrain* terrain = node->getTerrain();
+    if (terrain)
+        drawCalls += terrain->draw(isWireframe());
+
+    // Draw Models (Shadows) TODO:
+
+    // Draw Modes
+    Model* model = node->getModel();
+    if (model)
+        drawCalls += model->draw(isWireframe());
+
+    // Draw particles
+    ParticleEmitter* emitter = node->getParticleEmitter();
+    if (emitter)
+        drawCalls += emitter->draw();
+
+    // Draw forms
+    Form* form = node->getForm();
+    if (form)
+        drawCalls += form->draw();
+
+    return drawCalls;
+}
+
+}

+ 49 - 0
gameplay/src/SceneRendererForward.h

@@ -0,0 +1,49 @@
+#ifndef SCENERENDERERFORWARD_H_
+#define SCENERENDERERFORWARD_H_
+
+#include "SceneRenderer.h"
+
+namespace gameplay
+{
+
+/**
+ * Represents a class that support rendering of the active models in a scene 
+ * and that are visible to the camera. 
+ */
+class SceneRendererForward : public SceneRenderer
+{
+public:
+
+    /**
+     * Creates a forward scene renderer
+     */
+    static SceneRendererForward* create();
+
+    /**
+     * @see SceneRenderer#render
+     */
+    unsigned int render(VisibleSet* set);
+
+private:
+
+    /**
+     * Constructor.
+     */
+    SceneRendererForward();
+
+    /**
+     * Constructor.
+     */
+    SceneRendererForward(const SceneRendererForward& copy);
+
+    /**
+     * Destructor.
+     */
+    ~SceneRendererForward();
+
+    unsigned int drawNode(Node* node);
+};
+
+}
+
+#endif

+ 2 - 1
gameplay/src/Terrain.cpp

@@ -509,12 +509,13 @@ float Terrain::getHeight(float x, float z) const
     return height;
 }
 
-void Terrain::draw(bool wireframe)
+unsigned int Terrain::draw(bool wireframe)
 {
     for (size_t i = 0, count = _patches.size(); i < count; ++i)
     {
         _patches[i]->draw(wireframe);
     }
+    return getVisiblePatchCount();
 }
 
 void Terrain::transformChanged(Transform* transform, long cookie)

+ 2 - 1
gameplay/src/Terrain.h

@@ -311,8 +311,9 @@ public:
      * Draws the terrain.
      *
      * @param wireframe True to draw the terrain as wireframe, false to draw it solid (default).
+     * @return The number of draw call taken to drawn the terrain
      */
-    void draw(bool wireframe = false);
+    unsigned int draw(bool wireframe = false);
 
     /**
      * @see Transform::Listener::transformChanged.

+ 5 - 5
gameplay/src/TerrainPatch.cpp

@@ -513,28 +513,28 @@ bool TerrainPatch::updateMaterial()
     return true;
 }
 
-void TerrainPatch::draw(bool wireframe)
+unsigned int TerrainPatch::draw(bool wireframe)
 {
     Scene* scene = _terrain->_node ? _terrain->_node->getScene() : NULL;
     Camera* camera = scene ? scene->getActiveCamera() : NULL;
     if (!camera)
-        return;
+        return 0;
 
     // Get our world-space bounding box
     BoundingBox bounds = getBoundingBox(true);
 
     // If the box does not intersect the view frustum, cull it
     if (_terrain->isFlagSet(Terrain::FRUSTUM_CULLING) && !camera->getFrustum().intersects(bounds))
-        return;
+        return 0;
 
     if (!updateMaterial())
-        return;
+        return 0;
 
     // Compute the LOD level from the camera's perspective
     size_t lod = computeLOD(camera, bounds);
 
     // Draw the model for the current LOD
-    _levels[lod]->model->draw(wireframe);
+    return _levels[lod]->model->draw(wireframe);
 }
 
 bool TerrainPatch::isVisible() const

+ 1 - 1
gameplay/src/TerrainPatch.h

@@ -119,7 +119,7 @@ private:
     /**
      * Draws the terrain patch.
      */
-    void draw(bool wireframe);
+    unsigned int draw(bool wireframe);
 
     /**
      * Updates the material for the patch.

+ 48 - 0
gameplay/src/VisibleSet.h

@@ -0,0 +1,48 @@
+#ifndef VISIBLESET_H_
+#define VISIBLESET_H_
+
+#include "Scene.h"
+
+namespace gameplay
+{
+
+/**
+ * Represents a set of nodes that are visible from the
+ * scenes active camera. This provides an enumerator
+ * to traverse the scene returning only visible nodes.
+ */
+class VisibleSet
+{
+public:
+
+    /**
+     * Sets the scene to determine the visible set from.
+     *
+     * @param scene The scene to determine the visible set from.
+     */
+    virtual void setScene(Scene* scene) = 0;
+
+    /**
+     * Gets the scene to determine the visible set from.
+     *
+     * @param scene The scene to determine the visible set from.
+     */
+    virtual Scene* getScene() = 0;
+
+    /**
+     * Resets the enumerator for enumerating the visible set.
+     */
+    virtual void reset() = 0;
+
+    /**
+     * Gets the next visible node in the set or NULL 
+     * onces you have reached the end of the set.
+     * 
+     * @return The next visible node in the set or NULL at end of set.
+     */
+    virtual Node* getNext() = 0;
+};
+
+}
+
+#endif

+ 89 - 0
gameplay/src/VisibleSetDefault.cpp

@@ -0,0 +1,89 @@
+#include "Base.h"
+#include "VisibleSetDefault.h"
+
+namespace gameplay
+{
+
+VisibleSetDefault* VisibleSetDefault::create(Scene* scene)
+{
+    return new VisibleSetDefault(scene);
+}
+
+VisibleSetDefault::VisibleSetDefault(Scene* scene) 
+    : _scene(NULL), _next(NULL)
+{
+    setScene(scene);
+}
+
+VisibleSetDefault::VisibleSetDefault(const VisibleSetDefault& copy)
+{
+}
+
+VisibleSetDefault::~VisibleSetDefault()
+{
+}
+
+void VisibleSetDefault::setScene(Scene* scene)
+{
+    _scene = scene;
+    reset();
+}
+
+Scene* VisibleSetDefault::getScene()
+{
+    return _scene;
+}
+
+void VisibleSetDefault::reset()
+{
+    _next = _scene->getFirstNode();
+    while (_next && !_next->isVisible())
+    {
+        _next = _next->getNextSibling();
+    }
+}
+
+Node* VisibleSetDefault::getNext()
+{
+    Node* node = _next;
+    if (_next)
+    {
+        Node* next = _next->getFirstChild();
+        if (!next || !isNodeVisible(next))
+        {
+            next = _next->getNextSibling();
+            if (!next || !isNodeVisible(next))
+            {
+                next = _next->getParent();
+                while (next && (!next->getNextSibling() || !isNodeVisible(next)))
+                {
+                    next = next->getParent();
+                }
+                if (next)
+                {
+                    next = next->getNextSibling();
+                }
+            }
+        }
+       _next = next;
+    }
+    return node;
+}
+
+bool VisibleSetDefault::isNodeVisible(Node* node)
+{
+    if (!node->isVisible())
+        return false;
+
+    if (node->getForm() || node->getParticleEmitter() || node->getTerrain() || node->getLight() || node->getCamera())
+    {
+        return true;
+    }
+    else
+    {
+       return node->getBoundingSphere().intersects(_scene->getActiveCamera()->getFrustum());
+    }
+    return false;
+}
+
+}

+ 73 - 0
gameplay/src/VisibleSetDefault.h

@@ -0,0 +1,73 @@
+#ifndef VISIBLESETDEFAULT_H_
+#define VISIBLESETDEFAULT_H_
+
+#include "VisibleSet.h"
+
+namespace gameplay
+{
+
+/**
+ * Represents a default implementation of a VisibleSet.
+ *
+ * All nodes visible to the active camera in the scene are returned.
+ * @see VisibleSet
+ */
+class VisibleSetDefault : public VisibleSet
+{
+public:
+
+    /**
+     * Creates a new default VisibleSet
+     *
+     * @param scene The scene to use for determining visible nodes.
+     */
+    static VisibleSetDefault* create(Scene* scene);
+
+    /**
+     * @see VisibleSet::setScene
+     */
+    void setScene(Scene* scene);
+
+    /**
+     * @see VisibleSet::getScene
+     */
+    Scene* getScene();
+
+    /**
+     * @see VisibleSet::reset
+     */
+    void reset();
+
+    /**
+     * @see VisibleSet::getNext
+     */
+    Node* getNext();
+
+private:
+    
+    /**
+     * Constructor.
+     */
+    VisibleSetDefault(Scene* scene);
+
+    /**
+     * Constructor.
+     */
+    VisibleSetDefault(const VisibleSetDefault& copy);
+
+    /**
+     * Destructor.
+     */
+    ~VisibleSetDefault();
+
+    bool isNodeVisible(Node* node);
+
+private:
+
+    Scene* _scene;
+    Node* _next;
+};
+
+}
+
+#endif

+ 5 - 1
gameplay/src/gameplay.h

@@ -40,9 +40,11 @@
 #include "Model.h"
 #include "Camera.h"
 #include "Light.h"
-#include "Scene.h"
 #include "Node.h"
 #include "Joint.h"
+#include "Scene.h"
+#include "SceneRenderer.h"
+#include "SceneRendererForward.h"
 #include "Font.h"
 #include "SpriteBatch.h"
 #include "ParticleEmitter.h"
@@ -52,6 +54,8 @@
 #include "ScreenDisplayer.h"
 #include "HeightField.h"
 #include "Terrain.h"
+#include "VisibleSet.h"
+#include "VisibleSetDefault.h"
 
 // Audio
 #include "AudioController.h"

+ 16 - 14
samples/browser/sample-browser.vcxproj

@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup Label="ProjectConfigurations">
     <ProjectConfiguration Include="DebugMem|BlackBerry">
@@ -263,8 +263,8 @@
     </ClCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>lua.lib;OpenAL32.lib;OpenGL32.lib;GLU32.lib;glew32.lib;libpng.lib;zlib.lib;gameplay.lib;libogg.lib;libvorbis.lib;libvorbisfile.lib;BulletDynamics.lib;BulletCollision.lib;LinearMath.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies>lua.lib;OpenAL32.lib;OpenGL32.lib;GLU32.lib;glew32.lib;libpng.lib;zlib.lib;gameplay.lib;libogg.lib;libvorbis.lib;libvorbisfile.lib;BulletDynamics.lib;BulletCollision.lib;LinearMath.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>../../external-deps/lua/lib/windows/x86;../../external-deps/bullet/lib/windows/x86;../../external-deps/openal/lib/windows/x86;../../external-deps/oggvorbis/lib/windows/x86;../../external-deps/glew/lib/windows/x86;../../external-deps/png/lib/windows/x86;../../external-deps/zlib/lib/windows/x86;../../gameplay/windows/x86/$(Configuration)</AdditionalLibraryDirectories>
     </Link>
     <PostBuildEvent>
@@ -293,8 +293,8 @@
     </ClCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>lua.lib;OpenAL32.lib;OpenGL32.lib;GLU32.lib;glew32.lib;libpng.lib;zlib.lib;gameplay.lib;libogg.lib;libvorbis.lib;libvorbisfile.lib;BulletDynamics.lib;BulletCollision.lib;LinearMath.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies>lua.lib;OpenAL32.lib;OpenGL32.lib;GLU32.lib;glew32.lib;libpng.lib;zlib.lib;gameplay.lib;libogg.lib;libvorbis.lib;libvorbisfile.lib;BulletDynamics.lib;BulletCollision.lib;LinearMath.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>../../external-deps/lua/lib/windows/x64;../../external-deps/bullet/lib/windows/x64;../../external-deps/openal/lib/windows/x64;../../external-deps/oggvorbis/lib/windows/x64;../../external-deps/glew/lib/windows/x64;../../external-deps/png/lib/windows/x64;../../external-deps/zlib/lib/windows/x64;../../gameplay/windows/x64/$(Configuration)</AdditionalLibraryDirectories>
     </Link>
     <PostBuildEvent>
@@ -388,8 +388,8 @@
     </ClCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>lua.lib;OpenAL32.lib;OpenGL32.lib;GLU32.lib;glew32.lib;libpng.lib;zlib.lib;gameplay.lib;libogg.lib;libvorbis.lib;libvorbisfile.lib;BulletDynamics.lib;BulletCollision.lib;LinearMath.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies>lua.lib;OpenAL32.lib;OpenGL32.lib;GLU32.lib;glew32.lib;libpng.lib;zlib.lib;gameplay.lib;libogg.lib;libvorbis.lib;libvorbisfile.lib;BulletDynamics.lib;BulletCollision.lib;LinearMath.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>../../external-deps/lua/lib/windows/x86;../../external-deps/bullet/lib/windows/x86;../../external-deps/openal/lib/windows/x86;../../external-deps/oggvorbis/lib/windows/x86;../../external-deps/glew/lib/windows/x86;../../external-deps/png/lib/windows/x86;../../external-deps/zlib/lib/windows/x86;../../gameplay/windows/x86/$(Configuration)</AdditionalLibraryDirectories>
     </Link>
     <PostBuildEvent>
@@ -420,8 +420,8 @@
     </ClCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>lua.lib;OpenAL32.lib;OpenGL32.lib;GLU32.lib;glew32.lib;libpng.lib;zlib.lib;gameplay.lib;libogg.lib;libvorbis.lib;libvorbisfile.lib;BulletDynamics.lib;BulletCollision.lib;LinearMath.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalDependencies>lua.lib;OpenAL32.lib;OpenGL32.lib;GLU32.lib;glew32.lib;libpng.lib;zlib.lib;gameplay.lib;libogg.lib;libvorbis.lib;libvorbisfile.lib;BulletDynamics.lib;BulletCollision.lib;LinearMath.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>../../external-deps/lua/lib/windows/x64;../../external-deps/bullet/lib/windows/x64;../../external-deps/openal/lib/windows/x64;../../external-deps/oggvorbis/lib/windows/x64;../../external-deps/glew/lib/windows/x64;../../external-deps/png/lib/windows/x64;../../external-deps/zlib/lib/windows/x64;../../gameplay/windows/x64/$(Configuration)</AdditionalLibraryDirectories>
     </Link>
     <PostBuildEvent>
@@ -511,14 +511,14 @@
       <FunctionLevelLinking>true</FunctionLevelLinking>
       <IntrinsicFunctions>true</IntrinsicFunctions>
       <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>../../gameplay/src;../../external-deps/lua/include;../../external-deps/bullet/include;../../external-deps/openal/include/AL;../../external-deps/oggvorbis/include;../../external-deps/png/include;../../external-deps/zlib/include;../../external-deps/glew/include</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>../../gameplay/src;../../external-deps/lua/include;../../external-deps/bullet/include;../../external-deps/openal/include/AL;../../external-deps/oggvorbis/include;../../external-deps/png/include;../../external-deps/zlib/include;../../external-deps/glew/include</AdditionalIncludeDirectories>
     </ClCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>lua.lib;OpenAL32.lib;OpenGL32.lib;GLU32.lib;glew32.lib;libpng.lib;zlib.lib;gameplay.lib;BulletDynamics.lib;BulletCollision.lib;LinearMath.lib;libogg.lib;libvorbis.lib;libvorbisfile.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <OptimizeReferences>true</OptimizeReferences>
+      <AdditionalDependencies>lua.lib;OpenAL32.lib;OpenGL32.lib;GLU32.lib;glew32.lib;libpng.lib;zlib.lib;gameplay.lib;BulletDynamics.lib;BulletCollision.lib;LinearMath.lib;libogg.lib;libvorbis.lib;libvorbisfile.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>../../external-deps/lua/lib/windows/x86;../../external-deps/bullet/lib/windows/x86;../../external-deps/openal/lib/windows/x86;../../external-deps/oggvorbis/lib/windows/x86;../../external-deps/glew/lib/windows/x86;../../external-deps/png/lib/windows/x86;../../external-deps/zlib/lib/windows/x86;../../gameplay/windows/x86/$(Configuration)</AdditionalLibraryDirectories>
     </Link>
     <PostBuildEvent>
@@ -549,8 +549,8 @@
       <SubSystem>Windows</SubSystem>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>lua.lib;OpenAL32.lib;OpenGL32.lib;GLU32.lib;glew32.lib;libpng.lib;zlib.lib;gameplay.lib;BulletDynamics.lib;BulletCollision.lib;LinearMath.lib;libogg.lib;libvorbis.lib;libvorbisfile.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <OptimizeReferences>true</OptimizeReferences>
+      <AdditionalDependencies>lua.lib;OpenAL32.lib;OpenGL32.lib;GLU32.lib;glew32.lib;libpng.lib;zlib.lib;gameplay.lib;BulletDynamics.lib;BulletCollision.lib;LinearMath.lib;libogg.lib;libvorbis.lib;libvorbisfile.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>../../external-deps/lua/lib/windows/x64;../../external-deps/bullet/lib/windows/x64;../../external-deps/openal/lib/windows/x64;../../external-deps/oggvorbis/lib/windows/x64;../../external-deps/glew/lib/windows/x64;../../external-deps/png/lib/windows/x64;../../external-deps/zlib/lib/windows/x64;../../gameplay/windows/x64/$(Configuration)</AdditionalLibraryDirectories>
     </Link>
     <PostBuildEvent>
@@ -649,6 +649,7 @@
     <ClCompile Include="src\GestureSample.cpp" />
     <ClCompile Include="src\LightSample.cpp" />
     <ClCompile Include="src\PostProcessSample.cpp" />
+    <ClCompile Include="src\SceneRendererSample.cpp" />
     <ClCompile Include="src\TerrainSample.cpp" />
     <ClCompile Include="src\TriangleSample.cpp" />
     <ClCompile Include="src\FirstPersonCamera.cpp" />
@@ -673,6 +674,7 @@
     <ClInclude Include="src\GestureSample.h" />
     <ClInclude Include="src\LightSample.h" />
     <ClInclude Include="src\PostProcessSample.h" />
+    <ClInclude Include="src\SceneRendererSample.h" />
     <ClInclude Include="src\TerrainSample.h" />
     <ClInclude Include="src\TriangleSample.h" />
     <ClInclude Include="src\FirstPersonCamera.h" />

+ 6 - 0
samples/browser/sample-browser.vcxproj.filters

@@ -79,6 +79,9 @@
     <ClInclude Include="src\TerrainSample.h">
       <Filter>src</Filter>
     </ClInclude>
+    <ClInclude Include="src\SceneRendererSample.h">
+      <Filter>src</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="src\MeshPrimitiveSample.cpp">
@@ -147,5 +150,8 @@
     <ClCompile Include="src\TerrainSample.cpp">
       <Filter>src</Filter>
     </ClCompile>
+    <ClCompile Include="src\SceneRendererSample.cpp">
+      <Filter>src</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>

+ 6 - 6
samples/browser/src/GamepadSample.cpp

@@ -4,15 +4,10 @@
     ADD_SAMPLE("Input", "Gamepads", GamepadSample, 3);
 #endif
 
-GamepadSample::GamepadSample() : _gamepad(NULL)
+GamepadSample::GamepadSample() : _font(NULL), _gamepad(NULL)
 {
 }
 
-void GamepadSample::finalize()
-{
-    SAFE_RELEASE(_font);
-}
-
 void GamepadSample::initialize()
 {
     setMultiTouch(true);
@@ -27,6 +22,11 @@ void GamepadSample::initialize()
     _status = "Looking for gamepads...";
 }
 
+void GamepadSample::finalize()
+{
+    SAFE_RELEASE(_font);
+}
+
 void GamepadSample::updateGamepad(float elapsedTime, Gamepad* gamepad, unsigned int player)
 {
     char s[128];

+ 99 - 0
samples/browser/src/SceneRendererSample.cpp

@@ -0,0 +1,99 @@
+#include "SceneRendererSample.h"
+#include "SamplesGame.h"
+
+#if defined(ADD_SAMPLE)
+    ADD_SAMPLE("Scene", "Scene Renderer", SceneRendererSample, 3);
+#endif
+
+SceneRendererSample::SceneRendererSample() : _font(NULL), _scene(NULL), _visibleSet(NULL), _lightNode(NULL)
+{
+}
+
+void SceneRendererSample::initialize()
+{
+    setMultiTouch(true);
+
+    _font = Font::create("res/common/arial.gpb");
+    _scene = Scene::load("res/common/sample.scene");
+    _visibleSet = VisibleSetDefault::create(_scene);
+    _renderer = SceneRendererForward::create();
+
+    // Find the light node
+    _lightNode = _scene->findNode("directionalLight");
+
+    _scene->getActiveCamera()->setAspectRatio(getAspectRatio());
+
+    _scene->visit(this, &SceneRendererSample::bindLights);
+}
+
+void SceneRendererSample::finalize()
+{
+    SAFE_RELEASE(_font);
+}
+
+void SceneRendererSample::update(float elapsedTime)
+{
+}
+
+void SceneRendererSample::render(float elapsedTime)
+{
+    clear(CLEAR_COLOR_DEPTH, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0);
+
+    _renderer->render(_visibleSet);
+
+    drawFrameRate(_font, Vector4(0, 0.5f, 1, 1), 5, 1, getFrameRate());
+}
+
+void SceneRendererSample::touchEvent(Touch::TouchEvent evt, int x, int y, unsigned int contactIndex)
+{
+    switch (evt)
+    {
+    case Touch::TOUCH_PRESS:
+        if (x < 75 && y < 50)
+        {
+            // Toggle Vsync if the user touches the top left corner
+            setVsync(!isVsync());
+            return;
+        }
+        break;
+    case Touch::TOUCH_RELEASE:
+        break;
+    case Touch::TOUCH_MOVE:
+        break;
+    };
+}
+
+void SceneRendererSample::keyEvent(Keyboard::KeyEvent evt, int key)
+{
+}
+
+bool SceneRendererSample::bindLights(Node* node)
+{
+    Model* model = node->getModel();
+    if (model)
+    {
+        Material* material = model->getMaterial();
+        if (material)
+        {
+            MaterialParameter* ambientColorParam = material->getParameter("u_ambientColor");
+            if (ambientColorParam)
+            {
+                ambientColorParam->setValue(_scene->getAmbientColor());
+            }
+            if (_lightNode && _lightNode->getLight())
+            {
+                MaterialParameter* lightDirectionParam = material->getParameter("u_lightDirection");
+                MaterialParameter* lightColorParam = material->getParameter("u_lightColor");
+                if (lightDirectionParam)
+                {
+                    lightDirectionParam->bindValue(_lightNode, &Node::getForwardVectorView);
+                }
+                if (lightColorParam)
+                {
+                    lightColorParam->setValue(_lightNode->getLight()->getColor());
+                }
+            }
+        }
+    }
+    return true;
+}

+ 37 - 0
samples/browser/src/SceneRendererSample.h

@@ -0,0 +1,37 @@
+#ifndef SCENERENDERERSAMPLE_H_
+#define SCENERENDERERSAMPLE_H_
+
+#include "gameplay.h"
+#include "Sample.h"
+
+using namespace gameplay;
+
+/**
+ * Sample to show case the SceneRenderer
+ */
+class SceneRendererSample : public Sample
+{
+public:
+
+    SceneRendererSample();
+
+protected:
+    void initialize();
+    void finalize();
+    void update(float elapsedTime);
+    void render(float elapsedTime);
+    void touchEvent(Touch::TouchEvent event, int x, int y, unsigned int contactIndex);
+    void keyEvent(Keyboard::KeyEvent evt, int key);
+
+private:
+
+    bool bindLights(Node* node);
+
+    Font* _font;
+    Scene* _scene;
+    Node* _lightNode;
+    VisibleSet* _visibleSet;
+    SceneRenderer* _renderer;
+};
+
+#endif

+ 1 - 1
samples/browser/src/TerrainSample.cpp

@@ -2,7 +2,7 @@
 #include "SamplesGame.h"
 
 #if defined(ADD_SAMPLE)
-    ADD_SAMPLE("Scene", "Terrain", TerrainSample, 3);
+    ADD_SAMPLE("Scene", "Terrain", TerrainSample, 4);
 #endif
 
 struct TerrainHitFilter : public PhysicsController::HitFilter