Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

VectorGeometry #59

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
15 changes: 5 additions & 10 deletions src/alternativa/engine3d/collisions/EllipsoidCollider.as
Expand Up @@ -13,7 +13,6 @@ package alternativa.engine3d.collisions {
import alternativa.engine3d.resources.Geometry;

import flash.geom.Vector3D;
import flash.utils.ByteArray;
import flash.utils.Dictionary;

use namespace alternativa3d;
Expand Down Expand Up @@ -205,16 +204,12 @@ package alternativa.engine3d.collisions {
var geometryIndicesLength:int = geometry._indices.length;
if (geometry._numVertices == 0 || geometryIndicesLength == 0) continue;
// Transform vertices
var vBuffer:VertexStream = (VertexAttributes.POSITION < geometry._attributesStreams.length) ? geometry._attributesStreams[VertexAttributes.POSITION] : null;
if (vBuffer != null) {
var attributesOffset:int = geometry._attributesOffsets[VertexAttributes.POSITION];
var numMappings:int = vBuffer.attributes.length;
var data:ByteArray = vBuffer.data;
var positions:Vector.<Number> = geometry._attributesValues[VertexAttributes.POSITION];
if (positions != null) {
for (j = 0; j < geometry._numVertices; j++) {
data.position = 4*(numMappings*j + attributesOffset);
var vx:Number = data.readFloat();
var vy:Number = data.readFloat();
var vz:Number = data.readFloat();
var vx:Number = positions[j*3];
var vy:Number = positions[j*3+1];
var vz:Number = positions[j*3+2];
vertices[verticesLength] = transform.a*vx + transform.b*vy + transform.c*vz + transform.d; verticesLength++;
vertices[verticesLength] = transform.e*vx + transform.f*vy + transform.g*vz + transform.h; verticesLength++;
vertices[verticesLength] = transform.i*vx + transform.j*vy + transform.k*vz + transform.l; verticesLength++;
Expand Down
14 changes: 5 additions & 9 deletions src/alternativa/engine3d/core/Occluder.as
Expand Up @@ -63,20 +63,16 @@ package alternativa.engine3d.core {
// Checking for the errors
var geometryIndicesLength:int = geometry._indices.length;
if (geometry._numVertices == 0 || geometryIndicesLength == 0) throw new Error("The supplied geometry is empty.");
var vBuffer:VertexStream = (VertexAttributes.POSITION < geometry._attributesStreams.length) ? geometry._attributesStreams[VertexAttributes.POSITION] : null;
if (vBuffer == null) throw new Error("The supplied geometry is empty.");
var positions:Vector.<Number> = geometry._attributesValues[VertexAttributes.POSITION];
if (positions == null) throw new Error("The supplied geometry is empty.");
var i:int;
// Create vertices
var vertices:Vector.<Vertex> = new Vector.<Vertex>();
var attributesOffset:int = geometry._attributesOffsets[VertexAttributes.POSITION];
var numMappings:int = vBuffer.attributes.length;
var data:ByteArray = vBuffer.data;
for (i = 0; i < geometry._numVertices; i++) {
data.position = 4*(numMappings*i + attributesOffset);
var vertex:Vertex = new Vertex();
vertex.x = data.readFloat();
vertex.y = data.readFloat();
vertex.z = data.readFloat();
vertex.x = positions[i*3];
vertex.y = positions[i*3+1];
vertex.z = positions[i*3+2];
vertices[i] = vertex;
}
// Create faces
Expand Down
43 changes: 19 additions & 24 deletions src/alternativa/engine3d/core/VertexAttributes.as
Expand Up @@ -80,31 +80,26 @@ package alternativa.engine3d.core {
Context3DVertexBufferFormat.FLOAT_2, //TEXCOORDS[6]
Context3DVertexBufferFormat.FLOAT_2 //TEXCOORDS[7]
];

/**
* Returns a dimensions of given attribute type (Number of floats by which defines given type)
*
* @param attribute Type of the attribute.
* @return
* @private
*/
public static function getAttributeStride(attribute:int):int {
switch(FORMATS[attribute]) {
case Context3DVertexBufferFormat.FLOAT_1:
return 1;
break;
case Context3DVertexBufferFormat.FLOAT_2:
return 2;
break;
case Context3DVertexBufferFormat.FLOAT_3:
return 3;
break;
case Context3DVertexBufferFormat.FLOAT_4:
return 4;
break;
}
return 0;
}


alternativa3d static const STRIDES:Vector.<uint> = Vector.<uint>([//
1, //NONE
3, //POSITION
3, //NORMAL
4, //TANGENT4
4, //JOINTS[0]
4, //JOINTS[1]
4, //JOINTS[2]
4, //JOINTS[3]
2, //TEXCOORDS[0]
2, //TEXCOORDS[1]
2, //TEXCOORDS[2]
2, //TEXCOORDS[3]
2, //TEXCOORDS[4]
2, //TEXCOORDS[5]
2, //TEXCOORDS[6]
2 //TEXCOORDS[7]
]);
}
}
9 changes: 3 additions & 6 deletions src/alternativa/engine3d/core/VertexStream.as
Expand Up @@ -5,18 +5,15 @@
*
* It is desirable to notify that Covered Software was "Powered by AlternativaPlatform" with link to http://www.alternativaplatform.com/
* */

package alternativa.engine3d.core {

import flash.display3D.VertexBuffer3D;
import flash.utils.ByteArray;

/**
* @private
*/
public class VertexStream {
public var buffer:VertexBuffer3D;
public var attributes:Array;
public var data:ByteArray;
public var buffer : VertexBuffer3D;

public var mappings : Array;
}
}
2 changes: 1 addition & 1 deletion src/alternativa/engine3d/loaders/ExporterA3D.as
Expand Up @@ -543,7 +543,7 @@ package alternativa.engine3d.loaders {
indexBufferID++;
for (i = 0,count = geometry._vertexStreams.length; i < count; i++) {
var stream:VertexStream = geometry._vertexStreams[i];
var buffer:A3D2VertexBuffer = new A3D2VertexBuffer(exportAttributes(stream.attributes), stream.data, vertexBufferID, geometry.numVertices);
var buffer:A3D2VertexBuffer = new A3D2VertexBuffer(exportAttributes(stream.mappings), geometry.getVertexStreamData(i), vertexBufferID, geometry.numVertices);
if (dest.vertexBuffers == null) dest.vertexBuffers = new Vector.<A3D2VertexBuffer>();
dest.vertexBuffers[vertexBufferID] = buffer;
result.vertexBufferIDs[i] = vertexBufferID++;
Expand Down
15 changes: 8 additions & 7 deletions src/alternativa/engine3d/loaders/Parser.as
Expand Up @@ -724,6 +724,7 @@ package alternativa.engine3d.loaders {
geometry._indices = indices;
var buffers:Vector.<int> = vertexBuffersIDs;
var vertexCount:uint;
geometry._numVertices = (buffers.length > 0) ? (vertexBuffers[buffers[0]] as A3D2VertexBuffer).vertexCount : 0;
for (var j:int = 0; j < buffers.length; j++) {
var buffer:A3D2VertexBuffer = vertexBuffers[buffers[j]];
if (compressedBuffers) {
Expand Down Expand Up @@ -760,17 +761,17 @@ package alternativa.engine3d.loaders {
jointsOffset++;
break;
}
var numFloats:int = VertexAttributes.getAttributeStride(attr);
var numFloats:int = VertexAttributes.STRIDES[attr];
numFloats = (numFloats < 1) ? 1 : numFloats;
for (var t:int = 0; t < numFloats; t++) {
attributes[offset] = attr;
offset++;
}
}
geometry.addVertexStream(attributes);
geometry._vertexStreams[0].data = byteArray;
geometry.setVertexStreamData(0, byteArray);
}
geometry._numVertices = (buffers.length > 0) ? vertexCount : 0;

parsedGeometries[key] = geometry;

return geometry;
Expand Down Expand Up @@ -1007,16 +1008,16 @@ package alternativa.engine3d.loaders {
var vertexStream:VertexStream = geometry._vertexStreams[0];
var prev:int = -1;

var attribtuesLength:int = vertexStream.attributes.length;
var attribtuesLength:int = vertexStream.mappings.length;
var stride:int = attribtuesLength*4;
var length:int = vertexStream.data.length/stride;
var data:ByteArray = vertexStream.data;
var data:ByteArray = geometry.getVertexStreamData(0);
var length:int = data.length/stride;

for (var j:int = 0; j < length; j++) {
var traceString:String = "V" + j + " ";
var offset:int = -4;
for (var i:int = 0; i < attribtuesLength; i++) {
var attr:int = vertexStream.attributes[i];
var attr:int = vertexStream.mappings[i];
var x:Number, y:Number, z:Number;
if (attr == prev) continue;
offset = geometry.getAttributeOffset(attr)*4;
Expand Down
59 changes: 40 additions & 19 deletions src/alternativa/engine3d/loaders/Parser3DS.as
Expand Up @@ -836,24 +836,35 @@ package alternativa.engine3d.loaders {
var numVertices:int = vertices.length;
var byteArray:ByteArray = new ByteArray();
byteArray.endian = Endian.LITTLE_ENDIAN;

var positions:Vector.<Number> = new Vector.<Number>();
var positionStride:uint = VertexAttributes.STRIDES[VertexAttributes.POSITION];
var uvs:Vector.<Number> = new Vector.<Number>();
var uvStride:uint = VertexAttributes.STRIDES[VertexAttributes.TEXCOORDS[0]];
var normals:Vector.<Number> = new Vector.<Number>();
var normalStride:uint = VertexAttributes.STRIDES[VertexAttributes.NORMAL];
var tangents:Vector.<Number> = new Vector.<Number>();
var tangentStride:uint = VertexAttributes.STRIDES[VertexAttributes.TANGENT4];

for (var n:int = 0; n < numVertices; n++) {
vertex = vertices [n];
byteArray.writeFloat(vertex.x);
byteArray.writeFloat(vertex.y);
byteArray.writeFloat(vertex.z);
byteArray.writeFloat(vertex.u);
byteArray.writeFloat(vertex.v);

positions[n*positionStride] = vertex.x;
positions[n*positionStride+1] = vertex.y;
positions[n*positionStride+2] = vertex.z;

uvs[n*uvStride] = vertex.u;
uvs[n*uvStride+1] = vertex.v;

vec = vertex.normal;
byteArray.writeFloat(vec.x);
byteArray.writeFloat(vec.y);
byteArray.writeFloat(vec.z);

normals[n*normalStride] = vec.x;
normals[n*normalStride+1] = vec.y;
normals[n*normalStride+2] = vec.z;
vec = vertex.tangent;
byteArray.writeFloat(vec.x);
byteArray.writeFloat(vec.y);
byteArray.writeFloat(vec.z);
byteArray.writeFloat(vec.w);
tangents[n*tangentStride] = vec.x;
tangents[n*tangentStride+1] = vec.y;
tangents[n*tangentStride+2] = vec.z;
tangents[n*tangentStride+3] = vec.w;
}
mesh.geometry = new Geometry;
mesh.geometry._indices = indices;
Expand All @@ -871,8 +882,18 @@ package alternativa.engine3d.loaders {
VertexAttributes.TANGENT4,
VertexAttributes.TANGENT4
]);
mesh.geometry._vertexStreams[0].data = byteArray;

mesh.geometry._numVertices = numVertices;
mesh.geometry.setAttributeValues(VertexAttributes.POSITION, positions);
mesh.geometry.setAttributeValues(VertexAttributes.TEXCOORDS[0], uvs);
mesh.geometry.setAttributeValues(VertexAttributes.NORMAL, normals);
mesh.geometry.setAttributeValues(VertexAttributes.TANGENT4, tangents);

positions = null;
uvs = null;
normals = null;
tangents = null;

if (objectData.surfaces != null) {
for (var key:String in objectData.surfaces) {
var materialData:MaterialData = materialDatas[key];
Expand Down Expand Up @@ -1185,10 +1206,10 @@ package alternativa.engine3d.loaders {
var deltaY2:Number = face.deltaY2;
var deltaZ2:Number = face.deltaZ2;

var stMatrix00:Number = (deltaV2)//*invdet;
var stMatrix01:Number = -(deltaV1)//*invdet;
var stMatrix10:Number = -(deltaU2)//*invdet;
var stMatrix11:Number = (deltaU1)//*invdet;
var stMatrix00:Number = (deltaV2);//*invdet;
var stMatrix01:Number = -(deltaV1);//*invdet;
var stMatrix10:Number = -(deltaU2);//*invdet;
var stMatrix11:Number = (deltaU1);//*invdet;

var tangentX:Number = stMatrix00*deltaX1 + stMatrix01*deltaX2;
var tangentY:Number = stMatrix00*deltaY1 + stMatrix01*deltaY2;
Expand Down
77 changes: 36 additions & 41 deletions src/alternativa/engine3d/loaders/collada/DaeController.as
Expand Up @@ -86,8 +86,9 @@ package alternativa.engine3d.loaders.collada {
var localMaxJointsPerVertex:int = (maxJointsPerVertex%2 != 0) ? maxJointsPerVertex + 1 : maxJointsPerVertex;

// Create geometry
this.geometry = new Geometry();
this.geometry._indices = source._indices.slice();
geometry = new Geometry();
geometry._indices = source._indices.slice();
geometry._numVertices = source._numVertices;
var attributes:Array = source.getVertexStreamAttributes(0);
var numSourceAttributes:int = attributes.length;

Expand All @@ -102,7 +103,7 @@ package alternativa.engine3d.loaders.collada {

var numMappings:int = attributes.length;

var sourceData:ByteArray = source._vertexStreams[0].data;
var sourceData:ByteArray = source.getVertexStreamData(0);
var data:ByteArray = new ByteArray();
data.endian = Endian.LITTLE_ENDIAN;
data.length = 4*numMappings*source._numVertices;
Expand All @@ -126,73 +127,67 @@ package alternativa.engine3d.loaders.collada {
}
}

this.geometry.addVertexStream(attributes);
this.geometry._vertexStreams[0].data = data;
this.geometry._numVertices = source._numVertices;
transformVertices(this.geometry);
geometry.addVertexStream(attributes);
geometry.setVertexStreamData(0, data);
transformVertices(geometry);
primitives = geom.primitives;
}
return true;
}

private function transformVertices(geometry:Geometry):void {
var data:ByteArray = geometry._vertexStreams[0].data;
var numMappings:int = geometry._vertexStreams[0].attributes.length;

var positions:Vector.<Number> = geometry._attributesValues[VertexAttributes.POSITION];
var normals:Vector.<Number> = geometry._attributesValues[VertexAttributes.NORMAL];
var tangents:Vector.<Number> = geometry._attributesValues[VertexAttributes.TANGENT4];

var hasNormal:Boolean = geometry.hasAttribute(VertexAttributes.NORMAL);
var hasTangent:Boolean = geometry.hasAttribute(VertexAttributes.TANGENT4);

// TODO: Normalize normal and tangent after transformation
// TODO: Transform normal with transpose inverted matrix
var normalOffset:int = (geometry.hasAttribute(VertexAttributes.NORMAL))?geometry.getAttributeOffset(VertexAttributes.NORMAL):-1;
var tangentOffset:int = (geometry.hasAttribute(VertexAttributes.TANGENT4))?geometry.getAttributeOffset(VertexAttributes.TANGENT4):-1;

for (var i:int = 0; i < geometry._numVertices; i++) {
data.position = 4*numMappings*i;
var x:Number = data.readFloat();
var y:Number = data.readFloat();
var z:Number = data.readFloat();
data.position -= 12;
data.writeFloat(x*bindShapeMatrix[0] + y*bindShapeMatrix[1] + z*bindShapeMatrix[2] + bindShapeMatrix[3]);
data.writeFloat(x*bindShapeMatrix[4] + y*bindShapeMatrix[5] + z*bindShapeMatrix[6] + bindShapeMatrix[7]);
data.writeFloat(x*bindShapeMatrix[8] + y*bindShapeMatrix[9] + z*bindShapeMatrix[10] + bindShapeMatrix[11]);
var x:Number = positions[i*3];
var y:Number = positions[i*3+1];
var z:Number = positions[i*3+2];
positions[i*3] = x*bindShapeMatrix[0] + y*bindShapeMatrix[1] + z*bindShapeMatrix[2] + bindShapeMatrix[3];
positions[i*3+1] = x*bindShapeMatrix[4] + y*bindShapeMatrix[5] + z*bindShapeMatrix[6] + bindShapeMatrix[7];
positions[i*3+2] = x*bindShapeMatrix[8] + y*bindShapeMatrix[9] + z*bindShapeMatrix[10] + bindShapeMatrix[11];

var tmpX:Number;
var tmpY:Number;
var tmpZ:Number;
var tmpLen:Number;

if (normalOffset>=0){
data.position = 4*(numMappings*i + normalOffset);
var normalX:Number = data.readFloat();
var normalY:Number = data.readFloat();
var normalZ:Number = data.readFloat();
if (hasNormal){
var normalX:Number = normals[i*3];
var normalY:Number = normals[i*3+1];
var normalZ:Number = normals[i*3+2];

tmpX = normalX*bindShapeMatrix[0] + normalY*bindShapeMatrix[1] + normalZ*bindShapeMatrix[2];
tmpY = normalX*bindShapeMatrix[4] + normalY*bindShapeMatrix[5] + normalZ*bindShapeMatrix[6];
tmpZ = normalX*bindShapeMatrix[8] + normalY*bindShapeMatrix[9] + normalZ*bindShapeMatrix[10];
tmpLen = Math.sqrt(tmpX*tmpX + tmpY*tmpY + tmpZ*tmpZ);

data.position -= 12;
data.writeFloat((tmpLen > 0.0001) ? tmpX/tmpLen : 0);
data.writeFloat((tmpLen > 0.0001) ? tmpY/tmpLen : 0);
data.writeFloat((tmpLen > 0.0001) ? tmpZ/tmpLen : 1);
normals[i*3] = (tmpLen > 0.0001) ? tmpX/tmpLen : 0;
normals[i*3+1] = (tmpLen > 0.0001) ? tmpY/tmpLen : 0;
normals[i*3+2] = (tmpLen > 0.0001) ? tmpZ/tmpLen : 1;
}

if (tangentOffset>=0){
data.position = 4*(numMappings*i + tangentOffset);
var tangentX:Number = data.readFloat();
var tangentY:Number = data.readFloat();
var tangentZ:Number = data.readFloat();
var tangentW:Number = data.readFloat();
if (hasTangent){
var tangentX:Number = tangents[i*4];
var tangentY:Number = tangents[i*4+1];
var tangentZ:Number = tangents[i*4+2];
var tangentW:Number = tangents[i*4+3];

tmpX = tangentX*bindShapeMatrix[0] + tangentY*bindShapeMatrix[1] + tangentZ*bindShapeMatrix[2];
tmpY = tangentX*bindShapeMatrix[4] + tangentY*bindShapeMatrix[5] + tangentZ*bindShapeMatrix[6];
tmpZ = tangentX*bindShapeMatrix[8] + tangentY*bindShapeMatrix[9] + tangentZ*bindShapeMatrix[10];
tmpLen = Math.sqrt(tmpX*tmpX + tmpY*tmpY + tmpZ*tmpZ);

data.position -= 16;
data.writeFloat((tmpLen > 0.0001) ? tmpX/tmpLen : 0);
data.writeFloat((tmpLen > 0.0001) ? tmpY/tmpLen : 0);
data.writeFloat((tmpLen > 0.0001) ? tmpZ/tmpLen : 1);
data.writeFloat((tangentW < 0) ? -1 : 1);
tangents[i*4] = (tmpLen > 0.0001) ? tmpX/tmpLen : 0;
tangents[i*4+1] = (tmpLen > 0.0001) ? tmpY/tmpLen : 0;
tangents[i*4+2] = (tmpLen > 0.0001) ? tmpZ/tmpLen : 1;
tangents[i*4+3] = (tangentW < 0) ? -1 : 1;
}
}
}
Expand Down