/// <summary> /// Initialize all the meshes<para/> /// Инициализация всех моделей /// </summary> public static void Init() { // Initialize collections // Создание коллекций Collisions = new Dictionary<int, CollisionFile.Group>(); NamedCollisions = new Dictionary<string, CollisionFile.Group>(); // Looping through associated files // Проход через ассоциированные файлы foreach (string file in FileManager.CollisionFiles) { string ffile = PathManager.GetAbsolute(file); if (File.Exists(ffile)) { CollisionFile cf = new CollisionFile(ffile); foreach (CollisionFile.Group g in cf.Collisions) { bool addToIndexed = false; if (g.ID<ObjectManager.Definitions.Length) { if (ObjectManager.Definitions[g.ID]!=null) { if (ObjectManager.Definitions[g.ID].ModelName == g.Name) { addToIndexed = true; } } } // Add mesh to indexed list or model-oriented // Добавление меша либо в список if (addToIndexed) { if (!Collisions.ContainsKey(g.ID)) { Collisions.Add(g.ID, g); } }else{ if (!NamedCollisions.ContainsKey(g.Name)) { NamedCollisions.Add(g.Name, g); } } } }else{ Dev.Console.Log("[CollisionManager] Unable to locate collision archive: "+file); } } }
/// <summary> /// Create new StaticCollider from existing collision data<para/> /// Создание нового коллайдера из существующих данных /// </summary> /// <param name="colmesh">Collision data<para/>Данные о коллизиях</param> public StaticCollider(CollisionFile.Group colmesh, Vector3 position, Quaternion angles, Vector3 scale) { // Create base transformation matrix // Создание базовой матрицы трансформации Matrix4 mat = Matrix4.CreateScale(scale) * Matrix4.CreateFromQuaternion(angles) * Matrix4.CreateTranslation(position); // Create bodies // Создание тел List<CollisionEntry> col = new List<CollisionEntry>(); // Spheres // Сферы if (colmesh.Spheres!=null) { foreach (CollisionFile.Sphere s in colmesh.Spheres) { // Transforming positions to world coordinates // Трансформация расположения в мировые координаты Vector3 pos = Vector3.TransformPosition(s.Center, mat); float radius = Vector3.TransformVector(Vector3.UnitX * s.Radius, mat).Length; // Create primitive // Создание примитива EntityShape shape = new SphereShape(radius); col.Add(new CollisionEntry() { Type = PrimitiveType.Sphere, Position = pos, Rotation = Quaternion.Identity, Shape = shape, Body = new Entity(shape) }); } } // Cubes // Кубы if (colmesh.Boxes!=null) { foreach (CollisionFile.Box b in colmesh.Boxes) { // Transforming positions to world coordinates // Трансформация расположения в мировые координаты Vector3 pos = Vector3.TransformPosition( new Vector3( (b.Min.X+b.Max.X)/2f, (b.Min.Y+b.Max.Y)/2f, (b.Min.Z+b.Max.Z)/2f ) , mat); float factor = Vector3.TransformVector(Vector3.UnitX, mat).Length; // Create primitive // Создание примитива EntityShape shape = new BoxShape( (float)Math.Abs(b.Max.X-b.Min.X) * factor, (float)Math.Abs(b.Max.Y-b.Min.Y) * factor, (float)Math.Abs(b.Max.Z-b.Min.Z) * factor ); col.Add(new CollisionEntry() { Type = PrimitiveType.Box, Position = pos, Rotation = angles, Shape = shape, Body = new Entity(shape) }); } } // Trimeshes // Тримеши if (colmesh.Meshes!=null) { // Creating vertices array // Создание массива вершин BEPUutilities.Vector3[] verts = new BEPUutilities.Vector3[colmesh.Vertices.Length]; for (int i = 0; i < colmesh.Vertices.Length; i++) { verts[i] = new BEPUutilities.Vector3( colmesh.Vertices[i].X, colmesh.Vertices[i].Y, colmesh.Vertices[i].Z ); } foreach (CollisionFile.Trimesh m in colmesh.Meshes) { // Creating affine transformation // Создание трансформации BEPUutilities.AffineTransform transform = new BEPUutilities.AffineTransform( new BEPUutilities.Vector3(scale.X, scale.Y, scale.Z), new BEPUutilities.Quaternion(angles.X, angles.Y, angles.Z, angles.W), new BEPUutilities.Vector3(position.X, position.Y, position.Z) ); // Create primitive // Создание примитива col.Add(new CollisionEntry() { Type = PrimitiveType.Mesh, Mesh = new StaticMesh(verts, m.Indices, transform) }); } } subColliders = col.ToArray(); }