public void Add(MyTriangle_Vertex_Normals triangle, Vector3 normal, ref MyPlane rightPlane, ref MyPlane upPlane, float decalScale, float decalSize, int remainingTrianglesOfThisDecal, Vector4 color, bool alphaBlendByAngle, float lightSize, Vector3 position, float emissivity) { // We can't add triangles while fading out //if (m_status == MyDecalsBufferState.FADING_OUT) return; MyDecalTriangle decalTriangle = m_freeTriangles.Pop(); decalTriangle.Start(lightSize); decalTriangle.Emissivity = emissivity; //decalTriangle.RandomOffset = MyMwcUtils.GetRandomFloat(0.0f, MathHelper.Pi); decalTriangle.RandomOffset = MyMinerGame.TotalGamePlayTimeInMilliseconds; decalTriangle.Position = position; // We must repack vertex positions before copying to new triange, to avoid Z-fight. decalTriangle.Position0 = VF_Packer.RepackModelPosition(ref triangle.Vertexes.Vertex0); decalTriangle.Position1 = VF_Packer.RepackModelPosition(ref triangle.Vertexes.Vertex1); decalTriangle.Position2 = VF_Packer.RepackModelPosition(ref triangle.Vertexes.Vertex2); // Texture coords decalTriangle.TexCoord0 = new Vector2( 0.5f + decalScale * MyUtils.GetDistanceFromPointToPlane(ref decalTriangle.Position0, ref rightPlane), 0.5f + decalScale * MyUtils.GetDistanceFromPointToPlane(ref decalTriangle.Position0, ref upPlane)); decalTriangle.TexCoord1 = new Vector2( 0.5f + decalScale * MyUtils.GetDistanceFromPointToPlane(ref decalTriangle.Position1, ref rightPlane), 0.5f + decalScale * MyUtils.GetDistanceFromPointToPlane(ref decalTriangle.Position1, ref upPlane)); decalTriangle.TexCoord2 = new Vector2( 0.5f + decalScale * MyUtils.GetDistanceFromPointToPlane(ref decalTriangle.Position2, ref rightPlane), 0.5f + decalScale * MyUtils.GetDistanceFromPointToPlane(ref decalTriangle.Position2, ref upPlane)); // Alpha decalTriangle.Color0 = color; decalTriangle.Color1 = color; decalTriangle.Color2 = color; if (alphaBlendByAngle) { decalTriangle.Color0.W = GetAlphaByAngleDiff(ref normal, ref triangle.Normals.Normal0); decalTriangle.Color1.W = GetAlphaByAngleDiff(ref normal, ref triangle.Normals.Normal1); decalTriangle.Color2.W = GetAlphaByAngleDiff(ref normal, ref triangle.Normals.Normal2); } AdjustAlphaByDistance(normal, decalSize, position, decalTriangle); // Bump mapping decalTriangle.Normal0 = triangle.Normals.Normal0; decalTriangle.Normal1 = triangle.Normals.Normal1; decalTriangle.Normal2 = triangle.Normals.Normal2; decalTriangle.Binormal0 = triangle.Binormals.Normal0; decalTriangle.Binormal1 = triangle.Binormals.Normal1; decalTriangle.Binormal2 = triangle.Binormals.Normal2; decalTriangle.Tangent0 = triangle.Tangents.Normal0; decalTriangle.Tangent1 = triangle.Tangents.Normal1; decalTriangle.Tangent2 = triangle.Tangents.Normal2; decalTriangle.RemainingTrianglesOfThisDecal = remainingTrianglesOfThisDecal; m_trianglesQueue.Enqueue(decalTriangle); }