示例#1
0
        /// <summary>
        /// This method draws a model mesh, with the given worldMatrix as viewed by the camera.
        /// </summary>
        /// <param name="mesh">The mesh to draw</param>
        /// <param name="worldMatrix">The matrix holding the position, rotation and scale of the mesh</param>
        /// <param name="camera">The camera which represents the user's current view</param>
        public void DrawModelMesh(ModelMesh mesh, Matrix worldMatrix, bool applyCustomEffects)
        {
            Cameras.Camera currentCamera = DisplayController.Display.CurrentView.Camera;
            // setup effect parameters for each effect
            foreach (BasicEffect effect in mesh.Effects)
            {
                // use default settings for now.
                effect.EnableDefaultLighting();
                effect.PreferPerPixelLighting = true;

                // the view, projection and world matrices must be setup for each effect, each frame.

                effect.View       = currentCamera.ViewMatrix;
                effect.Projection = currentCamera.ProjectionMatrix;
                effect.World      = worldMatrix;

                // apply custom effects (if any):
                if (applyCustomEffects)
                {
                    this.ApplyCustomEffects(effect);
                }

                // propagate changes. Any changes to parameters are not applied until CommitChanges() is called.
                effect.CommitChanges();
            }

            // actually draw the model, now that all effects have been setup:
            mesh.Draw();
        }
示例#2
0
        public void MoveObjectToInFrontOfCamera(SceneGraph Node)
        {
            Cameras.Camera SceneCamera = OutsideSimulatorApp.GetInstance().SceneCamera;
            Vector3        lav         = (SceneCamera.LookAt - SceneCamera.Position);

            lav.Normalize();
            Node.Translation = OutsideSimulatorApp.GetInstance().SceneCamera.Position + lav * frontDist;
        }
        public void NewPlaceAction()
        {
            if (IsPlacing)
            {
                PlacingID++;
                PlacingID %= RenderableList.Count;

                IRenderable CreatedRenderable;
                CreatedRenderable = System.Activator.CreateInstance(RenderableList[PlacingID]) as IRenderable;
                CreateObject.Undo();
                OutsideSimulatorApp.GetInstance().ObjectPicker.ClickedNode = LastPickedObject;
                Cameras.Camera SceneCamera = OutsideSimulatorApp.GetInstance().SceneCamera;
                Vector3        lav         = (SceneCamera.LookAt - SceneCamera.Position);
                lav.Normalize();
                CreateObject = new CreateObject(
                    CreatedRenderable,
                    Matrix.Translation(SceneCamera.Position
                                       + lav * ObjectMover.frontDist));
                CreateObject.Redo();
                OutsideSimulatorApp.GetInstance().ObjectPicker.ClickedNode = CreateObject.ParentNode.Children[CreateObject.ChildName];
            }
            else
            {
                IsPlacing = true;
                PlacingID = 0;

                IRenderable CreatedRenderable;
                CreatedRenderable = System.Activator.CreateInstance(RenderableList[PlacingID]) as IRenderable;
                Cameras.Camera SceneCamera = OutsideSimulatorApp.GetInstance().SceneCamera;
                Vector3        lav         = (SceneCamera.LookAt - SceneCamera.Position);
                lav.Normalize();
                LastPickedObject = OutsideSimulatorApp.GetInstance().ObjectPicker.ClickedNode;
                CreateObject     = new CreateObject(
                    CreatedRenderable,
                    Matrix.Translation(SceneCamera.Position
                                       + lav * ObjectMover.frontDist));
                CreateObject.Redo();
                OutsideSimulatorApp.GetInstance().ObjectPicker.ClickedNode = CreateObject.ParentNode.Children[CreateObject.ChildName];
            }
        }
示例#4
0
            /// <summary>
            /// This is the main function of the class, it'll create a triangulated polygon
            /// from and SceneObject.
            /// </summary>
            /// <param name="sourceObject">The object to convert.</param>
            /// <param name="guarenteedView">A camera that can see the whole object.</param>
            /// <returns>A polygon created from 'sourceObject'.</returns>
            public Polygon CreatePolygon(OpenGL gl, SceneObject sourceObject, Cameras.Camera guarenteedView)
            {
                //	Save the current camera data.
                gl.MatrixMode(OpenGL.PROJECTION);
                gl.PushMatrix();

                //	Look through the camera that can see the object.
                guarenteedView.Project(gl);

                //	Start triangulation.
                Begin(gl);

                //	Draw the object.
                sourceObject.Draw(gl);

                //	End triangulation.
                End(gl);

                Polygon newPoly = Triangle;

                newPoly.Name = sourceObject.Name + " (Triangulated Poly)";
                return(newPoly);
            }
示例#5
0
 public virtual void DrawGameScene(GameTime gameTime, Cameras.Camera camera)
 {
 }
示例#6
0
 public virtual void Remove(Cameras.Camera value)
 {
     List.Remove(value);
 }
示例#7
0
 public virtual int Add(Cameras.Camera value)
 {
     return(List.Add(value));
 }
示例#8
0
 protected internal override void Render(Scenes.Scene scene, Cameras.Camera camera, int viewportWidth, int viewportHeight)
 {
     throw new NotImplementedException();
 }
示例#9
0
        protected internal override void Render(Scenes.Scene scene, Cameras.Camera camera, int viewportWidth, int viewportHeight)
        {
            sprites.Clear();

            scene.TraverseVisible(c =>
            {
                var sprite = c as Sprite;
                if (sprite != null)
                {
                    sprites.Add(sprite);
                }
            });

            if (sprites.Count == 0)
            {
                return;
            }

            // setup gl

            GL.UseProgram(program);
            GL.EnableVertexAttribArray(attributes.position);
            GL.EnableVertexAttribArray(attributes.uv);
            GL.Disable(EnableCap.CullFace);
            GL.Enable(EnableCap.Blend);
            GL.BindBuffer(BufferTarget.ArrayBuffer, vertexBuffer);
            GL.VertexAttribPointer(attributes.position, 2, VertexAttribPointerType.Float, false, 2 * 8, 0);
            GL.VertexAttribPointer(attributes.uv, 2, VertexAttribPointerType.Float, false, 2 * 8, 8);
            GL.BindBuffer(BufferTarget.ElementArrayBuffer, elementBuffer);
            GL.UniformMatrix4(uniforms.projectionMatrix, 16, false, camera.projectionMatrix.elements);
            GL.ActiveTexture(TextureUnit.Texture0);
            GL.Uniform1(uniforms.map, 0);
            var oldFogType   = 0;
            var sceneFogType = 0;
            var fog          = scene.Fog;

            if (fog != null)
            {
                GL.Uniform3(uniforms.fogColor, scene.Fog.Color.R, scene.Fog.Color.G, scene.Fog.Color.B);

                var linear = fog as FogLinear;
                var exp2   = fog as FogExp2;

                if (linear != null)
                {
                    GL.Uniform1(uniforms.fogNear, linear.Near);
                    GL.Uniform1(uniforms.fogFar, linear.Far);
                    GL.Uniform1(uniforms.fogType, 1);
                    oldFogType   = 1;
                    sceneFogType = 1;
                }
                else if (exp2 != null)
                {
                    GL.Uniform1(uniforms.fogDensity, exp2.Density);
                    GL.Uniform1(uniforms.fogType, 2);
                    oldFogType   = 2;
                    sceneFogType = 2;
                }
            }
            else
            {
                GL.Uniform1(uniforms.fogType, 0);
                oldFogType   = 0;
                sceneFogType = 0;
            }

            // update positions and sort
            foreach (var sprite in sprites)
            {
                var material = sprite.Material;
                sprite.modelViewMatrix.MultiplyMatrices(camera.matrixWorldInverse, sprite.matrixWorld);
                sprite.Zdepth = -sprite.modelViewMatrix.elements[14];
            }

            sprites.Sort(PainterSortStable);

            // render all sprites
            foreach (var sprite in sprites)
            {
                var material = sprite.Material as SpriteMaterial;

                GL.Uniform1(uniforms.alphaTest, material.ShouldAlphaTest);
                GL.UniformMatrix4((int)uniforms.modelViewMatrix, 16, false, sprite.modelViewMatrix.elements);

                var fogType = 0;

                if (scene.Fog != null && material.UseFog)
                {
                    fogType = sceneFogType;
                }

                if (oldFogType != fogType)
                {
                    GL.Uniform1(uniforms.fogType, fogType);
                    oldFogType = fogType;
                }

                if (material.DiffuseMap != null)
                {
                    GL.Uniform2(uniforms.uvOffset, material.DiffuseMap.Offset.x, material.DiffuseMap.Offset.y);
                    GL.Uniform2(uniforms.uvScale, material.DiffuseMap.Repeat.x, material.DiffuseMap.Repeat.y);
                }
                else
                {
                    GL.Uniform2(uniforms.uvOffset, 0, 0);
                    GL.Uniform2(uniforms.uvScale, 1, 1);
                }

                GL.Uniform1(uniforms.opacity, material.Opacity);
                GL.Uniform3(uniforms.color, material.Diffuse.R, material.Diffuse.G, material.Diffuse.B);

                GL.Uniform1(uniforms.rotation, material.Rotation);
                GL.Uniform2(uniforms.scale, sprite.Scale.x, sprite.Scale.y);

                renderer.SetBlending(material.Blending, material.BlendEquation, material.BlendSource, material.BlendDestination);
                renderer.DepthTest  = material.ShouldDepthTest;
                renderer.DepthWrite = material.ShouldDepthWrite;

                if (material.DiffuseMap != null && material.DiffuseMap.Resolution.Width > 0)
                {
                    renderer.SetTexture(material.DiffuseMap, 0);
                }
                else
                {
                    renderer.SetTexture(texture, 0);
                }

                GL.DrawElements(BeginMode.TriangleFan, 6, DrawElementsType.UnsignedShort, 0);
            }

            // restore gl
            GL.Enable(EnableCap.CullFace);
        }