Exemple #1
0
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);
}
Exemple #2
0
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);
}
Exemple #4
0
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);
}