private void RenderSubmesh(PrimitiveJob job) { Effect.World = Matrix.CreateScale((Vector3)job.Size.Scale) * job.Pose; Effect.CurrentTechnique.Passes[0].Apply(); job.Submesh.Draw(); }
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(); } }
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(); } }
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 } } }
public int Compare(PrimitiveJob x, PrimitiveJob y) { if (x.Depth < y.Depth) return -1; if (x.Depth > y.Depth) return +1; return 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(); } }
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); }
public int Compare(PrimitiveJob x, PrimitiveJob y) { if (x.Depth < y.Depth) { return(-1); } if (x.Depth > y.Depth) { return(+1); } return(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(); } }
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(); } }
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); }
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(); } }