Example #1
0
    private void RenderSubmesh(PrimitiveJob job)
    {
      Effect.World = Matrix.CreateScale((Vector3)job.Size.Scale) * job.Pose;
      Effect.CurrentTechnique.Passes[0].Apply();

      job.Submesh.Draw();
    }
Example #2
0
        private void RenderCylinder(IGraphicsService graphicsService, PrimitiveJob job)
        {
            float radius = job.Size.Radius;
            float height = job.Size.Height;

            Effect.World = Matrix.CreateScale(radius, height / 2, radius) * job.Pose;
            Effect.CurrentTechnique.Passes[0].Apply();

            if (DrawWireFrame)
            {
                if (_cylinderLinePrimitive == null)
                {
                    _cylinderLinePrimitive = MeshHelper.GetCylinderLines(graphicsService);
                }

                _cylinderLinePrimitive.Draw();
            }
            else
            {
                if (_cylinderPrimitive == null)
                {
                    _cylinderPrimitive = MeshHelper.GetCylinder(graphicsService);
                }

                _cylinderPrimitive.Draw();
            }
        }
Example #3
0
    private void RenderShape(GraphicsDevice graphicsDevice, PrimitiveJob job)
    {
      Submesh submesh;
      Matrix matrix;
      ShapeMeshCache.GetMesh(_graphicsService, job.Shape, out submesh, out matrix);
      if (submesh.VertexBuffer == null)
        return;   // This could happen for shapes without a mesh, like an InfiniteShape.

      Effect.World = (Matrix)matrix * Matrix.CreateScale((Vector3)job.Size.Scale) * job.Pose;
      Effect.CurrentTechnique.Passes[0].Apply();

      var originalRasterizerState = graphicsDevice.RasterizerState;
      var triangleMeshShape = job.Shape as TriangleMeshShape;
      if (triangleMeshShape != null && triangleMeshShape.IsTwoSided && originalRasterizerState.CullMode != CullMode.None)
      {
        if (AutoRasterizerState)
        {
          // For two-sided meshes we disable back-face culling.
          graphicsDevice.RasterizerState = DrawWireFrame ? GraphicsHelper.RasterizerStateWireFrame : GraphicsHelper.RasterizerStateCullNone;
          submesh.Draw();
          graphicsDevice.RasterizerState = originalRasterizerState;
        }
        else
        {
          submesh.Draw();
        }
      }
      else
      {
        submesh.Draw();
      }
    }
Example #4
0
        private void RenderModel(GraphicsDevice graphicsDevice, PrimitiveJob job)
        {
            var numberOfBones = job.Model.Bones.Count;

            if (_boneTransforms == null || _boneTransforms.Length < numberOfBones)
            {
                _boneTransforms = new Matrix[numberOfBones];
            }

            job.Model.CopyAbsoluteBoneTransformsTo(_boneTransforms);
            foreach (var mesh in job.Model.Meshes)
            {
                Effect.World = _boneTransforms[mesh.ParentBone.Index] * Matrix.CreateScale((Vector3)job.Size.Scale) * job.Pose;
                Effect.CurrentTechnique.Passes[0].Apply();

                foreach (var part in mesh.MeshParts)
                {
                    graphicsDevice.SetVertexBuffer(part.VertexBuffer);
                    graphicsDevice.Indices = part.IndexBuffer;
#if MONOGAME
                    graphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, part.VertexOffset, part.StartIndex, part.PrimitiveCount);
#else
                    graphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, part.VertexOffset, 0, part.NumVertices, part.StartIndex, part.PrimitiveCount);
#endif
                }
            }
        }
Example #5
0
      public int Compare(PrimitiveJob x, PrimitiveJob y)
      {
        if (x.Depth < y.Depth)
          return -1;
        if (x.Depth > y.Depth)
          return +1;

        return 0;
      }
Example #6
0
        private void RenderCapsule(IGraphicsService graphicsService, PrimitiveJob job)
        {
            float radius = job.Size.Radius;
            float height = job.Size.Height;

            if (DrawWireFrame)
            {
                if (_hemisphereLinePrimitive == null)
                {
                    _hemisphereLinePrimitive = MeshHelper.GetHemisphereLines(graphicsService);
                }

                Effect.World = Matrix.CreateScale(radius) * Matrix.CreateTranslation(0, height / 2 - radius, 0) * job.Pose;
                Effect.CurrentTechnique.Passes[0].Apply();
                _hemisphereLinePrimitive.Draw();

                Effect.World = Matrix.CreateScale(-radius, -radius, radius) * Matrix.CreateTranslation(0, -height / 2 + radius, 0) * job.Pose;
                Effect.CurrentTechnique.Passes[0].Apply();
                _hemisphereLinePrimitive.Draw();

                // 4 lines
                Vector3F dx     = radius * job.Pose.ToWorldDirection(new Vector3F(1, 0, 0));
                Vector3F dy     = (height / 2 - radius) * job.Pose.ToWorldDirection(new Vector3F(0, 1, 0));
                Vector3F dz     = radius * job.Pose.ToWorldDirection(new Vector3F(0, 0, 1));
                Vector3F center = job.Pose.Position;
                _lineBatch.Add(center + dy + dx, center - dy + dx, job.Color);
                _lineBatch.Add(center + dy - dx, center - dy - dx, job.Color);
                _lineBatch.Add(center + dy + dz, center - dy + dz, job.Color);
                _lineBatch.Add(center + dy - dz, center - dy - dz, job.Color);
            }
            else
            {
                if (_hemispherePrimitive == null)
                {
                    _hemispherePrimitive = MeshHelper.GetHemisphere(graphicsService);
                }

                Effect.World = Matrix.CreateScale(radius) * Matrix.CreateTranslation(0, height / 2 - radius, 0) * job.Pose;
                Effect.CurrentTechnique.Passes[0].Apply();
                _hemispherePrimitive.Draw();

                Effect.World = Matrix.CreateScale(-radius, -radius, radius) * Matrix.CreateTranslation(0, -height / 2 + radius, 0) * job.Pose;
                Effect.CurrentTechnique.Passes[0].Apply();
                _hemispherePrimitive.Draw();

                if (_uncappedCylinderPrimitive == null)
                {
                    _uncappedCylinderPrimitive = MeshHelper.GetUncappedCylinder(graphicsService);
                }

                Effect.World = Matrix.CreateScale(radius, height / 2 - radius, radius) * job.Pose;
                Effect.CurrentTechnique.Passes[0].Apply();

                _uncappedCylinderPrimitive.Draw();
            }
        }
Example #7
0
        static bool TryAllocPrimitiveJob(out PrimitiveJob job, int primitiveType, float duration, bool depthTest, CullMode cullMode, bool shaded)
        {
            if (!isEnabledAndPlaying)
            {
                job = new PrimitiveJob();
                return(false);
            }

            job = instance.AllocPrimitiveJob(primitiveType, duration, depthTest, cullMode, shaded);
            return(true);
        }
Example #8
0
            public int Compare(PrimitiveJob x, PrimitiveJob y)
            {
                if (x.Depth < y.Depth)
                {
                    return(-1);
                }
                if (x.Depth > y.Depth)
                {
                    return(+1);
                }

                return(0);
            }
Example #9
0
        private void RenderSphere(IGraphicsService graphicsService, PrimitiveJob job, RenderContext context)
        {
            if (DrawWireFrame)
            {
                Pose      cameraPose       = context.CameraNode.PoseWorld;
                Matrix44F cameraProjection = context.CameraNode.Camera.Projection;
                if (Numeric.AreEqual(1.0f, cameraProjection.M33))
                {
                    // Orthographic projection
                    Vector3F position = job.Pose.Position;
                    Vector3F right    = cameraPose.Orientation.GetColumn(0);
                    Vector3F up       = cameraPose.Orientation.GetColumn(1);
                    Vector3F forward  = cameraPose.Orientation.GetColumn(2);
                    Matrix   pose     = new Matrix(right.X, right.Y, right.Z, 0,
                                                   up.X, up.Y, up.Z, 0,
                                                   forward.X, forward.Y, forward.Z, 0,
                                                   position.X, position.Y, position.Z, 1);
                    Effect.World = Matrix.CreateScale(job.Size.Radius) * pose;
                    Effect.CurrentTechnique.Passes[0].Apply();

                    if (_circleLinePrimitive == null)
                    {
                        _circleLinePrimitive = MeshHelper.GetCircleLines(graphicsService);
                    }

                    _circleLinePrimitive.Draw();
                }
                else
                {
                    // Perspective projection
                    Vector3F right = cameraPose.Orientation * Vector3F.Right;
                    RenderSphereOutline(job.Size.Radius, ref job.Pose.Position, ref cameraPose, ref right, ref job.Color);
                }
            }
            else
            {
                Effect.World = Matrix.CreateScale(job.Size.Radius) * job.Pose;
                Effect.CurrentTechnique.Passes[0].Apply();

                if (_icospherePrimitive == null)
                {
                    _icospherePrimitive = MeshHelper.GetIcosphere(graphicsService);
                }

                _icospherePrimitive.Draw();
            }
        }
Example #10
0
    private void RenderBox(IGraphicsService graphicsService, PrimitiveJob job)
    {
      Effect.World = Matrix.CreateScale((Vector3)job.Size.Extent) * job.Pose;
      Effect.CurrentTechnique.Passes[0].Apply();

      if (DrawWireFrame)
      {
        if (_boxLinePrimitive == null)
          _boxLinePrimitive = MeshHelper.GetBoxLines(graphicsService);

        _boxLinePrimitive.Draw();
      }
      else
      {
        if (_boxPrimitive == null)
          _boxPrimitive = MeshHelper.GetBox(graphicsService);

        _boxPrimitive.Draw();
      }
    }
Example #11
0
            public PrimitiveJob AllocPrimitiveJob(int primitiveType, float duration, bool depthTest, CullMode cullMode, bool shaded)
            {
                var job = new PrimitiveJob(m_PrimitiveJobs);

                job.primitiveType     = primitiveType;
                job.remainingDuration = duration;
                job.depthTest         = depthTest;

                if (shaded)
                {
                    job.material = m_ShadedMaterials[depthTest ? 1 : 0, (int)cullMode];
                }
                else
                {
                    job.material = m_ColoredMaterials[depthTest ? 1 : 0, (int)cullMode];
                }

                job.list = GetCachedVertexList();
                return(job);
            }
Example #12
0
    private void RenderViewVolume(PrimitiveJob job, RenderContext context)
    {
      float left = job.Size.Left;
      float right = job.Size.Right;
      float bottom = job.Size.Bottom;
      float top = job.Size.Top;
      float near = job.Size.Near;
      float far = job.Size.Far;

      float farOverNear = far / near;

      Vector3 corner0 = job.Pose.ToWorldPosition(new Vector3(left, bottom, -near));
      Vector3 corner1 = job.Pose.ToWorldPosition(new Vector3(right, bottom, -near));
      Vector3 corner2 = job.Pose.ToWorldPosition(new Vector3(right, top, -near));
      Vector3 corner3 = job.Pose.ToWorldPosition(new Vector3(left, top, -near));
      Vector3 corner4 = job.Pose.ToWorldPosition(new Vector3(left * farOverNear, bottom * farOverNear, -far));
      Vector3 corner5 = job.Pose.ToWorldPosition(new Vector3(right * farOverNear, bottom * farOverNear, -far));
      Vector3 corner6 = job.Pose.ToWorldPosition(new Vector3(right * farOverNear, top * farOverNear, -far));
      Vector3 corner7 = job.Pose.ToWorldPosition(new Vector3(left * farOverNear, top * farOverNear, -far));

      if (DrawWireFrame)
      {
        _lineBatch.Add(corner0, corner1, job.Color);
        _lineBatch.Add(corner1, corner2, job.Color);
        _lineBatch.Add(corner2, corner3, job.Color);
        _lineBatch.Add(corner0, corner3, job.Color);
        _lineBatch.Add(corner4, corner5, job.Color);
        _lineBatch.Add(corner5, corner6, job.Color);
        _lineBatch.Add(corner6, corner7, job.Color);
        _lineBatch.Add(corner7, corner4, job.Color);
        _lineBatch.Add(corner0, corner4, job.Color);
        _lineBatch.Add(corner1, corner5, job.Color);
        _lineBatch.Add(corner2, corner6, job.Color);
        _lineBatch.Add(corner3, corner7, job.Color);
      }
      else
      {
        _triangleBatch.Clear();

        // Right face
        var n = job.Pose.ToWorldDirection(new Vector3(near, 0, right));
        // (normal is normalized in the BasicEffect HLSL.)
        _triangleBatch.Add(ref corner1, ref corner2, ref corner5, ref n, ref job.Color);
        _triangleBatch.Add(ref corner2, ref corner6, ref corner5, ref n, ref job.Color);

        // Left face
        n = job.Pose.ToWorldDirection(new Vector3(-near, 0, -left));
        _triangleBatch.Add(ref corner0, ref corner4, ref corner3, ref n, ref job.Color);
        _triangleBatch.Add(ref corner3, ref corner4, ref corner7, ref n, ref job.Color);

        // Top face
        n = job.Pose.ToWorldDirection(new Vector3(0, near, top));
        _triangleBatch.Add(ref corner3, ref corner7, ref corner2, ref n, ref job.Color);
        _triangleBatch.Add(ref corner7, ref corner6, ref corner2, ref n, ref job.Color);

        // Bottom face
        n = job.Pose.ToWorldDirection(new Vector3(0, -near, -bottom));
        _triangleBatch.Add(ref corner0, ref corner1, ref corner4, ref n, ref job.Color);
        _triangleBatch.Add(ref corner4, ref corner1, ref corner5, ref n, ref job.Color);

        // Near face
        n = job.Pose.Orientation.GetColumn(2);
        _triangleBatch.Add(ref corner0, ref corner2, ref corner1, ref n, ref job.Color);
        _triangleBatch.Add(ref corner2, ref corner0, ref corner3, ref n, ref job.Color);

        // Far face
        n = -n;
        _triangleBatch.Add(ref corner4, ref corner5, ref corner7, ref n, ref job.Color);
        _triangleBatch.Add(ref corner7, ref corner5, ref corner6, ref n, ref job.Color);

        _triangleBatch.Render(context);
        _triangleBatch.Clear();
      }
    }