public static void BuildDecalForObject(DecalGenerator generator, Transform decal, Transform affectedObject) { Mesh affectedMesh = affectedObject.GetComponent<MeshFilter>().sharedMesh; if (affectedMesh == null) return; float maxAngle = generator.maxAngle; Plane right = new Plane(Vector3.right, Vector3.right / 2f); Plane left = new Plane(-Vector3.right, -Vector3.right / 2f); Plane top = new Plane(Vector3.up, Vector3.up / 2f); Plane bottom = new Plane(-Vector3.up, -Vector3.up / 2f); Plane front = new Plane(Vector3.forward, Vector3.forward / 2f); Plane back = new Plane(-Vector3.forward, -Vector3.forward / 2f); Vector3[] vertices = affectedMesh.vertices; int[] triangles = affectedMesh.triangles; int startVertexCount = bufVertices.Count; Matrix4x4 matrix = decal.worldToLocalMatrix * affectedObject.transform.localToWorldMatrix; for (int i = 0; i < triangles.Length; i += 3) { int i1 = triangles[i]; int i2 = triangles[i + 1]; int i3 = triangles[i + 2]; Vector3 v1 = matrix.MultiplyPoint(vertices[i1]); Vector3 v2 = matrix.MultiplyPoint(vertices[i2]); Vector3 v3 = matrix.MultiplyPoint(vertices[i3]); Vector3 side1 = v2 - v1; Vector3 side2 = v3 - v1; Vector3 normal = Vector3.Cross(side1, side2).normalized; if (Vector3.Angle(-Vector3.forward, normal) >= maxAngle) continue; DecalPolygon poly = new DecalPolygon(v1, v2, v3); poly = DecalPolygon.ClipPolygon(poly, right); if (poly == null) continue; poly = DecalPolygon.ClipPolygon(poly, left); if (poly == null) continue; poly = DecalPolygon.ClipPolygon(poly, top); if (poly == null) continue; poly = DecalPolygon.ClipPolygon(poly, bottom); if (poly == null) continue; poly = DecalPolygon.ClipPolygon(poly, front); if (poly == null) continue; poly = DecalPolygon.ClipPolygon(poly, back); if (poly == null) continue; AddPolygon(poly, normal); } GenerateTexCoords(startVertexCount, generator.sprite); }
public override string GenerateSharedPixelShader(ShaderStage stage, int methodIndex, int optionIndex) { var gen = new DecalGenerator(); var bytecode = gen.GenerateSharedPixelShader(stage, methodIndex, optionIndex).Bytecode; return(D3DCompiler.Disassemble(bytecode)); }
public override string GenerateSharedVertexShader(VertexType vertex, ShaderStage stage) { var gen = new DecalGenerator(); var bytecode = gen.GenerateSharedVertexShader(vertex, stage).Bytecode; return(D3DCompiler.Disassemble(bytecode)); }
public override string GeneratePixelShader(ShaderStage stage, List <int> shaderOptions) { var albedo = (Albedo)shaderOptions[0]; var blend_mode = (Blend_Mode)shaderOptions[1]; var render_pass = (Render_Pass)shaderOptions[2]; var specular = (Specular)shaderOptions[3]; var bump_mapping = (Bump_Mapping)shaderOptions[4]; var tinting = (Tinting)shaderOptions[5]; var gen = new DecalGenerator(albedo, blend_mode, render_pass, specular, bump_mapping, tinting); var bytecode = gen.GeneratePixelShader(stage).Bytecode; return(D3DCompiler.Disassemble(bytecode)); }