private static int CreateElement(TrainManager.Train Train, double Left, double Top, double Width, double Height, double FullWidth, double FullHeight, double WorldLeft, double WorldTop, double WorldWidth, double WorldHeight, double WorldZ, double DriverX, double DriverY, double DriverZ, Textures.Texture Texture, Color32 Color, bool AddStateToLastElement) {
// create object
ObjectManager.StaticObject Object = new ObjectManager.StaticObject();
Vector3[] v = new Vector3[4];
double sx = 0.5 * WorldWidth * Width / FullWidth;
double sy = 0.5 * WorldHeight * Height / FullHeight;
v[0] = new Vector3(-sx, -sy, 0);
v[1] = new Vector3(-sx, sy, 0);
v[2] = new Vector3(sx, sy, 0);
v[3] = new Vector3(sx, -sy, 0);
World.Vertex t0 = new World.Vertex(v[0], new Vector2(0.0f, 1.0f));
World.Vertex t1 = new World.Vertex(v[1], new Vector2(0.0f, 0.0f));
World.Vertex t2 = new World.Vertex(v[2], new Vector2(1.0f, 0.0f));
World.Vertex t3 = new World.Vertex(v[3], new Vector2(1.0f, 1.0f));
Object.Mesh.Vertices = new World.Vertex[] { t0, t1, t2, t3 };
Object.Mesh.Faces = new World.MeshFace[] { new World.MeshFace(new int[] { 0, 1, 2, 3 }) };
Object.Mesh.Materials = new World.MeshMaterial[1];
Object.Mesh.Materials[0].Flags = Texture != null ? (byte)World.MeshMaterial.TransparentColorMask : (byte)0;
Object.Mesh.Materials[0].Color = Color;
Object.Mesh.Materials[0].TransparentColor = new Color24(0, 0, 255);
Object.Mesh.Materials[0].DaytimeTexture = Texture;
Object.Mesh.Materials[0].NighttimeTexture = null;
Object.Dynamic = true;
// calculate offset
Vector3 o;
o.X = WorldLeft + sx + WorldWidth * Left / FullWidth;
o.Y = WorldTop - sy - WorldHeight * Top / FullHeight;
o.Z = WorldZ;
// add object
if (AddStateToLastElement) {
int n = Train.Cars[Train.DriverCar].CarSections[0].Elements.Length - 1;
int j = Train.Cars[Train.DriverCar].CarSections[0].Elements[n].States.Length;
Array.Resize<ObjectManager.AnimatedObjectState>(ref Train.Cars[Train.DriverCar].CarSections[0].Elements[n].States, j + 1);
Train.Cars[Train.DriverCar].CarSections[0].Elements[n].States[j].Position = o;
Train.Cars[Train.DriverCar].CarSections[0].Elements[n].States[j].Object = Object;
return n;
} else {
int n = Train.Cars[Train.DriverCar].CarSections[0].Elements.Length;
Array.Resize<ObjectManager.AnimatedObject>(ref Train.Cars[Train.DriverCar].CarSections[0].Elements, n + 1);
Train.Cars[Train.DriverCar].CarSections[0].Elements[n] = new ObjectManager.AnimatedObject();
Train.Cars[Train.DriverCar].CarSections[0].Elements[n].States = new ObjectManager.AnimatedObjectState[1];
Train.Cars[Train.DriverCar].CarSections[0].Elements[n].States[0].Position = o;
Train.Cars[Train.DriverCar].CarSections[0].Elements[n].States[0].Object = Object;
Train.Cars[Train.DriverCar].CarSections[0].Elements[n].CurrentState = 0;
Train.Cars[Train.DriverCar].CarSections[0].Elements[n].ObjectIndex = ObjectManager.CreateDynamicObject();
ObjectManager.Objects[Train.Cars[Train.DriverCar].CarSections[0].Elements[n].ObjectIndex] = ObjectManager.CloneObject(Object);
return n;
}
}