/// <summary> /// Static constructor. /// </summary> static SceneObject() { // Static initialization SceneGraph.Touch(); SceneObjectCamera.Touch(); SceneObjectGeometry.Touch(); SceneObjectLight.Touch(); SceneObjectLightZone.Touch(); }
private void PostObject(GraphicsContext ctx, SceneGraphContext ctxScene, SceneObjectLightZone sceneObject) { if (sceneObject == null) { throw new ArgumentNullException("sceneObject"); } _LightState.Pop(); ctxScene.GraphicsStateStack.Current.DefineState(CurrentZone); }
private void ManageObject(GraphicsContext ctx, SceneGraphContext ctxScene, SceneObjectLightZone sceneObject) { if (sceneObject == null) { throw new ArgumentNullException("sceneObject"); } if (_LightState.Count == 1) { ShadowLights.Clear(); } _LightState.Push(new State.LightsState()); ctxScene.GraphicsStateStack.Current.DefineState(CurrentZone); }
/// <summary> /// Traverse delegate for collecting geometries to be drawn. /// </summary> /// <param name="ctx"> /// The <see cref="GraphicsContext"/> used for drawing. /// </param> /// <param name="ctxScene"></param> /// <param name="sceneObject"></param> /// <param name="data"></param> /// <returns></returns> private static bool GraphDrawDelegate(GraphicsContext ctx, SceneGraphContext ctxScene, SceneObject sceneObject, object data) { ObjectBatchContext objectBatchContext = (ObjectBatchContext)data; if (sceneObject.ObjectType == SceneObjectGeometry.ClassObjectType) { SceneObjectGeometry sceneGeometry = (SceneObjectGeometry)sceneObject; GraphicsStateSet sceneGeometryState = ctxScene.GraphicsStateStack.Current; TransformStateBase sceneGeometryModel = (TransformStateBase)sceneGeometryState[TransformStateBase.StateSetIndex]; IEnumerable <SceneObjectBatch> geometries; if ((ctxScene.Scene.SceneFlags & SceneGraphFlags.CullingViewFrustum) != 0) { // View-frustum culling geometries = sceneGeometry.GetGeometries(sceneGeometryState, objectBatchContext.ViewFrustumPlanes, sceneGeometryModel.ModelView); } else { // All geometries geometries = sceneGeometry.GetGeometries(sceneGeometryState); } objectBatchContext.Objects.AddRange(geometries); // Bounding volumes if ((ctxScene.Scene.SceneFlags & SceneGraphFlags.BoundingVolumes) != 0) { } } else if (sceneObject.ObjectType == SceneObjectLightZone.ClassObjectType) { SceneObjectLightZone sceneObjectLightZone = (SceneObjectLightZone)sceneObject; // TODO: Push instead of Clear to support stacked zones objectBatchContext.Lights.Clear(); objectBatchContext.LightZone = sceneObjectLightZone; } else if (sceneObject.ObjectType == SceneObjectLight.ClassObjectType) { objectBatchContext.Lights.Add((SceneObjectLight)sceneObject); } return(true); }
private static bool GraphDrawPostDelegate(GraphicsContext ctx, SceneGraphContext ctxScene, SceneObject sceneObject, object data) { ObjectBatchContext objectBatchContext = (ObjectBatchContext)data; if (sceneObject.ObjectType == SceneObjectLightZone.ClassObjectType) { SceneObjectLightZone sceneObjectLightZone = (SceneObjectLightZone)sceneObject; sceneObjectLightZone.ResetLights(ctxScene, objectBatchContext.Lights); // TODO: Pop instead of Clear to support stacked zones objectBatchContext.Lights.Clear(); } // Restore previous state ctxScene.GraphicsStateStack.Pop(); return(true); }