Exemple #1
0
    public BufferGeometry4(Mesh[] Meshes, Matrix4x4 PositionTransform, int Version = 0)
    {
        metadata         = new BufferGeometry4_Meta();
        metadata.version = Version;
        data             = new BufferGeometry4_Data();

        data.attributes = new BufferGeometry4_Attributes();

        ModifyVector3 ReorientatePosition = (ref Vector3 p) =>
        {
            p = PositionTransform.MultiplyPoint(p);

            WorldUnityToThreeJs(ref p);

            /*gr: old method needed setting...
             * if ( PositionTransform.HasValue )
             * {
             *      var TransformedP = PositionTransform.Value * new Vector4( p.x, p.y, p.z, 1 );
             *      p.Set( TransformedP.x, TransformedP.y, TransformedP.z );
             * }
             */
        };

        //	serialise data
        for (int m = 0; m < Meshes.Length; m++)
        {
            var mesh        = Meshes[m];
            int FirstVertex = WriteAttribute(ref data.attributes.position, mesh.vertices, ReorientatePosition);
            WriteAttribute(ref data.attributes.normal, mesh.normals);
            WriteAttribute(ref data.attributes.uv, mesh.uv);
            WriteAttribute(ref data.attributes.uv2, mesh.uv2);
            WriteAttribute(ref data.attributes.color, mesh.colors);

            //	gr: if an attrib is null, unity still serialises an "empty" class. if its empty.. three js will throw an exception... so make empty attribs
            PadAttribute(ref data.attributes.position);
            PadAttribute(ref data.attributes.normal);
            PadAttribute(ref data.attributes.uv);
            PadAttribute(ref data.attributes.uv2);
            PadAttribute(ref data.attributes.color);

            //	write triangle indexes
            WriteAttribute(ref data.index, mesh.triangles, FirstVertex);
        }
    }
    public BufferGeometry4(Mesh mesh, Matrix4x4 Transform, int Version = 0)
    {
        metadata         = new BufferGeometry4_Meta();
        metadata.version = Version;
        data             = new BufferGeometry4_Data();

        data.attributes = new BufferGeometry4_Attributes();

        ModifyVector3 ReorientatePosition = (ref Vector3 p) =>
        {
            p = Transform.MultiplyPoint(p);

            //	+y is up in threejs (by default)
            //p.y = -p.y;
            //	xz seems to be wrong too. Experimenting suggests just z needs correcting
            //p.x = -p.x;
            p.z = -p.z;
        };

        //	serialise data
        //	note: we write them all
        WriteAttribute(ref data.attributes.position, mesh.vertices, ReorientatePosition);
        WriteAttribute(ref data.attributes.normal, mesh.normals);
        WriteAttribute(ref data.attributes.uv, mesh.uv);
        WriteAttribute(ref data.attributes.uv2, mesh.uv2);
        WriteAttribute(ref data.attributes.color, mesh.colors);

        //	gr: if an attrib is null, unity still serialises an "empty" class. if its empty.. three js will throw an exception... so make empty attribs
        PadNullAttribute(ref data.attributes.position);
        PadNullAttribute(ref data.attributes.normal);
        PadNullAttribute(ref data.attributes.uv);
        PadNullAttribute(ref data.attributes.uv2);
        PadNullAttribute(ref data.attributes.color);

        //	write triangle indexes - currently just a direct copy
        data.index       = new BufferGeometry4_Attribute_Int();
        data.index.array = mesh.triangles;
    }
Exemple #3
0
    int WriteAttribute(ref BufferGeometry4_Attribute_Float Attribute, Vector3[] VectorArray, ModifyVector3 Modify = null)
    {
        //	gr: maybe pad here
        if (VectorArray == null)
        {
            return(0);
        }

        int VectorSize = 3;

        if (Attribute == null)
        {
            Attribute = new BufferGeometry4_Attribute_Float(VectorSize);
        }

        int FirstIndex = Attribute.array.Count / VectorSize;

        Vector3 Temp = new Vector3();

        for (int i = 0; i < VectorArray.Length; i++)
        {
            Temp = VectorArray[i];
            if (Modify != null)
            {
                Modify(ref Temp);
            }
            Attribute.array.Add(Temp.x);
            Attribute.array.Add(Temp.y);
            Attribute.array.Add(Temp.z);
        }

        return(FirstIndex);
    }
    void WriteAttribute(ref BufferGeometry4_Attribute_Float Attribute, Vector3[] VectorArray, ModifyVector3 Modify = null)
    {
        if (VectorArray == null)
        {
            Attribute = null;
            return;
        }

        int VectorSize = 3;

        //	todo: expand array for merging multiple meshes
        Attribute = new BufferGeometry4_Attribute_Float(VectorSize);
        float[] FloatArray = new float[VectorArray.Length * VectorSize];
        for (int i = 0; i < VectorArray.Length; i++)
        {
            var Pos3 = VectorArray[i];
            if (Modify != null)
            {
                Modify(ref Pos3);
            }

            FloatArray[(i * VectorSize) + 0] = Pos3.x;
            FloatArray[(i * VectorSize) + 1] = Pos3.y;
            FloatArray[(i * VectorSize) + 2] = Pos3.z;
        }
        Attribute.array = FloatArray;
    }