public void ModifyMeshBuffer(Color4 coldata, float shinyval, int j, Mesh mesh, Primitive.TextureEntryFace teface, bool alpha) { MeshBuffer mb = mesh.GetMeshBuffer(j); // If it's an alpha texture, ensure Irrlicht knows or you get artifacts. if (alpha) { mb.Material.MaterialType = MaterialType.TransparentAlphaChannel; } // Create texture transform based on the UV transforms specified in the texture entry IrrlichtNETCP.Matrix4 mat = mb.Material.Layer1.TextureMatrix; mat = IrrlichtNETCP.Matrix4.buildTextureTransform(teface.Rotation, new Vector2D(-0.5f, -0.5f * teface.RepeatV), new Vector2D(0.5f + teface.OffsetU, -(0.5f + teface.OffsetV)), new Vector2D(teface.RepeatU, teface.RepeatV)); mb.Material.Layer1.TextureMatrix = mat; mb.Material.ZWriteEnable = true; mb.Material.BackfaceCulling = (this.texDownloadStyle == TextureDownloadStyle.TEX_DOWNLOAD_ASSETSERVER); if (coldata.A != 1) { coldata.R *= coldata.A; coldata.B *= coldata.A; coldata.G *= coldata.A; } if (coldata.R != 1 || coldata.G != 1 || coldata.B != 1) mb.SetColor(new Color( Util.Clamp<int>((int)(coldata.A * 255), 0, 255), Util.Clamp<int>((int)(coldata.R * 255), 0, 255), Util.Clamp<int>((int)(coldata.G * 255), 0, 255), Util.Clamp<int>((int)(coldata.B * 255), 0, 255) )); // If it's partially translucent inform Irrlicht if (coldata.A != 1) { mb.Material.MaterialType = MaterialType.TransparentVertexAlpha; mb.Material.Lighting = false; } else { mb.Material.Lighting = false; //mb.Material.Lighting = !teface.Fullbright; if (shinyval > 0) { if (newMaterialType1 != -1) { mb.Material.MaterialType = (MaterialType)newMaterialType1; mb.Material.Lighting = false; } } } }
private static Mesh FacesToIrrMesh(List<ViewerFace> viewerFaces, int numPrimFaces) { Color color = new Color(255, 255, 255, 255); Mesh mesh; try { mesh = new Mesh(); } catch (IndexOutOfRangeException) { return null; } int numViewerFaces = viewerFaces.Count; MeshBuffer[] mb = new MeshBuffer[numPrimFaces]; for (int i = 0; i < mb.Length; i++) mb[i] = new MeshBuffer(VertexType.Standard); try { uint[] index = new uint[mb.Length]; for (int i = 0; i < index.Length; i++) index[i] = 0; for (uint i = 0; i < numViewerFaces; i++) { ViewerFace vf = viewerFaces[(int)i]; try { mb[vf.primFaceNumber].SetVertex(index[vf.primFaceNumber], new Vertex3D(convVect3d(vf.v1), convNormal(vf.n1), color, convVect2d(vf.uv1))); mb[vf.primFaceNumber].SetVertex(index[vf.primFaceNumber] + 1, new Vertex3D(convVect3d(vf.v2), convNormal(vf.n2), color, convVect2d(vf.uv2))); mb[vf.primFaceNumber].SetVertex(index[vf.primFaceNumber] + 2, new Vertex3D(convVect3d(vf.v3), convNormal(vf.n3), color, convVect2d(vf.uv3))); } catch (OutOfMemoryException) { return null; } catch (IndexOutOfRangeException) { return null; } mb[vf.primFaceNumber].SetIndex(index[vf.primFaceNumber], (ushort)index[vf.primFaceNumber]); mb[vf.primFaceNumber].SetIndex(index[vf.primFaceNumber] + 1, (ushort)(index[vf.primFaceNumber] + 2)); mb[vf.primFaceNumber].SetIndex(index[vf.primFaceNumber] + 2, (ushort)(index[vf.primFaceNumber] + 1)); index[vf.primFaceNumber] += 3; } for (int i = 0; i < mb.Length; i++) { mesh.AddMeshBuffer(mb[i]); } Box3D box = new Box3D(0, 0, 0, 0, 0, 0); for (int i = 0; i < mesh.MeshBufferCount; i++) { mesh.GetMeshBuffer(i).RecalculateBoundingBox(); box.AddInternalBox(mesh.GetMeshBuffer(i).BoundingBox); } mesh.BoundingBox = box; // don't dispose here //mb.Dispose(); } catch (AccessViolationException) { VUtil.LogConsole("[ACCESSVIOLATION]", "PrimMesherG::FacesToIrrMesh"); mesh = null; } return mesh; }