private void BindMesh(ModelEntity modelEntity, int index, Matrix4?matrix = null, TextureBinder textureBinder = null, bool updateMeshData = true) { var mesh = GetMesh(index); if (mesh == null) { return; } if (updateMeshData) { var numTriangles = modelEntity.Triangles.Length; var elementCount = numTriangles * 3 * 3; var baseIndex = 0; var positionList = new float[elementCount]; var normalList = new float[elementCount]; var colorList = new float[elementCount]; var uvList = new float[elementCount]; for (var t = 0; t < numTriangles; t++) { var triangle = modelEntity.Triangles[t]; for (var i = 0; i < 3; i++) { var index1 = baseIndex++; var index2 = baseIndex++; var index3 = baseIndex++; var vertex = triangle.Vertices[i]; positionList[index1] = vertex.X; positionList[index2] = vertex.Y; positionList[index3] = vertex.Z; var normal = triangle.Normals[i]; normalList[index1] = normal.X; normalList[index2] = normal.Y; normalList[index3] = normal.Z; var color = triangle.Colors[i]; colorList[index1] = color.R; colorList[index2] = color.G; colorList[index3] = color.B; var uv = triangle.Uv[i]; uvList[index1] = uv.X; uvList[index2] = uv.Y; uvList[index3] = uv.Z; } } mesh.SetData(numTriangles * 3, positionList, normalList, colorList, uvList); } mesh.WorldMatrix = matrix ?? modelEntity.WorldMatrix; if (textureBinder != null) { mesh.Texture = modelEntity.Texture != null?textureBinder.GetTexture(modelEntity.TexturePage) : 0; } }
private void BindMesh(ModelEntity modelEntity, Matrix4?matrix = null, TextureBinder textureBinder = null, bool updateMeshData = true, Vector3[] initialVertices = null, Vector3[] initialNormals = null, Vector3[] finalVertices = null, Vector3[] finalNormals = null, float?interpolator = null) { if (!modelEntity.Visible) { return; } var mesh = GetMesh(_modelIndex++); if (mesh == null) { return; } //var rootEntity = modelEntity.ParentEntity as RootEntity; //todo mesh.WorldMatrix = matrix ?? modelEntity.WorldMatrix; if (updateMeshData) { var numTriangles = modelEntity.Triangles.Length; var elementCount = numTriangles * 3 * 3; var baseIndex = 0; var positionList = new float[elementCount]; var normalList = new float[elementCount]; var colorList = new float[elementCount]; var uvList = new float[elementCount]; for (var t = 0; t < numTriangles; t++) { var lastVertex = Vector3.Zero; var lastNormal = Vector3.Zero; var lastColor = Color.White; var lastUv = Vector3.Zero; var triangle = modelEntity.Triangles[t]; for (var i = 0; i < 3; i++) { var index1 = baseIndex++; var index2 = baseIndex++; var index3 = baseIndex++; var sourceVertex = triangle.Vertices[i]; if (triangle.AttachedIndices != null) { var attachedIndex = triangle.AttachedIndices[i]; if (attachedIndex != uint.MaxValue) { if (!_scene.AutoAttach) { sourceVertex = new Vector3(DiscardValue, DiscardValue, DiscardValue); } } } Vector3 vertex; if (_scene.VibRibbonWireframe && i == 2) { vertex = lastVertex; } else { if (initialVertices != null && finalVertices != null && triangle.OriginalVertexIndices[i] < finalVertices.Length) { var initialVertex = sourceVertex + initialVertices[triangle.OriginalVertexIndices[i]]; var finalVertex = sourceVertex + finalVertices[triangle.OriginalVertexIndices[i]]; vertex = Vector3.Lerp(initialVertex, finalVertex, interpolator.GetValueOrDefault()); } else { vertex = sourceVertex; } } positionList[index1] = vertex.X; positionList[index2] = vertex.Y; positionList[index3] = vertex.Z; Vector3 normal; if (_scene.VibRibbonWireframe && i == 2) { normal = lastNormal; } else { if (initialNormals != null && finalNormals != null && triangle.OriginalNormalIndices[i] < finalNormals.Length) { var initialNormal = triangle.Normals[i] + initialNormals[triangle.OriginalNormalIndices[i]] / 4096f; var finalNormal = triangle.Normals[i] + finalNormals[triangle.OriginalNormalIndices[i]] / 4096f; normal = Vector3.Lerp(initialNormal, finalNormal, interpolator.GetValueOrDefault()); } else { normal = triangle.Normals[i]; } } normalList[index1] = normal.X; normalList[index2] = normal.Y; normalList[index3] = normal.Z; Color color; if (_scene.VibRibbonWireframe && i == 2) { color = lastColor; } else { color = triangle.Colors[i]; } colorList[index1] = color.R; colorList[index2] = color.G; colorList[index3] = color.B; Vector3 uv; if (_scene.VibRibbonWireframe && i == 2) { uv = lastUv; } else { uv = triangle.Uv[i]; } uvList[index1] = uv.X; uvList[index2] = uv.Y; uvList[index3] = uv.Z; lastVertex = vertex; lastNormal = normal; lastColor = color; lastUv = uv; } } mesh.SetData(numTriangles * 3, positionList, normalList, colorList, uvList); } if (textureBinder != null) { mesh.Texture = modelEntity.Texture != null?textureBinder.GetTexture((int)modelEntity.TexturePage) : 0; } }
public void BindCube(Matrix4 matrix, Color color, Vector3 center, Vector3 size, int index, TextureBinder textureBinder = null, bool updateMeshData = true) { var mesh = GetMesh(index); if (mesh == null) { return; } if (updateMeshData) { const int numTriangles = 12; const int elementCount = numTriangles * 3 * 3; var baseIndex = 0; var positionList = new float[elementCount]; var normalList = new float[elementCount]; var colorList = new float[elementCount]; var uvList = new float[elementCount]; var vertices = new[] { center.X - size.X, center.Y - size.Y, center.Z - size.Z, center.X - size.X, center.Y - size.Y, center.Z + size.Z, center.X + size.X, center.Y - size.Y, center.Z + size.Z, center.X - size.X, center.Y - size.Y, center.Z - size.Z, center.X + size.X, center.Y - size.Y, center.Z + size.Z, center.X + size.X, center.Y - size.Y, center.Z - size.Z, center.X - size.X, center.Y + size.Y, center.Z - size.Z, center.X + size.X, center.Y + size.Y, center.Z - size.Z, center.X + size.X, center.Y + size.Y, center.Z + size.Z, center.X - size.X, center.Y + size.Y, center.Z - size.Z, center.X + size.X, center.Y + size.Y, center.Z + size.Z, center.X - size.X, center.Y + size.Y, center.Z + size.Z, center.X + size.X, center.Y - size.Y, center.Z + size.Z, center.X - size.X, center.Y - size.Y, center.Z + size.Z, center.X - size.X, center.Y + size.Y, center.Z + size.Z, center.X + size.X, center.Y - size.Y, center.Z + size.Z, center.X - size.X, center.Y + size.Y, center.Z + size.Z, center.X + size.X, center.Y + size.Y, center.Z + size.Z, center.X - size.X, center.Y - size.Y, center.Z - size.Z, center.X + size.X, center.Y - size.Y, center.Z - size.Z, center.X + size.X, center.Y + size.Y, center.Z - size.Z, center.X - size.X, center.Y - size.Y, center.Z - size.Z, center.X + size.X, center.Y + size.Y, center.Z - size.Z, center.X - size.X, center.Y + size.Y, center.Z - size.Z, center.X + size.X, center.Y - size.Y, center.Z - size.Z, center.X + size.X, center.Y - size.Y, center.Z + size.Z, center.X + size.X, center.Y + size.Y, center.Z + size.Z, center.X + size.X, center.Y - size.Y, center.Z - size.Z, center.X + size.X, center.Y + size.Y, center.Z + size.Z, center.X + size.X, center.Y + size.Y, center.Z - size.Z, center.X - size.X, center.Y - size.Y, center.Z + size.Z, center.X - size.X, center.Y - size.Y, center.Z - size.Z, center.X - size.X, center.Y + size.Y, center.Z - size.Z, center.X - size.X, center.Y - size.Y, center.Z + size.Z, center.X - size.X, center.Y + size.Y, center.Z - size.Z, center.X - size.X, center.Y + size.Y, center.Z + size.Z }; for (var t = 0; t < numTriangles; t++) { for (var i = 0; i < 3; i++) { var index1 = baseIndex++; var index2 = baseIndex++; var index3 = baseIndex++; positionList[index1] = vertices[index1]; positionList[index2] = vertices[index2]; positionList[index3] = vertices[index3]; normalList[index1] = 0f; normalList[index2] = 0f; normalList[index3] = 0f; colorList[index1] = color.R; colorList[index2] = color.G; colorList[index3] = color.B; uvList[index1] = 0f; uvList[index2] = 0f; uvList[index3] = 0f; } } mesh.SetData(numTriangles * 3, positionList, normalList, colorList, uvList); } mesh.WorldMatrix = matrix; if (textureBinder != null) { mesh.Texture = textureBinder.GetTexture(0); } }