Example #1
0
// rend_primitive 相机空间
void Renderer::ModelViewTransform(const Matrix44 &model_view)
{
    Matrix33 normal_trans = model_view.GetMatrix33();
    normal_trans.SetInverse();
    normal_trans.SetTranspose();

    // 转换灯光位置
    if (light_)
    {
        Vector4 pl;
        pl.SetVector3(light_->position);
        pl.w = 1.0f;
        pl = pl * model_view;
        light_pos_ = pl.GetVector3();
    }

#if 0
    for (int i = 0; i < rend_primitive_.size; ++i)
    {
        if (((i + 1) % 3) == 0)
        {
            Vector3 p0 = rend_primitive_.vertexs[i - 2].position.GetVector3();
            Vector3 p1 = rend_primitive_.vertexs[i - 1].position.GetVector3();
            Vector3 p2 = rend_primitive_.vertexs[i].position.GetVector3();

            Vector3 e0 = p0 - p1;
            Vector3 e1 = p1 - p2;

            Vector3 n = rend_primitive_.vertexs[i-1].normal;
            float dot = DotProduct(e0, n);
//            Logger::GtLogInfo("before:0\t%f", dot);
            assert(equalf(dot, 0, 0.001));
            dot = DotProduct(e1, n);
//            Logger::GtLogInfo("before:1\t%f", dot);
            assert(equalf(dot, 0, 0.001));
        }
    }
#endif

    for (int i = 0; i < rend_primitive_.size; ++i)
    {
        Vector4 &position = rend_primitive_.vertexs[i].position;
        position = position * model_view;
        Vector3 &normal = rend_primitive_.vertexs[i].normal;
        normal = normal * normal_trans;
        normal.SetNormalize();
    }

#if 0
    for (int i = 0; i < rend_primitive_.size; ++i)
    {
        if (((i + 1) % 3) == 0)
        {
            Vector4 p0 = rend_primitive_.vertexs[i - 2].position;
            Vector4 p1 = rend_primitive_.vertexs[i - 1].position;
            Vector4 p2 = rend_primitive_.vertexs[i].position;

            Vector3 e0 = (p0 - p1).GetVector3();
            Vector3 e1 = (p1 - p2).GetVector3();

            Vector3 N = CrossProduct(e0, e1);
            N.SetNormalize();

            float dot = DotProduct(N, e0);
            Logger::GtLogInfo("dot e0 \t%f", dot);
            dot = DotProduct(N, e1);
            Logger::GtLogInfo("dot e1 \t%f", dot);

            Vector3 n0 = rend_primitive_.vertexs[i - 2].normal;
            Vector3 n1 = rend_primitive_.vertexs[i - 1].normal;
            Vector3 n2 = rend_primitive_.vertexs[i].normal;
            Vector3 zero = CrossProduct(N, n1);
            zero.Display();

            dot = DotProduct(e0, n0);
            Logger::GtLogInfo("after:0\t%f", dot);
            dot = DotProduct(e1, n0);
            Logger::GtLogInfo("after:1\t%f", dot);
        }
    }
#endif
}