mirror of
https://github.com/godotengine/godot.git
synced 2026-01-03 18:11:19 +03:00
Collada
-=-=-=- -Fixed some DAE import & export bugs -Changed Collada exporter to use the mesh loops API -Added tangent export to Collada exporter -Added triangulation option to Collada exporter -Changed a little how normalmaps are handled in shader. Not sure if it's working properly, be careful. -Fixed some strange bug with kinematic bodies #776 -Fix release compilaiton issues #782
This commit is contained in:
@@ -105,7 +105,7 @@ void SurfaceTool::add_vertex( const Vector3& p_vertex) {
|
||||
vtx.weights=last_weights;
|
||||
vtx.bones=last_bones;
|
||||
vtx.tangent=last_tangent.normal;
|
||||
vtx.binormal=last_tangent.normal.cross(last_normal).normalized() * last_tangent.d;
|
||||
vtx.binormal=last_normal.cross(last_tangent.normal).normalized() * last_tangent.d;
|
||||
vertex_array.push_back(vtx);
|
||||
first=false;
|
||||
format|=Mesh::ARRAY_FORMAT_VERTEX;
|
||||
@@ -299,7 +299,9 @@ Ref<Mesh> SurfaceTool::commit(const Ref<Mesh>& p_existing) {
|
||||
w[idx+0]=v.tangent.x;
|
||||
w[idx+1]=v.tangent.y;
|
||||
w[idx+2]=v.tangent.z;
|
||||
float d = v.binormal.dot(v.normal.cross(v.tangent));
|
||||
|
||||
//float d = v.tangent.dot(v.binormal,v.normal);
|
||||
float d = v.binormal.dot( v.normal.cross(v.tangent));
|
||||
w[idx+3]=d<0 ? -1 : 1;
|
||||
}
|
||||
|
||||
@@ -565,6 +567,7 @@ void SurfaceTool::create_from(const Ref<Mesh>& p_existing, int p_surface) {
|
||||
clear();
|
||||
primitive=p_existing->surface_get_primitive_type(p_surface);
|
||||
_create_list(p_existing,p_surface,&vertex_array,&index_array,format);
|
||||
material=p_existing->surface_get_material(p_surface);
|
||||
|
||||
}
|
||||
|
||||
@@ -611,166 +614,97 @@ void SurfaceTool::append_from(const Ref<Mesh>& p_existing, int p_surface,const T
|
||||
|
||||
}
|
||||
|
||||
//mikktspace callbacks
|
||||
int SurfaceTool::mikktGetNumFaces(const SMikkTSpaceContext * pContext) {
|
||||
|
||||
Vector<List<Vertex>::Element*> &varr = *((Vector<List<Vertex>::Element*>*)pContext->m_pUserData);
|
||||
return varr.size()/3;
|
||||
}
|
||||
int SurfaceTool::mikktGetNumVerticesOfFace(const SMikkTSpaceContext * pContext, const int iFace){
|
||||
|
||||
return 3; //always 3
|
||||
}
|
||||
void SurfaceTool::mikktGetPosition(const SMikkTSpaceContext * pContext, float fvPosOut[], const int iFace, const int iVert){
|
||||
|
||||
Vector<List<Vertex>::Element*> &varr = *((Vector<List<Vertex>::Element*>*)pContext->m_pUserData);
|
||||
Vector3 v = varr[iFace*3+iVert]->get().vertex;
|
||||
fvPosOut[0]=v.x;
|
||||
fvPosOut[1]=v.y;
|
||||
fvPosOut[2]=v.z;
|
||||
|
||||
|
||||
}
|
||||
|
||||
void SurfaceTool::mikktGetNormal(const SMikkTSpaceContext * pContext, float fvNormOut[], const int iFace, const int iVert){
|
||||
|
||||
|
||||
Vector<List<Vertex>::Element*> &varr = *((Vector<List<Vertex>::Element*>*)pContext->m_pUserData);
|
||||
Vector3 v = varr[iFace*3+iVert]->get().normal;
|
||||
fvNormOut[0]=v.x;
|
||||
fvNormOut[1]=v.y;
|
||||
fvNormOut[2]=v.z;
|
||||
|
||||
}
|
||||
void SurfaceTool::mikktGetTexCoord(const SMikkTSpaceContext * pContext, float fvTexcOut[], const int iFace, const int iVert){
|
||||
|
||||
Vector<List<Vertex>::Element*> &varr = *((Vector<List<Vertex>::Element*>*)pContext->m_pUserData);
|
||||
Vector2 v = varr[iFace*3+iVert]->get().uv;
|
||||
fvTexcOut[0]=v.x;
|
||||
//fvTexcOut[1]=v.y;
|
||||
fvTexcOut[1]=1.0-v.y;
|
||||
|
||||
}
|
||||
void SurfaceTool::mikktSetTSpaceBasic(const SMikkTSpaceContext * pContext, const float fvTangent[], const float fSign, const int iFace, const int iVert){
|
||||
|
||||
Vector<List<Vertex>::Element*> &varr = *((Vector<List<Vertex>::Element*>*)pContext->m_pUserData);
|
||||
Vertex &vtx = varr[iFace*3+iVert]->get();
|
||||
|
||||
vtx.tangent = Vector3(fvTangent[0],fvTangent[1],fvTangent[2]);
|
||||
vtx.binormal = vtx.normal.cross(vtx.tangent) * fSign;
|
||||
}
|
||||
|
||||
|
||||
void SurfaceTool::generate_tangents() {
|
||||
|
||||
ERR_FAIL_COND(!(format&Mesh::ARRAY_FORMAT_TEX_UV));
|
||||
ERR_FAIL_COND(!(format&Mesh::ARRAY_FORMAT_NORMAL));
|
||||
|
||||
|
||||
if (index_array.size()) {
|
||||
|
||||
Vector<List<Vertex>::Element*> vtx;
|
||||
vtx.resize(vertex_array.size());
|
||||
int idx=0;
|
||||
for (List<Vertex>::Element *E=vertex_array.front();E;E=E->next()) {
|
||||
vtx[idx++]=E;
|
||||
E->get().binormal=Vector3();
|
||||
E->get().tangent=Vector3();
|
||||
}
|
||||
|
||||
for (List<int>::Element *E=index_array.front();E;) {
|
||||
|
||||
int i[3];
|
||||
i[0]=E->get();
|
||||
E=E->next();
|
||||
ERR_FAIL_COND(!E);
|
||||
i[1]=E->get();
|
||||
E=E->next();
|
||||
ERR_FAIL_COND(!E);
|
||||
i[2]=E->get();
|
||||
E=E->next();
|
||||
ERR_FAIL_COND(!E);
|
||||
bool indexed = index_array.size()>0;
|
||||
if (indexed)
|
||||
deindex();
|
||||
|
||||
|
||||
Vector3 v1 = vtx[ i[0] ]->get().vertex;
|
||||
Vector3 v2 = vtx[ i[1] ]->get().vertex;
|
||||
Vector3 v3 = vtx[ i[2] ]->get().vertex;
|
||||
SMikkTSpaceInterface mkif;
|
||||
mkif.m_getNormal=mikktGetNormal;
|
||||
mkif.m_getNumFaces=mikktGetNumFaces;
|
||||
mkif.m_getNumVerticesOfFace=mikktGetNumVerticesOfFace;
|
||||
mkif.m_getPosition=mikktGetPosition;
|
||||
mkif.m_getTexCoord=mikktGetTexCoord;
|
||||
mkif.m_setTSpaceBasic=mikktSetTSpaceBasic;
|
||||
mkif.m_setTSpace=NULL;
|
||||
|
||||
Vector2 w1 = vtx[ i[0] ]->get().uv;
|
||||
Vector2 w2 = vtx[ i[1] ]->get().uv;
|
||||
Vector2 w3 = vtx[ i[2] ]->get().uv;
|
||||
SMikkTSpaceContext msc;
|
||||
msc.m_pInterface=&mkif;
|
||||
|
||||
|
||||
float x1 = v2.x - v1.x;
|
||||
float x2 = v3.x - v1.x;
|
||||
float y1 = v2.y - v1.y;
|
||||
float y2 = v3.y - v1.y;
|
||||
float z1 = v2.z - v1.z;
|
||||
float z2 = v3.z - v1.z;
|
||||
|
||||
float s1 = w2.x - w1.x;
|
||||
float s2 = w3.x - w1.x;
|
||||
float t1 = w2.y - w1.y;
|
||||
float t2 = w3.y - w1.y;
|
||||
|
||||
float r = (s1 * t2 - s2 * t1);
|
||||
|
||||
Vector3 binormal,tangent;
|
||||
|
||||
if (r==0) {
|
||||
binormal=Vector3(0,0,0);
|
||||
tangent=Vector3(0,0,0);
|
||||
} else {
|
||||
tangent = Vector3((t2 * x1 - t1 * x2) * r, (t2 * y1 - t1 * y2) * r,
|
||||
(t2 * z1 - t1 * z2) * r);
|
||||
binormal = Vector3((s1 * x2 - s2 * x1) * r, (s1 * y2 - s2 * y1) * r,
|
||||
(s1 * z2 - s2 * z1) * r);
|
||||
}
|
||||
|
||||
tangent.normalize();
|
||||
binormal.normalize();
|
||||
Vector3 normal=Plane( v1, v2, v3 ).normal;
|
||||
|
||||
Vector3 tangentp = tangent - normal * normal.dot( tangent );
|
||||
Vector3 binormalp = binormal - normal * (normal.dot(binormal)) - tangent * (tangent.dot(binormal));
|
||||
|
||||
tangentp.normalize();
|
||||
binormalp.normalize();
|
||||
|
||||
|
||||
for (int j=0;j<3;j++) {
|
||||
vtx[ i[j] ]->get().binormal+=binormalp;
|
||||
vtx[ i[j] ]->get().tangent+=tangentp;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
for (List<Vertex>::Element *E=vertex_array.front();E;E=E->next()) {
|
||||
E->get().binormal.normalize();
|
||||
E->get().tangent.normalize();
|
||||
}
|
||||
|
||||
|
||||
} else {
|
||||
|
||||
|
||||
for (List<Vertex>::Element *E=vertex_array.front();E;) {
|
||||
|
||||
List< Vertex >::Element *v[3];
|
||||
v[0]=E;
|
||||
v[1]=v[0]->next();
|
||||
ERR_FAIL_COND(!v[1]);
|
||||
v[2]=v[1]->next();
|
||||
ERR_FAIL_COND(!v[2]);
|
||||
E=v[2]->next();
|
||||
|
||||
Vector3 v1 = v[0]->get().vertex;
|
||||
Vector3 v2 = v[1]->get().vertex;
|
||||
Vector3 v3 = v[2]->get().vertex;
|
||||
|
||||
Vector2 w1 = v[0]->get().uv;
|
||||
Vector2 w2 = v[1]->get().uv;
|
||||
Vector2 w3 = v[2]->get().uv;
|
||||
|
||||
|
||||
float x1 = v2.x - v1.x;
|
||||
float x2 = v3.x - v1.x;
|
||||
float y1 = v2.y - v1.y;
|
||||
float y2 = v3.y - v1.y;
|
||||
float z1 = v2.z - v1.z;
|
||||
float z2 = v3.z - v1.z;
|
||||
|
||||
float s1 = w2.x - w1.x;
|
||||
float s2 = w3.x - w1.x;
|
||||
float t1 = w2.y - w1.y;
|
||||
float t2 = w3.y - w1.y;
|
||||
|
||||
float r = (s1 * t2 - s2 * t1);
|
||||
|
||||
Vector3 binormal,tangent;
|
||||
|
||||
if (r==0) {
|
||||
binormal=Vector3(0,0,0);
|
||||
tangent=Vector3(0,0,0);
|
||||
} else {
|
||||
tangent = Vector3((t2 * x1 - t1 * x2) * r, (t2 * y1 - t1 * y2) * r,
|
||||
(t2 * z1 - t1 * z2) * r);
|
||||
binormal = Vector3((s1 * x2 - s2 * x1) * r, (s1 * y2 - s2 * y1) * r,
|
||||
(s1 * z2 - s2 * z1) * r);
|
||||
}
|
||||
|
||||
tangent.normalize();
|
||||
binormal.normalize();
|
||||
Vector3 normal=Plane( v1, v2, v3 ).normal;
|
||||
|
||||
Vector3 tangentp = tangent - normal * normal.dot( tangent );
|
||||
Vector3 binormalp = binormal - normal * (normal.dot(binormal)) - tangent * (tangent.dot(binormal));
|
||||
|
||||
tangentp.normalize();
|
||||
binormalp.normalize();
|
||||
|
||||
|
||||
for (int j=0;j<3;j++) {
|
||||
v[j]->get().binormal=binormalp;
|
||||
v[j]->get().tangent=tangentp;
|
||||
|
||||
}
|
||||
}
|
||||
Vector<List<Vertex>::Element*> vtx;
|
||||
vtx.resize(vertex_array.size());
|
||||
int idx=0;
|
||||
for (List<Vertex>::Element *E=vertex_array.front();E;E=E->next()) {
|
||||
vtx[idx++]=E;
|
||||
E->get().binormal=Vector3();
|
||||
E->get().tangent=Vector3();
|
||||
}
|
||||
msc.m_pUserData=&vtx;
|
||||
|
||||
bool res = genTangSpaceDefault(&msc);
|
||||
|
||||
ERR_FAIL_COND(!res);
|
||||
format|=Mesh::ARRAY_FORMAT_TANGENT;
|
||||
|
||||
if (indexed)
|
||||
index();
|
||||
|
||||
|
||||
}
|
||||
|
||||
void SurfaceTool::generate_normals() {
|
||||
|
||||
Reference in New Issue
Block a user