Beispiel #1
0
        public MeshBlock(string id, Type type, BlockBounds blockBounds, SplittedRegion splittedRegion, Quaternion rotation, int occludeOrder)
        {
            Id = id;
            BlockType = type;
            RotationQuat = rotation;

            OccludeOrder = occludeOrder;
            OriginalBounds = blockBounds;
            SplittedRegion = splittedRegion;
            RotatedBlockBounds = blockBounds.Copy();

            TypeCode = TypeToTypeCode[type];
            MeshSource = ProceduralMeshSource.GetInstance(TypeCode);
        }
Beispiel #2
0
        public Batch(IMeshSource meshSource)
        {
            MeshSource = meshSource;
            GeometryMesh g = meshSource as GeometryMesh;

            if (g != null)
            {
                //BoundingBox = g.Geometry.BoundingBox();
                BoundingSphere = g.Geometry.ComputeBoundingSphere();
            }
            else
            {
                BoundingSphere.Center = Vector3.Zero;
                BoundingSphere.Radius = float.MaxValue;
            }
        }
 public void ExportMeshModel(IMeshSource mesh, string mdlFilePath, AssetKey key, DateTime lastWriteDateTimeUtc)
 {
     if (!_engine.Options.ExportMeshes)
     {
         return;
     }
     using (var file = _engine.TryCreate(key, mdlFilePath, lastWriteDateTimeUtc))
     {
         if (file != null)
         {
             using (var writer = new BinaryWriter(file))
             {
                 WriteMesh(writer, mesh);
             }
         }
     }
 }
        /*public void Initialize()
         * {
         * }*/

        public void Render(RenderStack.Scene.Frame frame)
        {
            if (indexBufferRange.Count == 0)
            {
                return;
            }
#if false
            IMeshSource meshSource = HoverModel.Batch.MeshSource;
            if (meshSource is GeometryMesh && selectionMesh != null)
            {
                renderer.CurrentModel    = null;
                renderer.CurrentMaterial = null;
                renderer.CurrentProgram  = renderer.Programs["WideLine"];
                renderer.CurrentFrame    = HoverModel.Frame;
                renderer.CurrentMesh     = selectionMesh.GetMesh;
                if (!RenderStack.Graphics.Configuration.GL3)
                {
                    GL.LineWidth(lineWidth);
                }
            }
#endif
            //  \todo Use renderstate
            GL.PolygonOffset(-1.0f, 1.0f);
            GL.Enable(EnableCap.PolygonOffsetFill);

            renderer.Requested.Material = material;
            renderer.Requested.Program  = material.Program;
            if (
                (RenderStack.Graphics.Configuration.canUseGeometryShaders) ||
                (RenderStack.Graphics.Configuration.glslVersion < 330)
                )
            {
                GL.LineWidth(LineWidth);
            }
            renderer.SetFrame(frame);
            renderer.Requested.Mesh     = Mesh;
            renderer.Requested.MeshMode = MeshMode.EdgeLines;

            //  \todo Use renderstate
            GL.PolygonOffset(-1.0f, 1.0f);
            GL.Disable(EnableCap.PolygonOffsetFill);

            renderer.RenderCurrent();
        }
        private Urho3DBone[] BuildBones(IMeshSource skinnedMeshRenderer)
        {
            if (skinnedMeshRenderer == null || skinnedMeshRenderer.BonesCount == 0)
            {
                return(new Urho3DBone[0]);
            }
            //var unityBones = skinnedMeshRenderer.bones;
            var bones = new Urho3DBone[skinnedMeshRenderer.BonesCount];

            for (var index = 0; index < bones.Length; index++)
            {
                var bone        = new Urho3DBone();
                var unityBone   = skinnedMeshRenderer.GetBoneTransform(index);
                var parentIndex = skinnedMeshRenderer.GetBoneParent(index);
                if (parentIndex.HasValue)
                {
                    bone.parent = parentIndex.Value;
                }

                bone.name = unityBone.name ?? "bone" + index;
                //if (bone.parent != 0)
                //{
                bone.actualPos   = unityBone.localPosition;
                bone.actualRot   = unityBone.localRotation;
                bone.actualScale = unityBone.localScale;
                //}
                //else
                //{
                //    bone.actualPos = unityBone.position;
                //    bone.actualRot = unityBone.rotation;
                //    bone.actualScale = unityBone.lossyScale;
                //}

                bone.binding = skinnedMeshRenderer.GetBoneBindPose(index);
                bones[index] = bone;
            }

            return(bones);
        }
Beispiel #6
0
 public Batch(IMeshSource meshSource, Material material)
     : this(meshSource)
 {
     Material = material;
 }
        public void UpdateHover(Model renderModel, uint modelPolygonId)
        {
            HoverPolygon = null;
            if(renderModel != null)
            {
                if(HoverModel != renderModel)
                {
                    HoverModel = renderModel;
                    HoverGroup.Clear();
                    HoverGroup.Add(renderModel);
                }

                //if(Configuration.hoverDebug)
                {
                    PolygonIds.Clear();
                    PolygonIds.Add(modelPolygonId);

                    //  Temp debug code
                    IMeshSource meshSource = HoverModel.Batch.MeshSource;
                    if (meshSource is GeometryMesh original)
                    {
                        if (original.Geometry.PolygonAttributes.Contains<Vector3>("polygon_normals"))
                        {
                            if (modelPolygonId < original.Geometry.Polygons.Count)
                            {
                                HoverPolygon = original.Geometry.Polygons[(int)modelPolygonId];
#if true
                                //selectionMesh.Geometry = Geometry.Clone(original.Geometry, SelectedPolygonIds).Destination;
                                //selectionMesh.BuildMeshFromGeometry();
                                Frame hoverFrame = HoverModel.Frame;
                                Polygon polygon = HoverPolygon;
                                var polygonNormals = original.Geometry.PolygonAttributes.Find<Vector3>("polygon_normals");
                                var polygonCentroids = original.Geometry.PolygonAttributes.Find<Vector3>("polygon_centroids");
                                Vector3 normalInModel = polygonNormals[polygon];
                                Vector3 positionInModel = hoverFrame.LocalToWorld.InverseMatrix.TransformPoint(HoverPosition);
                                var pointLocations = original.Geometry.PointAttributes.Find<Vector3>("point_locations");
                                Corner pivotCorner = original.Geometry.ClosestPolygonCorner(polygon, positionInModel);
                                Point pivotPoint = pivotCorner.Point;

                                HoverPoint = pivotPoint;

                                Edge firstEdge;
                                Edge secondEdge;
                                original.Geometry.PolygonCornerEdges(polygon, pivotCorner, out firstEdge, out secondEdge);
                                Point firstEdgeOutPoint = firstEdge.Other(pivotPoint);
                                Point secondEdgeOutPoint = secondEdge.Other(pivotPoint);
                                Vector3 pivotLocation = hoverFrame.LocalToWorld.Matrix.TransformPoint(pointLocations[pivotPoint]);
                                Vector3 firstOutLocation = hoverFrame.LocalToWorld.Matrix.TransformPoint(pointLocations[firstEdgeOutPoint]);
                                Vector3 secondOutLocation = hoverFrame.LocalToWorld.Matrix.TransformPoint(pointLocations[secondEdgeOutPoint]);
                                Vector3 normal = hoverFrame.LocalToWorld.Matrix.TransformDirection(normalInModel);
                                Vector3 firstDirection = Vector3.Normalize(firstOutLocation - pivotLocation);
                                Vector3 secondDirection = Vector3.Normalize(secondOutLocation - pivotLocation);
                                Vector3 centroid = hoverFrame.LocalToWorld.Matrix.TransformPoint(polygonCentroids[polygon]);
                                if (Configuration.hoverDebug)
                                {
                                    lineRenderer.Begin();
                                    lineRenderer.Line(HoverPosition, HoverPosition + 0.5f * normal, new Vector4(1.0f, 1.0f, 1.0f, 1.0f));
                                    lineRenderer.Line(centroid, centroid + 0.25f * normal, new Vector4(0.5f, 0.5f, 0.5f, 1.0f));
                                    /*LineRenderer.Line(pivotLocation, pivotLocation + normal);
                                    LineRenderer.Line(pivotLocation - firstDirection * 1.0f, pivotLocation + firstDirection  * 1.0f);
                                    LineRenderer.Line(pivotLocation - secondDirection * 1.0f, pivotLocation + secondDirection * 1.0f);*/
                                    lineRenderer.End();
                                }
                            }
#endif
                        }
                    }
                }
            }
            else
            {
                if(HoverModel != null)
                {
                    HoverGroup.Clear();
                }
                HoverModel = null;
            }
        }
        private void WriteMesh(BinaryWriter writer, IMeshSource mesh)
        {
            writer.Write(Magic2);
            writer.Write(1);
            for (var vbIndex = 0; vbIndex < 1 /*_mesh.vertexBufferCount*/; ++vbIndex)
            {
                var positions   = mesh.Vertices;
                var normals     = mesh.Normals;
                var colors      = mesh.Colors;
                var tangents    = mesh.Tangents;
                var boneWeights = mesh.BoneWeights;
                var uvs         = mesh.TexCoords0;
                var uvs2        = mesh.TexCoords1;
                var uvs3        = mesh.TexCoords2;
                var uvs4        = mesh.TexCoords3;

                writer.Write(positions.Count);
                var elements = new List <MeshStreamWriter>();
                if (positions.Count > 0)
                {
                    elements.Add(new MeshVector3Stream(positions, VertexElementSemantic.SEM_POSITION));
                }
                if (normals.Count > 0)
                {
                    elements.Add(new MeshVector3Stream(normals, VertexElementSemantic.SEM_NORMAL));
                }
                if (boneWeights.Length > 0)
                {
                    var indices = new Vector4[boneWeights.Length];
                    var weights = new Vector4[boneWeights.Length];
                    for (var i = 0; i < boneWeights.Length; ++i)
                    {
                        indices[i] = new Vector4(boneWeights[i].boneIndex0, boneWeights[i].boneIndex1,
                                                 boneWeights[i].boneIndex2, boneWeights[i].boneIndex3);
                        weights[i] = new Vector4(boneWeights[i].weight0, boneWeights[i].weight1,
                                                 boneWeights[i].weight2, boneWeights[i].weight3);
                    }

                    elements.Add(new MeshVector4Stream(weights, VertexElementSemantic.SEM_BLENDWEIGHTS));
                    elements.Add(new MeshUByte4Stream(indices, VertexElementSemantic.SEM_BLENDINDICES));
                }

                if (colors.Count > 0)
                {
                    elements.Add(new MeshColor32Stream(colors, VertexElementSemantic.SEM_COLOR));
                }
                if (tangents.Count > 0)
                {
                    elements.Add(new MeshVector4Stream(FlipW(tangents), VertexElementSemantic.SEM_TANGENT));
                }
                if (uvs.Count > 0)
                {
                    elements.Add(new MeshUVStream(uvs, VertexElementSemantic.SEM_TEXCOORD));
                }
                if (uvs2.Count > 0)
                {
                    elements.Add(new MeshUVStream(uvs2, VertexElementSemantic.SEM_TEXCOORD, 1));
                }
                if (uvs3.Count > 0)
                {
                    elements.Add(new MeshUVStream(uvs3, VertexElementSemantic.SEM_TEXCOORD, 2));
                }
                if (uvs4.Count > 0)
                {
                    elements.Add(new MeshUVStream(uvs4, VertexElementSemantic.SEM_TEXCOORD, 3));
                }
                writer.Write(elements.Count);
                for (var i = 0; i < elements.Count; ++i)
                {
                    writer.Write(elements[i].Element);
                }
                var morphableVertexRangeStartIndex = 0;
                var morphableVertexCount           = 0;
                writer.Write(morphableVertexRangeStartIndex);
                writer.Write(morphableVertexCount);
                for (var index = 0; index < positions.Count; ++index)
                {
                    for (var i = 0; i < elements.Count; ++i)
                    {
                        elements[i].Write(writer, index);
                    }
                }
                var indicesPerSubMesh = new List <IList <int> >();
                var totalIndices      = 0;
                for (var subMeshIndex = 0; subMeshIndex < mesh.SubMeshCount; ++subMeshIndex)
                {
                    var indices = mesh.GetIndices(subMeshIndex);
                    indicesPerSubMesh.Add(indices);
                    totalIndices += indices.Count;
                }

                writer.Write(1);
                writer.Write(totalIndices);
                if (positions.Count < 65536)
                {
                    writer.Write(2);
                    for (var subMeshIndex = 0; subMeshIndex < mesh.SubMeshCount; ++subMeshIndex)
                    {
                        for (var i = 0; i < indicesPerSubMesh[subMeshIndex].Count; ++i)
                        {
                            writer.Write((ushort)indicesPerSubMesh[subMeshIndex][i]);
                        }
                    }
                }
                else
                {
                    writer.Write(4);
                    for (var subMeshIndex = 0; subMeshIndex < mesh.SubMeshCount; ++subMeshIndex)
                    {
                        for (var i = 0; i < indicesPerSubMesh[subMeshIndex].Count; ++i)
                        {
                            writer.Write(indicesPerSubMesh[subMeshIndex][i]);
                        }
                    }
                }

                writer.Write(indicesPerSubMesh.Count);
                totalIndices = 0;
                for (var subMeshIndex = 0; subMeshIndex < indicesPerSubMesh.Count; ++subMeshIndex)
                {
                    var numberOfBoneMappingEntries = 0;
                    writer.Write(numberOfBoneMappingEntries);
                    var numberOfLODLevels = 1;
                    writer.Write(numberOfLODLevels);
                    writer.Write(0.0f);
                    writer.Write((int)PrimitiveType.TRIANGLE_LIST);
                    writer.Write(0);
                    writer.Write(0);
                    writer.Write(totalIndices);
                    writer.Write(indicesPerSubMesh[subMeshIndex].Count);
                    totalIndices += indicesPerSubMesh[subMeshIndex].Count;
                }

                var numMorphTargets = 0;
                writer.Write(numMorphTargets);

                var bones      = BuildBones(mesh);
                var numOfBones = bones.Length;
                writer.Write(numOfBones);
                var boneIndex = 0;
                foreach (var bone in bones)
                {
                    WriteStringSZ(writer, _engine.DecorateName(bone.name));
                    writer.Write(bone.parent); //Parent
                    Write(writer, bone.actualPos);
                    Write(writer, bone.actualRot);
                    Write(writer, bone.actualScale);

                    var d = new[]
                    {
                        bone.binding.m00, bone.binding.m01, bone.binding.m02, bone.binding.m03,
                        bone.binding.m10, bone.binding.m11, bone.binding.m12, bone.binding.m13,
                        bone.binding.m20, bone.binding.m21, bone.binding.m22, bone.binding.m23
                    };
                    foreach (var v in d)
                    {
                        writer.Write(v);
                    }

                    using (var e = GetBoneVertices(boneWeights, boneIndex).GetEnumerator())
                    {
                        if (!e.MoveNext())
                        {
                            writer.Write((byte)3);
                            //R
                            writer.Write(0.1f);
                            //BBox
                            Write(writer, new Vector3(-0.1f, -0.1f, -0.1f));
                            Write(writer, new Vector3(0.1f, 0.1f, 0.1f));
                        }
                        else
                        {
                            var binding = bone.binding;
                            //binding = binding.inverse;
                            var center = binding.MultiplyPoint(positions[e.Current]);
                            var min    = center;
                            var max    = center;

                            while (e.MoveNext())
                            {
                                var originalPosition = positions[e.Current];
                                var p = binding.MultiplyPoint(originalPosition);
                                if (p.x < min.x)
                                {
                                    min.x = p.x;
                                }
                                if (p.y < min.y)
                                {
                                    min.y = p.y;
                                }
                                if (p.z < min.z)
                                {
                                    min.z = p.z;
                                }
                                if (p.x > max.x)
                                {
                                    max.x = p.x;
                                }
                                if (p.y > max.y)
                                {
                                    max.y = p.y;
                                }
                                if (p.z > max.z)
                                {
                                    max.z = p.z;
                                }
                            }

                            writer.Write((byte)3);
                            //R
                            writer.Write(Math.Max(max.magnitude, min.magnitude));
                            //BBox
                            Write(writer, min);
                            Write(writer, max);
                        }
                    }


                    ++boneIndex;
                }

                float minX, minY, minZ;
                float maxX, maxY, maxZ;
                maxX = maxY = maxZ = float.MinValue;
                minX = minY = minZ = float.MaxValue;
                for (var i = 0; i < positions.Count; ++i)
                {
                    if (minX > positions[i].x)
                    {
                        minX = positions[i].x;
                    }
                    if (minY > positions[i].y)
                    {
                        minY = positions[i].y;
                    }
                    if (minZ > positions[i].z)
                    {
                        minZ = positions[i].z;
                    }
                    if (maxX < positions[i].x)
                    {
                        maxX = positions[i].x;
                    }
                    if (maxY < positions[i].y)
                    {
                        maxY = positions[i].y;
                    }
                    if (maxZ < positions[i].z)
                    {
                        maxZ = positions[i].z;
                    }
                }

                writer.Write(minX);
                writer.Write(minY);
                writer.Write(minZ);
                writer.Write(maxX);
                writer.Write(maxY);
                writer.Write(maxZ);
            }
        }