public void HandleWheels() { if (!hasWheels) { string wheelsModFront = SourceFile.GetString("vehicle.wheels.front.model"); string wheelsModBack = SourceFile.GetString("vehicle.wheels.back.model"); double wheelsSuspFront = SourceFile.GetDouble("vehicle.wheels.front.suspension", 0.1).Value; double wheelsSuspBack = SourceFile.GetDouble("vehicle.wheels.back.suspension", 0.1).Value; Model mod = TheServer.Models.GetModel(model); if (mod == null) // TODO: mod should return a cube when all else fails? { return; } Model3D scene = mod.Original; if (scene == null) // TODO: Scene should return a cube when all else fails? { return; } SetOrientation(BEPUutilities.Quaternion.Identity); // TODO: Track and reset orientation maybe? List <Model3DNode> nodes = GetNodes(scene.RootNode); List <VehiclePartEntity> frontwheels = new List <VehiclePartEntity>(); Location centerOfMass = Location.Zero; double mass = 0; for (int i = 0; i < nodes.Count; i++) { string name = nodes[i].Name.ToLowerFast(); if (name.Contains("wheel")) { Matrix mat = nodes[i].MatrixA; mat.Transpose(); Model3DNode tnode = nodes[i].Parent; while (tnode != null) { Matrix mb = tnode.MatrixA; mb.Transpose(); mat = mat * mb; tnode = tnode.Parent; } centerOfMass += (new Location(mat.M41, -mat.M43, mat.M42) + offset) * 30; // TODO: Arbitrary constant mass += 30; // TODO: Arbitrary constant } else if (name.Contains("flap")) { Matrix mat = nodes[i].MatrixA; mat.Transpose(); Model3DNode tnode = nodes[i].Parent; while (tnode != null) { Matrix mb = tnode.MatrixA; mb.Transpose(); mat = mat * mb; tnode = tnode.Parent; } centerOfMass += (new Location(mat.M41, -mat.M43, mat.M42) + offset) * 20; // TODO: Arbitrary constant mass += 20; // TODO: Arbitrary constant } } if (mass > 0) { centerOfMass /= mass; } Body.CollisionInformation.LocalPosition = -centerOfMass.ToBVector() - CenterOfMassOffset.ToBVector(); ForceNetwork(); for (int i = 0; i < nodes.Count; i++) { string name = nodes[i].Name.ToLowerFast(); if (name.Contains("wheel")) { Matrix mat = nodes[i].MatrixA; mat.Transpose(); Model3DNode tnode = nodes[i].Parent; while (tnode != null) { Matrix mb = tnode.MatrixA; mb.Transpose(); mat = mat * mb; tnode = tnode.Parent; } Location pos = GetPosition() + new Location(Body.CollisionInformation.LocalPosition) + new Location(mat.M41, -mat.M43, mat.M42) + offset; // TODO: matrix gone funky? VehiclePartEntity wheel = new VehiclePartEntity(TheRegion, (name.After("wheel").Contains("f") ? wheelsModFront : wheelsModBack), true); wheel.SetPosition(pos); wheel.SetOrientation(BEPUutilities.Quaternion.Identity); wheel.Gravity = Gravity; wheel.CGroup = CGroup; wheel.SetMass(30); // TODO: Arbitrary constant wheel.mode = ModelCollisionMode.CONVEXHULL; TheRegion.SpawnEntity(wheel); wheel.ForceNetwork(); wheel.SetPosition(pos); wheel.SetOrientation(BEPUutilities.Quaternion.Identity); if (name.After("wheel").Contains("f")) { SteeringMotors.Add(ConnectWheel(wheel, false, true, wheelsSuspFront)); frontwheels.Add(wheel); } else if (name.After("wheel").Contains("b")) { DrivingMotors.Add(ConnectWheel(wheel, true, true, wheelsSuspBack)); } else { ConnectWheel(wheel, true, false, wheelsSuspBack); } wheel.Body.ActivityInformation.Activate(); } else if (name.Contains("flap")) { Matrix mat = nodes[i].MatrixA; mat.Transpose(); Model3DNode tnode = nodes[i].Parent; while (tnode != null) { Matrix mb = tnode.MatrixA; mb.Transpose(); mat = mat * mb; tnode = tnode.Parent; } Location pos = GetPosition() + new Location(Body.CollisionInformation.LocalPosition) + new Location(mat.M41, -mat.M43, mat.M42) + offset; // TODO: matrix gone funky? FDSSection flapDat = SourceFile.GetSection("vehicle.flaps").GetSection(name.After("flap").Replace("_", "")); VehiclePartEntity flap = new VehiclePartEntity(TheRegion, flapDat.GetString("model"), true); flap.SetPosition(pos); flap.SetOrientation(BEPUutilities.Quaternion.Identity); flap.Gravity = Gravity; flap.CGroup = CGroup; flap.SetMass(20); flap.mode = ModelCollisionMode.CONVEXHULL; TheRegion.SpawnEntity(flap); flap.ForceNetwork(); flap.SetPosition(pos); flap.SetOrientation(BEPUutilities.Quaternion.Identity); ConnectFlap(flap, flapDat); } } if (frontwheels.Count == 2) { JointSpinner js = new JointSpinner(frontwheels[0], frontwheels[1], new Location(1, 0, 0)); TheRegion.AddJoint(js); } hasWheels = true; } }
public void HandleWheels() { if (!hasWheels) { Model mod = TheServer.Models.GetModel(model); if (mod == null) // TODO: mod should return a cube when all else fails? { return; } Model3D scene = mod.Original; if (scene == null) // TODO: Scene should return a cube when all else fails? { return; } SetOrientation(Quaternion.Identity); List <Model3DNode> nodes = GetNodes(scene.RootNode); List <VehiclePartEntity> frontwheels = new List <VehiclePartEntity>(); for (int i = 0; i < nodes.Count; i++) { string name = nodes[i].Name.ToLowerFast(); if (name.Contains("wheel")) { Matrix mat = nodes[i].MatrixA; Model3DNode tnode = nodes[i].Parent; while (tnode != null) { mat = tnode.MatrixA * mat; tnode = tnode.Parent; } Location pos = GetPosition() + new Location(mat.M14, mat.M34, mat.M24) + offset; // NOTE: wtf happened to this matrix? VehiclePartEntity wheel = new VehiclePartEntity(TheRegion, "vehicles/" + vehName + "_wheel", true); wheel.SetPosition(pos); wheel.SetOrientation(Quaternion.Identity); wheel.Gravity = Gravity; wheel.CGroup = CGroup; wheel.SetMass(30); wheel.mode = ModelCollisionMode.CONVEXHULL; TheRegion.SpawnEntity(wheel); wheel.SetPosition(pos); if (name.After("wheel").StartsWith("f")) { SteeringMotors.Add(ConnectWheel(wheel, false, true)); frontwheels.Add(wheel); } else if (name.After("wheel").StartsWith("b")) { DrivingMotors.Add(ConnectWheel(wheel, true, true)); } else { ConnectWheel(wheel, true, false); } wheel.Body.ActivityInformation.Activate(); } } if (frontwheels.Count == 2) { JointSpinner js = new JointSpinner(frontwheels[0], frontwheels[1], new Location(1, 0, 0)); TheRegion.AddJoint(js); } hasWheels = true; } }
public void HandleWheels() { if (!hasWheels) { Model mod = TheServer.Models.GetModel(model); if (mod == null) // TODO: mod should return a cube when all else fails? { return; } Model3D scene = mod.Original; if (scene == null) // TODO: Scene should return a cube when all else fails? { return; } SetOrientation(Quaternion.Identity); List<Model3DNode> nodes = GetNodes(scene.RootNode); List<VehiclePartEntity> frontwheels = new List<VehiclePartEntity>(); for (int i = 0; i < nodes.Count; i++) { string name = nodes[i].Name.ToLowerFast(); if (name.Contains("wheel")) { Matrix mat = nodes[i].MatrixA; Model3DNode tnode = nodes[i].Parent; while (tnode != null) { mat = tnode.MatrixA * mat; tnode = tnode.Parent; } Location pos = GetPosition() + new Location(mat.M14, mat.M34, mat.M24) + offset; // NOTE: wtf happened to this matrix? VehiclePartEntity wheel = new VehiclePartEntity(TheRegion, "vehicles/" + vehName + "_wheel", true); wheel.SetPosition(pos); wheel.SetOrientation(Quaternion.Identity); wheel.Gravity = Gravity; wheel.CGroup = CGroup; wheel.SetMass(30); wheel.mode = ModelCollisionMode.CONVEXHULL; TheRegion.SpawnEntity(wheel); wheel.SetPosition(pos); if (name.After("wheel").StartsWith("f")) { SteeringMotors.Add(ConnectWheel(wheel, false, true)); frontwheels.Add(wheel); } else if (name.After("wheel").StartsWith("b")) { DrivingMotors.Add(ConnectWheel(wheel, true, true)); } else { ConnectWheel(wheel, true, false); } wheel.Body.ActivityInformation.Activate(); } } if (frontwheels.Count == 2) { JointSpinner js = new JointSpinner(frontwheels[0], frontwheels[1], new Location(1, 0, 0)); TheRegion.AddJoint(js); } hasWheels = true; } }