Cc3dMatrix4 Cc3dMatrix4::operator*(const Cc3dMatrix4&mat)const{ const float *a=this->getArray(); const float *b=mat.getArray(); float r[16];//result r[0]=b[0]*a[0]+b[1]*a[4]+b[2]*a[8]+b[3]*a[12]; r[1]=b[0]*a[1]+b[1]*a[5]+b[2]*a[9]+b[3]*a[13]; r[2]=b[0]*a[2]+b[1]*a[6]+b[2]*a[10]+b[3]*a[14]; r[3]=b[0]*a[3]+b[1]*a[7]+b[2]*a[11]+b[3]*a[15]; r[4]=b[4]*a[0]+b[5]*a[4]+b[6]*a[8]+b[7]*a[12]; r[5]=b[4]*a[1]+b[5]*a[5]+b[6]*a[9]+b[7]*a[13]; r[6]=b[4]*a[2]+b[5]*a[6]+b[6]*a[10]+b[7]*a[14]; r[7]=b[4]*a[3]+b[5]*a[7]+b[6]*a[11]+b[7]*a[15]; r[8]=b[8]*a[0]+b[9]*a[4]+b[10]*a[8]+b[11]*a[12]; r[9]=b[8]*a[1]+b[9]*a[5]+b[10]*a[9]+b[11]*a[13]; r[10]=b[8]*a[2]+b[9]*a[6]+b[10]*a[10]+b[11]*a[14]; r[11]=b[8]*a[3]+b[9]*a[7]+b[10]*a[11]+b[11]*a[15]; r[12]=b[12]*a[0]+b[13]*a[4]+b[14]*a[8]+b[15]*a[12]; r[13]=b[12]*a[1]+b[13]*a[5]+b[14]*a[9]+b[15]*a[13]; r[14]=b[12]*a[2]+b[13]*a[6]+b[14]*a[10]+b[15]*a[14]; r[15]=b[12]*a[3]+b[13]*a[7]+b[14]*a[11]+b[15]*a[15]; return Cc3dMatrix4(r); }
Cc3dMatrix4 Cc3dMatrix4::operator*(float k)const{ const float *m=this->getArray(); float r[16]; for(int i=0;i<16;i++){ r[i]=m[i]*k; } return Cc3dMatrix4(r); }
void Cc3dSubMesh::onDraw(const Mat4& modelMat, uint32_t flags){ assert(m_subMeshData&&m_texture&&m_indexVBO &&m_program); if(m_indexVBO->getIndexArrayLen()==0)return; //enable array attribute bool isPostionAttribEnabled=Cc3dIndexVBO3d::isEnabledAttribArray_position(); bool isTexCoordAttribEnabled=Cc3dIndexVBO3d::isEnabledAttribArray_texCoord(); bool isNormalAttribEnabled=Cc3dIndexVBO3d::isEnabledAttribArray_normal(); bool isColorAttribEnabled=Cc3dIndexVBO3d::isEnabledAttribArray_color(); Cc3dIndexVBO3d::enableAttribArray_position(true); Cc3dIndexVBO3d::enableAttribArray_texCoord(true); Cc3dIndexVBO3d::enableAttribArray_normal(true); Cc3dIndexVBO3d::enableAttribArray_color(true); //apply state //for performance sake, we only apply state, not restore { //set depthTest CCDirector::sharedDirector()->setDepthTest(m_isDoDepthTest); //set blend function ccGLBlendFunc(m_blendFunc.src, m_blendFunc.dst); } //enable server state (i don't know what this means :( ) ////ccGLEnable(m_eGLServerState); //pass values for cocos2d-x build-in uniforms Cc3dProgram*program=(Cc3dProgram*)getShaderProgram(); program->use(); program->mySetUniformsForBuiltins(Cc3dMatrix4(modelMat.m), Cc3dDirector::sharedDirector()->getCamera()->calculateViewMat(), Cc3dDirector::sharedDirector()->getCamera()->calculateProjectionMat()); //pass values for my own uniforms m_passUnifoCallback(this, program,Cc3dMatrix4(modelMat.m));//m_program //attach texture to texture attach point ccGLBindTexture2DN(0, this->m_texture->getID()); //draw m_indexVBO->setPointers(); m_indexVBO->draw(GL_TRIANGLES); //recover array attribute state Cc3dIndexVBO3d::enableAttribArray_position(isPostionAttribEnabled); Cc3dIndexVBO3d::enableAttribArray_texCoord(isTexCoordAttribEnabled); Cc3dIndexVBO3d::enableAttribArray_normal(isNormalAttribEnabled); Cc3dIndexVBO3d::enableAttribArray_color(isColorAttribEnabled); }
Cc3dMatrix4 Cc3dMatrix4::operator+(const Cc3dMatrix4&mat)const{ const float *a=this->getArray(); const float *b=mat.getArray(); float r[16];//result for(int i=0;i<16;i++){ r[i]=a[i]+b[i]; } return Cc3dMatrix4(r); }
Cc3dMatrix4 transpose(const Cc3dMatrix4&mat){ const float* m=mat.getArray(); float rs[16]={ m[0],m[4],m[8],m[12],//col 1 m[1],m[5],m[9],m[13],//col 2 m[2],m[6],m[10],m[14],//col 3 m[3],m[7],m[11],m[15]//col 4 }; return Cc3dMatrix4(rs); }
void Cc3dTransform::rotateRelativeToFather(float nx,float ny,float nz,float cosa,float sina) //n must be normalized vector { float _cosa=1-cosa; float nx_cosa=nx*_cosa; float nz_cosa=nz*_cosa; float nxnx_cosa=nx*nx_cosa; float nxny_cosa=ny*nx_cosa; float nxnz_cosa=nz*nx_cosa; float nyny_cosa=ny*ny*_cosa; float nynz_cosa=ny*nz_cosa; float nznz_cosa=nz*nz_cosa; float nxsina=nx*sina; float nzsina=nz*sina; float nysina=ny*sina; float rotmat[16]={ nxnx_cosa+cosa,nxny_cosa+nzsina,nxnz_cosa-nysina,0,//col 1 nxny_cosa-nzsina,nyny_cosa+cosa,nynz_cosa+nxsina,0,//col 2 nxnz_cosa+nysina,nynz_cosa-nxsina,nznz_cosa+cosa,0,//col 3 0,0,0,1//col 4 }; m_RTmat=Cc3dMatrix4(rotmat)*m_RTmat; }
Cc3dMatrix4 inverse(const Cc3dMatrix4&mat){ //this code is copy from: http://stackoverflow.com/questions/1148309/inverting-a-4x4-matrix float m[16]; for(int i=0;i<16;i++)m[i]=mat.getAt(i); float invOut[16]; float inv[16], det; int i; inv[0] = m[5] * m[10] * m[15] - m[5] * m[11] * m[14] - m[9] * m[6] * m[15] + m[9] * m[7] * m[14] + m[13] * m[6] * m[11] - m[13] * m[7] * m[10]; inv[4] = -m[4] * m[10] * m[15] + m[4] * m[11] * m[14] + m[8] * m[6] * m[15] - m[8] * m[7] * m[14] - m[12] * m[6] * m[11] + m[12] * m[7] * m[10]; inv[8] = m[4] * m[9] * m[15] - m[4] * m[11] * m[13] - m[8] * m[5] * m[15] + m[8] * m[7] * m[13] + m[12] * m[5] * m[11] - m[12] * m[7] * m[9]; inv[12] = -m[4] * m[9] * m[14] + m[4] * m[10] * m[13] + m[8] * m[5] * m[14] - m[8] * m[6] * m[13] - m[12] * m[5] * m[10] + m[12] * m[6] * m[9]; inv[1] = -m[1] * m[10] * m[15] + m[1] * m[11] * m[14] + m[9] * m[2] * m[15] - m[9] * m[3] * m[14] - m[13] * m[2] * m[11] + m[13] * m[3] * m[10]; inv[5] = m[0] * m[10] * m[15] - m[0] * m[11] * m[14] - m[8] * m[2] * m[15] + m[8] * m[3] * m[14] + m[12] * m[2] * m[11] - m[12] * m[3] * m[10]; inv[9] = -m[0] * m[9] * m[15] + m[0] * m[11] * m[13] + m[8] * m[1] * m[15] - m[8] * m[3] * m[13] - m[12] * m[1] * m[11] + m[12] * m[3] * m[9]; inv[13] = m[0] * m[9] * m[14] - m[0] * m[10] * m[13] - m[8] * m[1] * m[14] + m[8] * m[2] * m[13] + m[12] * m[1] * m[10] - m[12] * m[2] * m[9]; inv[2] = m[1] * m[6] * m[15] - m[1] * m[7] * m[14] - m[5] * m[2] * m[15] + m[5] * m[3] * m[14] + m[13] * m[2] * m[7] - m[13] * m[3] * m[6]; inv[6] = -m[0] * m[6] * m[15] + m[0] * m[7] * m[14] + m[4] * m[2] * m[15] - m[4] * m[3] * m[14] - m[12] * m[2] * m[7] + m[12] * m[3] * m[6]; inv[10] = m[0] * m[5] * m[15] - m[0] * m[7] * m[13] - m[4] * m[1] * m[15] + m[4] * m[3] * m[13] + m[12] * m[1] * m[7] - m[12] * m[3] * m[5]; inv[14] = -m[0] * m[5] * m[14] + m[0] * m[6] * m[13] + m[4] * m[1] * m[14] - m[4] * m[2] * m[13] - m[12] * m[1] * m[6] + m[12] * m[2] * m[5]; inv[3] = -m[1] * m[6] * m[11] + m[1] * m[7] * m[10] + m[5] * m[2] * m[11] - m[5] * m[3] * m[10] - m[9] * m[2] * m[7] + m[9] * m[3] * m[6]; inv[7] = m[0] * m[6] * m[11] - m[0] * m[7] * m[10] - m[4] * m[2] * m[11] + m[4] * m[3] * m[10] + m[8] * m[2] * m[7] - m[8] * m[3] * m[6]; inv[11] = -m[0] * m[5] * m[11] + m[0] * m[7] * m[9] + m[4] * m[1] * m[11] - m[4] * m[3] * m[9] - m[8] * m[1] * m[7] + m[8] * m[3] * m[5]; inv[15] = m[0] * m[5] * m[10] - m[0] * m[6] * m[9] - m[4] * m[1] * m[10] + m[4] * m[2] * m[9] + m[8] * m[1] * m[6] - m[8] * m[2] * m[5]; det = m[0] * inv[0] + m[1] * inv[4] + m[2] * inv[8] + m[3] * inv[12]; if (det == 0) //return false; assert(false); det = 1.0 / det; for (i = 0; i < 16; i++) invOut[i] = inv[i] * det; // return true; return Cc3dMatrix4(invOut); }