Пример #1
0
 public void SetCollisionBounds(Bounds b)
 {
     CollisionBounds = b;
     CollisionGeom   = b as BoundGeometry;
     Tag             = b;
     UpdateFormTitle();
     UpdateUI();
     waschanged = b?.HasChanged ?? false;
 }
Пример #2
0
        static void HandleGenColOptions(string[] args)
        {
            CommandLine.Parse <GenColOptions>(args, (opts, gOpts) =>
            {
                if (opts.InputFile == null)
                {
                    Console.WriteLine("Please provide input file with -i --input");
                    return;
                }

                if (opts.OutputFile == null)
                {
                    Console.WriteLine("Please provide output file with -o --output");
                    return;
                }

                var inputFileInfos  = new FileInfo(opts.InputFile);
                var outputFileInfos = new FileInfo(opts.OutputFile);

                if (!inputFileInfos.Exists)
                {
                    Console.WriteLine("Input file does not exists");
                    return;
                }

                if (inputFileInfos.Extension == ".ydr")
                {
                    var ydr = new YdrFile();

                    ydr.Load(inputFileInfos.FullName);

                    var modelData  = GenCol_GetModelData(ydr.Drawable.DrawableModelsX);
                    var bComposite = GenCol_CreateBoundComposite(modelData);

                    DMesh3 mesh;

                    if (opts.Mode == "copy")
                    {
                        mesh = new DMesh3();

                        var triangles = new List <DefaultConvexFace <VertexVector3> >();

                        for (int g = 0; g < modelData.Geometries.Count; g++)
                        {
                            var mGeometry = modelData.Geometries[g];

                            for (int i = 0; i < mGeometry.Indices.Count - 2; i += 3)
                            {
                                var vert1 = mGeometry.Vertices[mGeometry.Indices[i + 0]];
                                var vert2 = mGeometry.Vertices[mGeometry.Indices[i + 1]];
                                var vert3 = mGeometry.Vertices[mGeometry.Indices[i + 2]];

                                var triangle = new DefaultConvexFace <VertexVector3>()
                                {
                                    Vertices = new VertexVector3[]
                                    {
                                        vert1,
                                        vert2,
                                        vert3,
                                    }
                                };

                                triangles.Add(triangle);
                            }
                        }

                        mesh = GenCol_CreateMesh(triangles);
                    }
                    else
                    {
                        var hull          = ConvexHull.Create(modelData.Vertices);
                        var hullTriangles = hull.Result.Faces.ToList();

                        mesh = GenCol_CreateMesh(hullTriangles);
                    }

                    GenCol_Reshape(mesh, opts.Smooth, opts.TriangleCount);

                    mesh = GenCol_CleanVertices(mesh);

                    var quantum = (modelData.BbMax - modelData.BbMin) / (2 ^ opts.Qantum);

                    var bGeometry = new BoundGeometry
                    {
                        Type                   = 4,
                        Vertices               = new ResourceSimpleArray <BoundVertex>(),
                        BoundingBoxCenter      = (RAGE_Vector3)modelData.BsCenter,
                        BoundingSphereRadius   = modelData.BsRadius,
                        BoundingBoxMin         = (RAGE_Vector3)modelData.BbMin,
                        BoundingBoxMax         = (RAGE_Vector3)modelData.BbMax,
                        CenterGravity          = new RAGE_Vector3(0.0f, 0.0f, 0.0f),
                        CenterGeometry         = new RAGE_Vector3(0.0f, 0.0f, 0.0f),
                        Margin                 = 0.04f,
                        Quantum                = new RAGE_Vector3(quantum.X, quantum.Y, quantum.Z),
                        Polygons               = new ResourceSimpleArray <BoundPolygon>(),
                        Materials              = new ResourceSimpleArray <BoundMaterial>(),
                        MaterialColours        = new ResourceSimpleArray <uint_r>(),
                        PolygonMaterialIndices = new ResourceSimpleArray <byte_r>(),
                        Unknown_78h_Data       = new ResourceSimpleArray <BoundVertex>(),
                    };

                    var material = new BoundMaterial();

                    bGeometry.Materials.Add(material);

                    var matColour = new uint_r {
                        Value = 0
                    };

                    bGeometry.MaterialColours.Add(matColour);

                    var meshVertices = mesh.Vertices().ToList();

                    for (int i = 0; i < meshVertices.Count; i++)
                    {
                        var vertex  = meshVertices[i];
                        var bVertex = new BoundVertex
                        {
                            X = Convert.ToInt16(vertex.x / quantum.X),
                            Y = Convert.ToInt16(vertex.y / quantum.Y),
                            Z = Convert.ToInt16(vertex.z / quantum.Z),
                        };

                        bGeometry.Vertices.Add(bVertex);
                        bGeometry.Unknown_78h_Data.Add(bVertex);
                    }

                    var meshTriangles = mesh.Triangles().ToList();

                    for (int i = 0; i < meshTriangles.Count; i++)
                    {
                        var polygon  = new BoundPolygon();
                        var triangle = new BoundPolygonTriangle();

                        triangle.TriArea = 0.0f;

                        int vidx1 = meshTriangles[i].a;
                        int vidx2 = meshTriangles[i].b;
                        int vidx3 = meshTriangles[i].c;

                        if (vidx1 == -1 || vidx2 == -1 || vidx3 == -1)
                        {
                            continue;
                        }

                        triangle.TriIndex1 = (ushort)((triangle.TriIndex1 & ~0x7FFF) | (vidx1 & 0x7FFF));
                        triangle.TriIndex2 = (ushort)((triangle.TriIndex2 & ~0x7FFF) | (vidx2 & 0x7FFF));
                        triangle.TriIndex3 = (ushort)((triangle.TriIndex3 & ~0x7FFF) | (vidx3 & 0x7FFF));

                        triangle.EdgeIndex1 = 0;
                        triangle.EdgeIndex2 = 1;
                        triangle.EdgeIndex3 = 2;

                        polygon.data = new byte[16];

                        int offset = 0;

                        byte[] bytes = BitConverter.GetBytes(triangle.TriArea);
                        Buffer.BlockCopy(bytes, 0, polygon.data, offset, bytes.Length);
                        offset += bytes.Length;

                        bytes = BitConverter.GetBytes(triangle.TriIndex1);
                        Buffer.BlockCopy(bytes, 0, polygon.data, offset, bytes.Length);
                        offset += bytes.Length;

                        bytes = BitConverter.GetBytes(triangle.TriIndex2);
                        Buffer.BlockCopy(bytes, 0, polygon.data, offset, bytes.Length);
                        offset += bytes.Length;

                        bytes = BitConverter.GetBytes(triangle.TriIndex3);
                        Buffer.BlockCopy(bytes, 0, polygon.data, offset, bytes.Length);
                        offset += bytes.Length;

                        bytes = BitConverter.GetBytes(triangle.EdgeIndex1);
                        Buffer.BlockCopy(bytes, 0, polygon.data, offset, bytes.Length);
                        offset += bytes.Length;

                        bytes = BitConverter.GetBytes(triangle.EdgeIndex2);
                        Buffer.BlockCopy(bytes, 0, polygon.data, offset, bytes.Length);
                        offset += bytes.Length;

                        bytes = BitConverter.GetBytes(triangle.EdgeIndex3);
                        Buffer.BlockCopy(bytes, 0, polygon.data, offset, bytes.Length);
                        offset += bytes.Length;

                        bGeometry.Polygons.Add(polygon);

                        var matIndex = new byte_r {
                            Value = 0
                        };

                        bGeometry.PolygonMaterialIndices.Add(matIndex);
                    }

                    bComposite.Children.Add(bGeometry);

                    if (outputFileInfos.Extension == ".ybn")
                    {
                        var ybn = new YbnFile
                        {
                            Bound = bComposite
                        };

                        ybn.Save(opts.OutputFile);
                    }
                    else if (outputFileInfos.Extension == ".ydr")
                    {
                        ydr.Drawable.Bound = bComposite;
                        ydr.Save(opts.OutputFile);
                    }
                    else
                    {
                        Console.WriteLine("Output file type not valid");
                    }
                }
                else
                {
                    Console.WriteLine("Input file type not valid");
                }
            });
        }