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; }
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; }