//// Glut callbacks ///// void GlGlut::display() { glClearColor(0, 0, 0, 1); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glUseProgram(programObject); float projection[4][4]; Matrix_Perpsective(60.0, 1.0, 0.1, 100, projection); float modelview[4][4]; Matrix_LookAt(0, 0, 5, 0, 0, 0, 0, 1, 0, modelview); float temp[4][4]; Matrix_Translate(0.0, -1.0, 0.0, temp); Matrix_Multiplication(modelview, temp, modelview); Matrix_Rotate(x_angle, 0, 1, 0, temp); Matrix_Multiplication(modelview, temp, modelview); Matrix_Rotate(y_angle, 1, 0, 0, temp); Matrix_Multiplication(modelview, temp, modelview); Matrix_Scale(scale_size, scale_size, scale_size, temp); Matrix_Multiplication(modelview, temp, modelview); // Normal matrix is transpose of inverse of modelview's upper left 3x3 float normal[3][3]; matrix_inverse_3x3(modelview, normal); float modelview_projection[4][4]; Matrix_Multiplication(projection, modelview, modelview_projection); GLuint m = glGetUniformLocation(programObject, "m_modelview"); GLuint p = glGetUniformLocation(programObject, "m_mvp"); GLuint n = glGetUniformLocation(programObject, "m_normal"); // Send with transpose=true to convert to opengl's column major glUniformMatrix4fv(m, 1, GL_TRUE, &modelview[0][0]); glUniformMatrix4fv(p, 1, GL_TRUE, &modelview_projection[0][0]); glUniformMatrix3fv(n, 1, GL_TRUE, &normal[0][0]); if (programObject == phong_point) { float light_pos_loc[4] = {1.0, -1.0, 1.0, 1.0}; float (*light_pos)[4] = &light_pos_loc; if (phong_fixed_point) { // Multiply light's position by model view matrix to keep it // fixed with respect to mesh object float light_pos_mv[4]; matrix_multiply_point(modelview, light_pos_loc, light_pos_mv); light_pos = &light_pos_mv; } GLuint l = glGetUniformLocation(programObject, "light_pos"); glUniform4fv(l, 1, *light_pos); } mesh->render(programObject); glutSwapBuffers(); }
void CG_DrawTestBox( vec3_t origin, vec3_t mins, vec3_t maxs, vec3_t angles ) { vec3_t start, end, vec; float linewidth = 6; vec3_t localAxis[3]; #if 1 vec3_t ax[3]; AnglesToAxis( angles, ax ); Matrix_Transpose( ax, localAxis ); #else Matrix_Copy( axis_identity, localAxis ); if( angles[YAW] ) Matrix_Rotate( localAxis, -angles[YAW], 0, 0, 1 ); if( angles[PITCH] ) Matrix_Rotate( localAxis, -angles[PITCH], 0, 1, 0 ); if( angles[ROLL] ) Matrix_Rotate( localAxis, -angles[ROLL], 1, 0, 0 ); #endif //horizontal projection start[0] = mins[0]; start[1] = mins[1]; start[2] = mins[2]; end[0] = mins[0]; end[1] = mins[1]; end[2] = maxs[2]; // convert to local axis space VectorCopy( start, vec ); Matrix_TransformVector( localAxis, vec, start ); VectorCopy( end, vec ); Matrix_TransformVector( localAxis, vec, end ); VectorAdd( origin, start, start ); VectorAdd( origin, end, end ); CG_QuickPolyBeam( start, end, linewidth, NULL ); start[0] = mins[0]; start[1] = maxs[1]; start[2] = mins[2]; end[0] = mins[0]; end[1] = maxs[1]; end[2] = maxs[2]; // convert to local axis space VectorCopy( start, vec ); Matrix_TransformVector( localAxis, vec, start ); VectorCopy( end, vec ); Matrix_TransformVector( localAxis, vec, end ); VectorAdd( origin, start, start ); VectorAdd( origin, end, end ); CG_QuickPolyBeam( start, end, linewidth, NULL ); start[0] = maxs[0]; start[1] = mins[1]; start[2] = mins[2]; end[0] = maxs[0]; end[1] = mins[1]; end[2] = maxs[2]; // convert to local axis space VectorCopy( start, vec ); Matrix_TransformVector( localAxis, vec, start ); VectorCopy( end, vec ); Matrix_TransformVector( localAxis, vec, end ); VectorAdd( origin, start, start ); VectorAdd( origin, end, end ); CG_QuickPolyBeam( start, end, linewidth, NULL ); start[0] = maxs[0]; start[1] = maxs[1]; start[2] = mins[2]; end[0] = maxs[0]; end[1] = maxs[1]; end[2] = maxs[2]; // convert to local axis space VectorCopy( start, vec ); Matrix_TransformVector( localAxis, vec, start ); VectorCopy( end, vec ); Matrix_TransformVector( localAxis, vec, end ); VectorAdd( origin, start, start ); VectorAdd( origin, end, end ); CG_QuickPolyBeam( start, end, linewidth, NULL ); //x projection start[0] = mins[0]; start[1] = mins[1]; start[2] = mins[2]; end[0] = maxs[0]; end[1] = mins[1]; end[2] = mins[2]; // convert to local axis space VectorCopy( start, vec ); Matrix_TransformVector( localAxis, vec, start ); VectorCopy( end, vec ); Matrix_TransformVector( localAxis, vec, end ); VectorAdd( origin, start, start ); VectorAdd( origin, end, end ); CG_QuickPolyBeam( start, end, linewidth, NULL ); start[0] = mins[0]; start[1] = maxs[1]; start[2] = maxs[2]; end[0] = maxs[0]; end[1] = maxs[1]; end[2] = maxs[2]; // convert to local axis space VectorCopy( start, vec ); Matrix_TransformVector( localAxis, vec, start ); VectorCopy( end, vec ); Matrix_TransformVector( localAxis, vec, end ); VectorAdd( origin, start, start ); VectorAdd( origin, end, end ); CG_QuickPolyBeam( start, end, linewidth, NULL ); start[0] = mins[0]; start[1] = maxs[1]; start[2] = mins[2]; end[0] = maxs[0]; end[1] = maxs[1]; end[2] = mins[2]; // convert to local axis space VectorCopy( start, vec ); Matrix_TransformVector( localAxis, vec, start ); VectorCopy( end, vec ); Matrix_TransformVector( localAxis, vec, end ); VectorAdd( origin, start, start ); VectorAdd( origin, end, end ); CG_QuickPolyBeam( start, end, linewidth, NULL ); start[0] = mins[0]; start[1] = mins[1]; start[2] = maxs[2]; end[0] = maxs[0]; end[1] = mins[1]; end[2] = maxs[2]; // convert to local axis space VectorCopy( start, vec ); Matrix_TransformVector( localAxis, vec, start ); VectorCopy( end, vec ); Matrix_TransformVector( localAxis, vec, end ); VectorAdd( origin, start, start ); VectorAdd( origin, end, end ); CG_QuickPolyBeam( start, end, linewidth, NULL ); //z projection start[0] = mins[0]; start[1] = mins[1]; start[2] = mins[2]; end[0] = mins[0]; end[1] = maxs[1]; end[2] = mins[2]; // convert to local axis space VectorCopy( start, vec ); Matrix_TransformVector( localAxis, vec, start ); VectorCopy( end, vec ); Matrix_TransformVector( localAxis, vec, end ); VectorAdd( origin, start, start ); VectorAdd( origin, end, end ); CG_QuickPolyBeam( start, end, linewidth, NULL ); start[0] = maxs[0]; start[1] = mins[1]; start[2] = maxs[2]; end[0] = maxs[0]; end[1] = maxs[1]; end[2] = maxs[2]; // convert to local axis space VectorCopy( start, vec ); Matrix_TransformVector( localAxis, vec, start ); VectorCopy( end, vec ); Matrix_TransformVector( localAxis, vec, end ); VectorAdd( origin, start, start ); VectorAdd( origin, end, end ); CG_QuickPolyBeam( start, end, linewidth, NULL ); start[0] = maxs[0]; start[1] = mins[1]; start[2] = mins[2]; end[0] = maxs[0]; end[1] = maxs[1]; end[2] = mins[2]; // convert to local axis space VectorCopy( start, vec ); Matrix_TransformVector( localAxis, vec, start ); VectorCopy( end, vec ); Matrix_TransformVector( localAxis, vec, end ); VectorAdd( origin, start, start ); VectorAdd( origin, end, end ); CG_QuickPolyBeam( start, end, linewidth, NULL ); start[0] = mins[0]; start[1] = mins[1]; start[2] = maxs[2]; end[0] = mins[0]; end[1] = maxs[1]; end[2] = maxs[2]; // convert to local axis space VectorCopy( start, vec ); Matrix_TransformVector( localAxis, vec, start ); VectorCopy( end, vec ); Matrix_TransformVector( localAxis, vec, end ); VectorAdd( origin, start, start ); VectorAdd( origin, end, end ); CG_QuickPolyBeam( start, end, linewidth, NULL ); }