예제 #1
0
        public static ICollider GetConvexColliderForHlmt(H2vMap map, HaloModelTag hlmt, int damageLevel = 0)
        {
            if (map.TryGetTag(hlmt.ColliderId, out var coll) == false)
            {
                // TODO: determine why collider can be invalid, if it's expected
                return(DefaultCollider);
            }

            if (coll.ColliderComponents.Length == 0 ||
                coll.ColliderComponents[0].DamageLevels.Length <= damageLevel ||
                coll.ColliderComponents[0].DamageLevels[damageLevel].Parts.Length == 0)
            {
                Console.WriteLine($"No colliders defined in coll[{hlmt.ColliderId}] for damage level {damageLevel}");
                return(DefaultCollider);
            }

            var colliderMeshes = new List <Vector3[]>();

            foreach (var component in coll.ColliderComponents)
            {
                var container = component.DamageLevels[damageLevel];

                foreach (var info in container.Parts)
                {
                    colliderMeshes.Add(info.Vertices.Select(v => new Vector3(v.x, v.y, v.z)).ToArray());
                }
            }

            var collider = new ConvexModelCollider(colliderMeshes);

            return(collider);
        }
예제 #2
0
        public static ICollider GetAggregateColliderForPhmo(H2vMap map, PhysicsModelTag phmo, int damageLevel = 0)
        {
            var collider = new AggregateCollider();

            var colliderMeshes      = new List <Vector3[]>();
            var convexModelMaterial = -1;

            foreach (var mesh in phmo.PolyhedraDefinitions)
            {
                var meshVerts = new List <Vector3>();

                for (var i = 0; i < mesh.CountA; i++)
                {
                    var x1 = mesh.FloatsC[i * 12 + 0];
                    var x2 = mesh.FloatsC[i * 12 + 1];
                    var x3 = mesh.FloatsC[i * 12 + 2];
                    var x4 = mesh.FloatsC[i * 12 + 3];

                    // TODO: figure out inidcator on how many polyhedra to read
                    if (x1 + x2 + x3 + x4 == 0)
                    {
                        break;
                    }

                    var y1 = mesh.FloatsC[i * 12 + 4];
                    var y2 = mesh.FloatsC[i * 12 + 5];
                    var y3 = mesh.FloatsC[i * 12 + 6];
                    var y4 = mesh.FloatsC[i * 12 + 7];

                    var z1 = mesh.FloatsC[i * 12 + 8];
                    var z2 = mesh.FloatsC[i * 12 + 9];
                    var z3 = mesh.FloatsC[i * 12 + 10];
                    var z4 = mesh.FloatsC[i * 12 + 11];

                    meshVerts.Add(new Vector3(x1, y1, z1));
                    meshVerts.Add(new Vector3(x2, y2, z2));
                    meshVerts.Add(new Vector3(x3, y3, z3));
                    meshVerts.Add(new Vector3(x4, y4, z4));
                }

                if (meshVerts.Count > 0)
                {
                    colliderMeshes.Add(meshVerts.ToArray());
                    convexModelMaterial = mesh.MaterialIndexMaybe;
                }
            }

            foreach (var p in phmo.PolyhedraAlternativeDefinitions)
            {
                var meshVerts = new List <Vector3>();

                var x1 = p.Floats[0];
                var x2 = p.Floats[1];
                var x3 = p.Floats[2];
                var x4 = p.Floats[3];

                var y1 = p.Floats[4];
                var y2 = p.Floats[5];
                var y3 = p.Floats[6];
                var y4 = p.Floats[7];

                var z1 = p.Floats[8];
                var z2 = p.Floats[9];
                var z3 = p.Floats[10];
                var z4 = p.Floats[11];

                meshVerts.Add(new Vector3(x1, y1, z1));
                meshVerts.Add(new Vector3(x2, y2, z2));
                meshVerts.Add(new Vector3(x3, y3, z3));
                meshVerts.Add(new Vector3(x4, y4, z4));

                //colliderMeshes.Add(meshVerts.ToArray());
            }

            if (colliderMeshes.Count > 0)
            {
                var convexModel = new ConvexModelCollider(colliderMeshes);
                convexModel.PhysicsMaterial = convexModelMaterial;

                collider.AddCollider(convexModel);
            }



            foreach (var box in phmo.BoxDefinitions)
            {
                var xform = new Transform();
                xform.UseTransformationMatrix(box.Transform);
                var boxCollider = new BoxCollider(xform, box.HalfWidthsMaybe);
                boxCollider.PhysicsMaterial = box.MaterialIndexMaybe;
                collider.AddCollider(boxCollider);
            }

            return(collider);
        }