Esempio n. 1
0
 /// <summary>
 /// Static constructor.
 /// </summary>
 static SceneObject()
 {
     // Static initialization
     SceneGraph.Touch();
     SceneObjectCamera.Touch();
     SceneObjectGeometry.Touch();
     SceneObjectLight.Touch();
     SceneObjectLightZone.Touch();
 }
Esempio n. 2
0
        private void PostObject(GraphicsContext ctx, SceneGraphContext ctxScene, SceneObjectLightZone sceneObject)
        {
            if (sceneObject == null)
            {
                throw new ArgumentNullException("sceneObject");
            }

            _LightState.Pop();

            ctxScene.GraphicsStateStack.Current.DefineState(CurrentZone);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        /// <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);
        }
Esempio n. 5
0
        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);
        }