KDvoid RenderTextureTargetNode::update ( KDfloat fDelta )
{
    static KDfloat  fTime = 0;
    KDfloat  r = 80;

    m_pSprite1->setPosition ( ccp ( kdCosf ( fTime * 2 ) * r, kdSinf ( fTime * 2 ) * r ) );
    m_pSprite2->setPosition ( ccp ( kdSinf ( fTime * 2 ) * r, kdCosf ( fTime * 2 ) * r ) );
    
    fTime += fDelta;
}
void mtx4_rotatey(float* dm, float deg)
{
	float rad;
	float sval;
	float cval;

	if(!dm){
		return;
	}

	while(deg >= 360.0f){
		deg -= 360.0f;
	}
	while(deg < 0){
		deg += 360.0f;
	}

	rad = deg * (float)(KD_PI_F / 180.0);
	sval = kdSinf(rad);
	cval = kdCosf(rad);
	mtx4_identity(dm);
	dm[0]  = cval;
	dm[2]  = -sval;
	dm[8]  = sval;
	dm[10] = cval;
}
void PhysicsDebugDraw::drawShape(PhysicsShape& shape)
{
    for (auto it = shape.m_pInfo->getShapes().begin(); it != shape.m_pInfo->getShapes().end(); ++it)
    {
        cpShape *subShape = *it;
        
        switch ((*it)->klass->type)
        {
            case CP_CIRCLE_SHAPE:
            {
                float radius = PhysicsHelper::cpfloat2float(cpCircleShapeGetRadius(subShape));
                Point centre = PhysicsHelper::cpv2point(cpBodyGetPos(cpShapeGetBody(subShape)))
                + PhysicsHelper::cpv2point(cpCircleShapeGetOffset(subShape));
                
                static const int CIRCLE_SEG_NUM = 12;
                Point seg[CIRCLE_SEG_NUM] = {};
                
                for (int i = 0; i < CIRCLE_SEG_NUM; ++i)
                {
                    float angle = (float)i * KD_PI_F / (float)CIRCLE_SEG_NUM * 2.0f;
                    Point d(radius * kdCosf(angle), radius * kdSinf(angle));
                    seg[i] = centre + d;
                }
                m_pDrawNode->drawPolygon(seg, CIRCLE_SEG_NUM, Color4F(1.0f, 0.0f, 0.0f, 0.3f), 1, Color4F(1, 0, 0, 1));
                break;
            }
            case CP_SEGMENT_SHAPE:
            {
                cpSegmentShape *seg = (cpSegmentShape *)subShape;
                m_pDrawNode->drawSegment(PhysicsHelper::cpv2point(seg->ta),
                                       PhysicsHelper::cpv2point(seg->tb),
                                       PhysicsHelper::cpfloat2float(seg->r==0 ? 1 : seg->r), Color4F(1, 0, 0, 1));
                break;
            }
            case CP_POLY_SHAPE:
            {
                cpPolyShape* poly = (cpPolyShape*)subShape;
                int num = poly->numVerts;
                Point* seg = new Point[num];
                
                PhysicsHelper::cpvs2points(poly->tVerts, seg, num);
                
                m_pDrawNode->drawPolygon(seg, num, Color4F(1.0f, 0.0f, 0.0f, 0.3f), 1.0f, Color4F(1.0f, 0.0f, 0.0f, 1.0f));
                
                delete[] seg;
                break;
            }
            default:
                break;
        }
    }
}
void TransformHelp::nodeToMatrix(const BaseData &node, AffineTransform &matrix)
{
    if (node.m_fSkewX == -node.m_fSkewY)
    {
        double sine   = kdSinf(node.m_fSkewX);
        double cosine = kdCosf(node.m_fSkewX);
        
        matrix.a = node.m_fScaleX * cosine;
        matrix.b = node.m_fScaleX * -sine;
        matrix.c = node.m_fScaleY * sine;
        matrix.d = node.m_fScaleY * cosine;
    }
    else
    {
        matrix.a = node.m_fScaleX * kdCosf(node.m_fSkewY);
        matrix.b = node.m_fScaleX * kdSinf(node.m_fSkewY);
        matrix.c = node.m_fScaleY * kdSinf(node.m_fSkewX);
        matrix.d = node.m_fScaleY * kdCosf(node.m_fSkewX);
    }

    matrix.tx = node.x;
    matrix.ty = node.y;
}
void EaseSineInOut::update(float time)
{
    m_pInner->update(-0.5f * (kdCosf(KD_PI_F * time) - 1));
}
void EaseSineIn::update(float time)
{
    m_pInner->update(-1 * kdCosf(time * KD_PI_2_F) + 1);
}
KDvoid CCEaseSineInOut::update ( KDfloat fTime )
{
	m_pInner->update ( -0.5f * ( kdCosf ( KD_PI_F * fTime ) - 1 ) );
}
KDvoid CCEaseSineIn::update ( KDfloat fTime )
{
	m_pInner->update ( -1 * kdCosf ( fTime * KD_PI_2_F ) + 1 );
}