void drawFrame() { u32 i, color = 0; Matrix4 viewMatrix,modelViewMatrix; //clear screen rsxSetClearColor(context, color); //rsxSetClearDepthValue(context,0xffff); rsxClearSurface(context,GCM_CLEAR_R | GCM_CLEAR_G | GCM_CLEAR_B | GCM_CLEAR_A //| //GCM_CLEAR_S | //GCM_CLEAR_Z ); for (i = 0; i < 8; i++) { rsxSetViewportClip(context, i, display_width, display_height); } viewMatrix = Matrix4::lookAt(eye_pos, eye_dir, up_vec); //draw background image modelViewMatrix = transpose(viewMatrix * modelMatrix); setDrawEnv(0); setTexture(textureW, textureH, texture_buffer, texture_offset); drawMesh(quad, &modelViewMatrix, (float*)&scanline); if (showUi) { //draw UI modelViewMatrix = transpose(viewMatrix * modelMatrixUi); setDrawEnv(1); setTexture(textureW_ui, textureH_ui, texture_buffer_ui, texture_offset_ui); drawMesh(quad_ui, &modelViewMatrix, (float*)&scanlineUi); } }
void drawFrame() { u32 i,offset,color = 0; Matrix4 rotX,rotY; Vector4 objEyePos,objLightPos; Matrix4 viewMatrix,modelMatrix,modelMatrixIT,modelViewMatrix; Point3 lightPos = Point3(250.0f,150.0f,150.0f); f32 globalAmbientColor[3] = {0.1f,0.1f,0.1f}; f32 lightColor[3] = {0.95f,0.95f,0.95f}; f32 materialColorDiffuse[3] = {0.5f,0.0f,0.0f}; f32 materialColorSpecular[3] = {0.7f,0.6f,0.6f}; f32 shininess = 17.8954f; static f32 rot = 0.0f; SMeshBuffer *mesh = NULL; setTexture(); setDrawEnv(); rsxSetClearColor(context,color); rsxSetClearDepthValue(context,0xffff); rsxClearSurface(context,GCM_CLEAR_R | GCM_CLEAR_G | GCM_CLEAR_B | GCM_CLEAR_A | GCM_CLEAR_S | GCM_CLEAR_Z); rsxZControl(context,0,1,1); for(i=0;i<8;i++) rsxSetViewportClip(context,i,display_width,display_height); viewMatrix = Matrix4::lookAt(eye_pos,eye_dir,up_vec); mesh = sphere; rotX = Matrix4::rotationX(DEGTORAD(30.0f)); rotY = Matrix4::rotationY(DEGTORAD(rot)); modelMatrix = rotX*rotY; modelMatrixIT = inverse(modelMatrix); modelViewMatrix = transpose(viewMatrix*modelMatrix); objEyePos = modelMatrixIT*eye_pos; objLightPos = modelMatrixIT*lightPos; rsxAddressToOffset(&mesh->vertices[0].pos,&offset); rsxBindVertexArrayAttrib(context,vertexPosition_id,offset,sizeof(S3DVertex),3,GCM_VERTEX_DATA_TYPE_F32,GCM_LOCATION_RSX); rsxAddressToOffset(&mesh->vertices[0].nrm,&offset); rsxBindVertexArrayAttrib(context,vertexNormal_id,offset,sizeof(S3DVertex),3,GCM_VERTEX_DATA_TYPE_F32,GCM_LOCATION_RSX); rsxAddressToOffset(&mesh->vertices[0].u,&offset); rsxBindVertexArrayAttrib(context,vertexTexcoord_id,offset,sizeof(S3DVertex),2,GCM_VERTEX_DATA_TYPE_F32,GCM_LOCATION_RSX); rsxLoadVertexProgram(context,vpo,vp_ucode); rsxSetVertexProgramParameter(context,vpo,projMatrix_id,(float*)&P); rsxSetVertexProgramParameter(context,vpo,modelViewMatrix_id,(float*)&modelViewMatrix); rsxSetFragmentProgramParameter(context,fpo,eyePosition_id,(float*)&objEyePos,fp_offset); rsxSetFragmentProgramParameter(context,fpo,globalAmbient_id,globalAmbientColor,fp_offset); rsxSetFragmentProgramParameter(context,fpo,lightPosition_id,(float*)&objLightPos,fp_offset); rsxSetFragmentProgramParameter(context,fpo,lightColor_id,lightColor,fp_offset); rsxSetFragmentProgramParameter(context,fpo,shininess_id,&shininess,fp_offset); rsxSetFragmentProgramParameter(context,fpo,Kd_id,materialColorDiffuse,fp_offset); rsxSetFragmentProgramParameter(context,fpo,Ks_id,materialColorSpecular,fp_offset); rsxLoadFragmentProgramLocation(context,fpo,fp_offset,GCM_LOCATION_RSX); rsxSetUserClipPlaneControl(context,GCM_USER_CLIP_PLANE_DISABLE, GCM_USER_CLIP_PLANE_DISABLE, GCM_USER_CLIP_PLANE_DISABLE, GCM_USER_CLIP_PLANE_DISABLE, GCM_USER_CLIP_PLANE_DISABLE, GCM_USER_CLIP_PLANE_DISABLE); rsxAddressToOffset(&mesh->indices[0],&offset); rsxDrawIndexArray(context,GCM_TYPE_TRIANGLES,offset,mesh->cnt_indices,GCM_INDEX_TYPE_16B,GCM_LOCATION_RSX); mesh = donut; rotX = Matrix4::rotationX(DEGTORAD(rot)); rotY = Matrix4::rotationY(DEGTORAD(30.0f)); modelMatrix = rotX*rotY; modelMatrix.setTranslation(Vector3(3.0f,5.0f,-8.0f)); modelMatrixIT = inverse(modelMatrix); modelViewMatrix = transpose(viewMatrix*modelMatrix); objEyePos = modelMatrixIT*eye_pos; objLightPos = modelMatrixIT*lightPos; rsxAddressToOffset(&mesh->vertices[0].pos,&offset); rsxBindVertexArrayAttrib(context,vertexPosition_id,offset,sizeof(S3DVertex),3,GCM_VERTEX_DATA_TYPE_F32,GCM_LOCATION_RSX); rsxAddressToOffset(&mesh->vertices[0].nrm,&offset); rsxBindVertexArrayAttrib(context,vertexNormal_id,offset,sizeof(S3DVertex),3,GCM_VERTEX_DATA_TYPE_F32,GCM_LOCATION_RSX); rsxAddressToOffset(&mesh->vertices[0].u,&offset); rsxBindVertexArrayAttrib(context,vertexTexcoord_id,offset,sizeof(S3DVertex),2,GCM_VERTEX_DATA_TYPE_F32,GCM_LOCATION_RSX); rsxLoadVertexProgram(context,vpo,vp_ucode); rsxSetVertexProgramParameter(context,vpo,projMatrix_id,(float*)&P); rsxSetVertexProgramParameter(context,vpo,modelViewMatrix_id,(float*)&modelViewMatrix); rsxSetFragmentProgramParameter(context,fpo,eyePosition_id,(float*)&objEyePos,fp_offset); rsxSetFragmentProgramParameter(context,fpo,globalAmbient_id,globalAmbientColor,fp_offset); rsxSetFragmentProgramParameter(context,fpo,lightPosition_id,(float*)&objLightPos,fp_offset); rsxSetFragmentProgramParameter(context,fpo,lightColor_id,lightColor,fp_offset); rsxSetFragmentProgramParameter(context,fpo,shininess_id,&shininess,fp_offset); rsxSetFragmentProgramParameter(context,fpo,Kd_id,materialColorDiffuse,fp_offset); rsxSetFragmentProgramParameter(context,fpo,Ks_id,materialColorSpecular,fp_offset); rsxLoadFragmentProgramLocation(context,fpo,fp_offset,GCM_LOCATION_RSX); rsxSetUserClipPlaneControl(context,GCM_USER_CLIP_PLANE_DISABLE, GCM_USER_CLIP_PLANE_DISABLE, GCM_USER_CLIP_PLANE_DISABLE, GCM_USER_CLIP_PLANE_DISABLE, GCM_USER_CLIP_PLANE_DISABLE, GCM_USER_CLIP_PLANE_DISABLE); rsxAddressToOffset(&mesh->indices[0],&offset); rsxDrawIndexArray(context,GCM_TYPE_TRIANGLES,offset,mesh->cnt_indices,GCM_INDEX_TYPE_16B,GCM_LOCATION_RSX); rot += 4.0f; if(rot>=360.0f) rot = 0.0f; }