Exemplo n.º 1
0
/* \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);
	}
Exemplo n.º 3
0
kmMat4 Node::getWorldToNodeTransform() const
{
    kmMat4 tmp, tmp2;

    tmp2 = this->getNodeToWorldTransform();
    kmMat4Inverse(&tmp, &tmp2);
    return tmp;
}
Exemplo n.º 4
0
const kmMat4& Node::getParentToNodeTransform() const
{
    if ( _inverseDirty ) {
        kmMat4Inverse(&_inverse, &_transform);
        _inverseDirty = false;
    }

    return _inverse;
}
Exemplo n.º 5
0
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;
}
Exemplo n.º 6
0
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
}
Exemplo n.º 7
0
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);
    }
Exemplo n.º 8
0
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;
}
Exemplo n.º 9
0
 kmMat4 *worldToNodeTransform()
 {
     kmMat4Inverse(_worldToNodeTransform, nodeToWorldTransform()); //反转矩阵
     return _worldToNodeTransform;
 }