private void CreateSea() { Mesh mesh = new Mesh(); MeshBuffer mb = new MeshBuffer(VertexType.Standard); for (int h = 0; h < TILE_H_NUMBER; h++) { for (int w = 0; w < TILE_W_NUMBER; w++) { mb.SetVertex((uint)(h * TILE_H_NUMBER + TILE_W_NUMBER), new Vertex3D( new Vector3D(w * TILE_SPAN, h * TILE_SPAN, 19.8f), new Vector3D(0, 0, 1), Color.White, new Vector2D((float)w / TILE_W_NUMBER, (float)h / TILE_H_NUMBER) )); } } uint index = 0; for (int h = 0; h < (int)(TILE_H_NUMBER - 1); h++) { for (int w = 0; w < (int)(TILE_W_NUMBER - 1); w++) { mb.SetIndex(index++, (ushort)((h + 0) * TILE_H_NUMBER + (w + 0))); mb.SetIndex(index++, (ushort)((h + 0) * TILE_H_NUMBER + (w + 1))); mb.SetIndex(index++, (ushort)((h + 1) * TILE_H_NUMBER + (w + 0))); mb.SetIndex(index++, (ushort)((h + 1) * TILE_H_NUMBER + (w + 0))); mb.SetIndex(index++, (ushort)((h + 0) * TILE_H_NUMBER + (w + 1))); mb.SetIndex(index++, (ushort)((h + 1) * TILE_H_NUMBER + (w + 1))); } } mb.Material.Texture1 = Render.Texture.GetTexture(Path.Combine(dir, "sea.jpg")); mb.Material.BackfaceCulling = false; mesh.AddMeshBuffer(mb); MeshSceneNode node = Render.Scene.AddMeshSceneNode(mesh, Root, -1); node.Position = new Vector3D(-(TILE_W_NUMBER * TILE_SPAN / 2), -(TILE_H_NUMBER * TILE_SPAN / 2), 0); node.AutomaticCulling = CullingType.Off; }
private Mesh CreateMesh(MeshData[] meshes) { Mesh mesh = new Mesh(); foreach (MeshData data in meshes) { if (data == null) continue; bool use_alpha = (data.Color[0] < 0.9999f); MeshBuffer mb = new MeshBuffer(VertexType.Standard); for (uint i = 0; i < data.Indices.Length; i++) { VertexData v = data.Vertices[data.Indices[i]]; mb.SetVertex(i, new Vertex3D( new Vector3D(v.Position[0], v.Position[1], v.Position[2]), new Vector3D(v.Normal[0], v.Normal[1], v.Normal[2]), Color.White, new Vector2D(v.UV[0], v.UV[1]) )); mb.SetIndex(i, (ushort)data.Indices[i]); } mb.SetColor(Util.ToColor(data.Color[0], data.Color[1], data.Color[2], data.Color[3])); mb.Material.AmbientColor = Util.ToColor(1, data.Color[1], data.Color[2], data.Color[3]); TextureInfo info = null; if (data.Texture1DownLoaded) info = Render.Texture.GetTexture(Path.Combine(Ox.Paths.Cache, data.Texture1), true, true); if (info != null) { mb.Material.Texture1 = (info.Texture == null) ? Render.RenderData.BlankTexture : info.Texture; use_alpha |= info.UseAlpha; } mb.Material.MaterialType = use_alpha ? MaterialType.TransparentAlphaChannel : MaterialType.Solid; mesh.AddMeshBuffer(mb); } return mesh; }
// experimental - build sculpt mesh using indexed access to vertex, normal, and UV lists private static Mesh SculptMeshToIrrMesh(SculptMesh sculptMesh) { Color color = new Color(255, 255, 255, 255); Mesh mesh = new Mesh(); int numFaces = sculptMesh.faces.Count; MeshBuffer mb = new MeshBuffer(VertexType.Standard); int numVerts = sculptMesh.coords.Count; try { for (int i = 0; i < numVerts; i++) mb.SetVertex((uint)i, new Vertex3D(convVect3d(sculptMesh.coords[i]), convNormal(sculptMesh.normals[i]), color, convVect2d(sculptMesh.uvs[i]))); ushort index = 0; foreach (Face face in sculptMesh.faces) { mb.SetIndex(index++, (ushort)face.v1); mb.SetIndex(index++, (ushort)face.v3); mb.SetIndex(index++, (ushort)face.v2); } mesh.AddMeshBuffer(mb); // don't dispose here //mb.Dispose(); } catch (AccessViolationException) { VUtil.LogConsole("[ACCESSVIOLATION]", "PrimMesherG::SCultMeshToIrrMesh"); m_log.Error("ACCESSVIOLATION"); mesh = null; } return mesh; }