public CarMesh(MeshChunk meshChunk, BitmapChunk bmpChunk, Color brakeColor) : base(meshChunk, bmpChunk) { foreach (var poly in _polys) { switch (poly.Label) { case "rt_rear": _rightRearWheel = poly; break; case "lt_rear": _leftRearWheel = poly; break; case "rt_frnt": _rightFrontWheel = poly; break; case "lt_frnt": _leftFrontWheel = poly; break; case "bkll": _leftBrakeLight = poly; break; case "bklr": _rightBrakeLight = poly; break; } } var tyreEntry = bmpChunk.FindByName("tyr1"); if (tyreEntry != null) _wheelTexture = tyreEntry.Texture; // This seems like it should be done in a shader but I couldn't get it to work well enough // (dealing with original paletted colors doesn't work so well in a texture stretched over a polygon) var rsidPoly = _polys.FirstOrDefault(a => a.TextureName == "rsid"); if (rsidPoly != null) { // Generate a new texture for brake lights on. Color[] pixels = new Color[rsidPoly.Texture.Width * rsidPoly.Texture.Height]; rsidPoly.Texture.GetData<Color>(pixels); for (int i = 0; i < pixels.Length; i++) { if (pixels[i] == brakeColor) pixels[i] = BrakeOnColor; } _brakeOnTexture = new Texture2D(Engine.Instance.Device, rsidPoly.Texture.Width, rsidPoly.Texture.Height); _brakeOnTexture.SetData<Color>(pixels); // Generate a new texture for brake lights off. for (int i = 0; i < pixels.Length; i++) { if (pixels[i] == BrakeOnColor) pixels[i] = BrakeOffColor; } _brakeOffTexture = new Texture2D(Engine.Instance.Device, _leftBrakeLight.Texture.Width, _leftBrakeLight.Texture.Height); _brakeOffTexture.SetData<Color>(pixels); } }
public void Resolve(BitmapChunk bitmapChunk) { if (_vertexBuffer != null) return; //already resolved int vertCount = 0; List<VertexPositionTexture> allVerts = new List<VertexPositionTexture>(); foreach (Polygon poly in _polys) { if (poly.TextureName != null) { poly.ResolveTexture(bitmapChunk.FindByName(poly.TextureName)); } poly.VertexBufferIndex = vertCount; vertCount += poly.VertexCount; allVerts.AddRange(poly.GetVertices()); } _vertexBuffer = new VertexBuffer(Engine.Instance.Device, typeof(VertexPositionTexture), vertCount, BufferUsage.WriteOnly); _vertexBuffer.SetData<VertexPositionTexture>(allVerts.ToArray()); }