/* \brief transform V3B object */ static void _glhckSkinBoneTransformObjectV3B(glhckObject *object) { unsigned int i, w; kmMat4 bias, biasinv, scale, scaleinv; static glhckVector3b zero = {0,0,0}; kmMat4Translation(&bias, object->geometry->bias.x, object->geometry->bias.y, object->geometry->bias.z); kmMat4Scaling(&scale, object->geometry->scale.x, object->geometry->scale.y, object->geometry->scale.z); kmMat4Inverse(&biasinv, &bias); kmMat4Inverse(&scaleinv, &scale); for (i = 0; i != object->numSkinBones; ++i) { glhckSkinBone *skinBone = object->skinBones[i]; for (w = 0; w != skinBone->numWeights; ++w) { glhckVertexWeight *weight = &skinBone->weights[w]; if (weight->vertexIndex >= (glhckIndexi)object->geometry->vertexCount) continue; memcpy(&object->geometry->vertices.v3b[weight->vertexIndex].vertex, &zero, sizeof(glhckVector3s)); memcpy(&object->geometry->vertices.v3b[weight->vertexIndex].normal, &zero, sizeof(glhckVector3s)); } } for (i = 0; i != object->numSkinBones; ++i) { kmMat3 transformedNormal; kmMat4 transformedVertex, transformedMatrix, offsetMatrix; glhckSkinBone *skinBone = object->skinBones[i]; if (!skinBone->bone) continue; kmMat4Multiply(&transformedMatrix, &biasinv, &skinBone->bone->transformedMatrix); kmMat4Multiply(&transformedMatrix, &scaleinv, &transformedMatrix); kmMat4Multiply(&offsetMatrix, &skinBone->offsetMatrix, &bias); kmMat4Multiply(&offsetMatrix, &offsetMatrix, &scale); kmMat4Multiply(&transformedVertex, &transformedMatrix, &offsetMatrix); kmMat3AssignMat4(&transformedNormal, &transformedVertex); for (w = 0; w != skinBone->numWeights; ++w) { glhckVector3f bindVertex, bindNormal; glhckVertexWeight *weight = &skinBone->weights[w]; if (weight->vertexIndex >= (glhckIndexi)object->geometry->vertexCount) continue; glhckSetV3(&bindVertex, &object->bindGeometry->vertices.v3b[weight->vertexIndex].vertex); glhckSetV3(&bindNormal, &object->bindGeometry->vertices.v3b[weight->vertexIndex].normal); kmVec3MultiplyMat4((kmVec3*)&bindVertex, (kmVec3*)&bindVertex, &transformedVertex); kmVec3MultiplyMat3((kmVec3*)&bindNormal, (kmVec3*)&bindNormal, &transformedNormal); object->geometry->vertices.v3b[weight->vertexIndex].vertex.x += bindVertex.x * weight->weight; object->geometry->vertices.v3b[weight->vertexIndex].vertex.y += bindVertex.y * weight->weight; object->geometry->vertices.v3b[weight->vertexIndex].vertex.z += bindVertex.z * weight->weight; object->geometry->vertices.v3b[weight->vertexIndex].normal.x += bindNormal.x * weight->weight; object->geometry->vertices.v3b[weight->vertexIndex].normal.y += bindNormal.y * weight->weight; object->geometry->vertices.v3b[weight->vertexIndex].normal.z += bindNormal.z * weight->weight; } } }
void Cocos2dRenderManager::initialise() { CCDirector *pDirector = CCDirector::sharedDirector(); MYGUI_PLATFORM_ASSERT(!mIsInitialise, getClassTypeName() << " initialised twice"); MYGUI_PLATFORM_LOG(Info, "* Initialise: " << getClassTypeName()); CCSize s = pDirector->getWinSizeInPixels(); this->setPosition(0, 0); this->setContentSize(s); setViewSize(int(s.width), int(s.height)); // 绑定到cocos2d节点 pDirector->setNotificationNode(this); mInfo.pixWidth = s.width; mInfo.pixHeight = s.height; mVertexFormat = VertexColourType::ColourABGR; mUpdate = true; kmMat4 tmp; kmGLGetMatrix(KM_GL_PROJECTION, &tmp); kmMat4Inverse(&mMatrix, &tmp); MYGUI_PLATFORM_LOG(Info, getClassTypeName() << " successfully initialized"); mIsInitialise = true; CCNotificationCenter::sharedNotificationCenter()->addObserver(this, callfuncO_selector(Cocos2dRenderManager::listenForeToBackground), EVENT_COME_TO_BACKGROUND, NULL); pDirector->getScheduler()->scheduleUpdateForTarget(this, kCCPriorityNonSystemMin, false); }
kmMat4 Node::getWorldToNodeTransform() const { kmMat4 tmp, tmp2; tmp2 = this->getNodeToWorldTransform(); kmMat4Inverse(&tmp, &tmp2); return tmp; }
const kmMat4& Node::getParentToNodeTransform() const { if ( _inverseDirty ) { kmMat4Inverse(&_inverse, &_transform); _inverseDirty = false; } return _inverse; }
void CControl::ParentToLocal(float &x, float &y) { CVec3 pos(x, y, 0.f); kmMat4 inverse; kmMat4Inverse(&inverse, &GetLocalTM()); pos.Transform(inverse); x = pos.x; y = pos.y; }
void Camera::update_frustum() { //Recalculate the view matrix kmMat4Inverse(&view_matrix_, &transform_); kmMat4 mvp; kmMat4Multiply(&mvp, &projection_matrix(), &view_matrix()); frustum_.build(&mvp); //Update the frustum for this camera }
cxVec2f cxWindowPointToViewPoint(cxAny pview,cxVec2f wPoint) { cxView this = pview; cxView pv = this; cxVec3f out; cxMatrix4f matrix; kmVec3Fill(&out, wPoint.x, wPoint.y, 0); cxArray list = CX_ALLOC(cxArray); while (pv != NULL && pv->parentView != NULL) { cxArrayAppend(list, pv); pv = pv->parentView; } CX_ARRAY_REVERSE(list, ele){ pv = cxArrayObject(ele); kmMat4Inverse(&matrix, &pv->normalMatrix); kmVec3Transform(&out, &out, &matrix); kmMat4Inverse(&matrix, &pv->anchorMatrix); kmVec3Transform(&out, &out, &matrix); }
bool Transform::pointInside(float x,float y,float& ox,float& oy) { kmMat4 t_mat; kmMat4Inverse(&t_mat, &m_matrix); kmVec3 outpos; kmVec3 inpos; // float nx = x*2/Device::GetInstance()->getCurrentCanvas()->getLayerWidth()-1; // float ny = -y*2/Device::GetInstance()->getCurrentCanvas()->getLayerHeight()+1; kmVec3Fill(&inpos,x,y,0); kmVec3Transform(&outpos,&inpos,&t_mat); ox = outpos.x; oy = outpos.y; if (outpos.x >= 0 && outpos.y >= 0 && outpos.x < m_width&& outpos.y < m_height) { return true; } return false; }
kmMat4 *worldToNodeTransform() { kmMat4Inverse(_worldToNodeTransform, nodeToWorldTransform()); //反转矩阵 return _worldToNodeTransform; }