//--------------------------------------------------------------------------------------------------------------------- MF_API void MFPrimitive(uint32 type, uint32 hint) { MFDebug_Assert(phase == 0, "not in order 0"); currentPrim.primType = (MFPrimType)(type & PT_PrimMask); currentPrim.pMeshState = NULL; currentPrim.indexOffset = 0; currentPrim.vertexOffset = 0; currentPrim.numIndices = 0; pEntity = pIdentity; if(type & PT_Untextured) pMaterial = MFMaterial_GetStockMaterial(MFMat_White); else pMaterial = MFMaterial_GetCurrent(); if(currentPrim.primType == MFPT_QuadList) { // D3D9 doesn't support rendering quads... currentPrim.primType = MFPT_TriangleList; gImmitateQuads = true; } else gImmitateQuads = false; gLargeStateblock = !!(type & PT_LargeStateBlock); phase = 1; }
MF_API void MFMaterial_SetMaterial(const MFMaterial *pMaterial) { MFCALLSTACK; if(!pMaterial) pMaterial = MFMaterial_GetStockMaterial(MFMat_White); pCurrentMaterial = (MFMaterial*)pMaterial; }
MF_API void MFPrimitive(uint32 type, uint32 hint) { MFCALLSTACK; primType = type & PT_PrimMask; if(type & PT_Untextured) { MFMaterial_SetMaterial(MFMaterial_GetStockMaterial(MFMat_White)); } MFRenderer_Begin(); }
void Game_Draw() { // render the prism MFView_SetAspectRatio(1.f); MFView_SetProjection(); MFRenderLayer *pLayer = MFRenderer_GetLayer(pRenderer, 0); MFRenderLayer_AddVertices(pLayer, pPrismMeshStateBlock, 0, 3*12, MFPT_TriangleList, MFMaterial_GetStockMaterial(MFMat_White), pPrismStateBlock, NULL, MFView_GetViewState()); // render the box MFView_SetAspectRatio(MFDisplay_GetAspectRatio()); MFView_SetProjection(); pLayer = MFRenderer_GetLayer(pRenderer, 1); MFRenderLayer_AddVertices(pLayer, pBoxMeshStateBlock, 0, 3*12, MFPT_TriangleList, pPrismRenderTarget, pBoxStateBlock, NULL, MFView_GetViewState()); }
MF_API void MFDebug_DebugAssert(const char *pReason, const char *pMessage, const char *pFile, int line) { MFDebug_Message(MFStr("%s(%d) : Assertion Failure.",pFile,line)); MFDebug_Message(MFStr("Failed Condition: %s\n%s", pReason, pMessage)); #if !defined(_RETAIL) MFCallstack_Log(); #endif #if defined(MF_LINUX) || defined(MF_OSX) MFDebug_Breakpoint(); #endif if(!MFFont_GetDebugFont()) return; while(!gQuit) { MFSystem_HandleEventsPlatformSpecific(); MFSystem_UpdateTimeDelta(); gFrameCount++; MFSystem_Update(); MFSystem_PostUpdate(); MFRenderer_BeginFramePlatformSpecific(); MFRenderer_SetClearColour(0,0,0,0); MFRenderer_ClearScreen(); MFView_SetDefault(); MFView_SetOrtho(); if(!(((uint32)gSystemTimer.GetSecondsF()) % 2)) { MFMaterial_SetMaterial(MFMaterial_GetStockMaterial(MFMat_White)); MFPrimitive(PT_QuadList); MFBegin(4); MFSetColour(1,0,0,1); MFSetPosition(50, 50, 0); MFSetPosition(590, 110, 0); MFSetColour(0,0,0,1); MFSetPosition(55, 55, 0); MFSetPosition(585, 105, 0); MFEnd(); } MFFont_DrawText2f(MFFont_GetDebugFont(), 110, 60, 20, MakeVector(1,0,0,1), "Software Failure. Press left mouse button to continue."); MFFont_DrawText2f(MFFont_GetDebugFont(), 240, 80, 20, MakeVector(1,0,0,1), "Guru Meditation: "); MFFont_DrawText2f(MFFont_GetDebugFont(), 80, 120, 20, MakeVector(1,0,0,1), "Assertion Failure:"); MFFont_DrawText2f(MFFont_GetDebugFont(), 80, 140, 20, MakeVector(1,0,0,1), MFStr("Failed Condition: %s", pReason)); MFFont_DrawText2f(MFFont_GetDebugFont(), 80, 160, 20, MakeVector(1,0,0,1), MFStr("File: %s, Line: %d", pFile, line)); MFFont_DrawText2f(MFFont_GetDebugFont(), 80, 190, 20, MakeVector(1,0,0,1), MFStr("Message: %s", pMessage)); #if !defined(_RETAIL) MFFont_DrawText2f(MFFont_GetDebugFont(), 80, 230, 20, MakeVector(1,0,0,1), "Callstack:"); MFFont_DrawText2f(MFFont_GetDebugFont(), 100, 250.0f, 20, MakeVector(1,0,0,1), MFCallstack_GetCallstackString()); #else MFFont_DrawText2f(MFFont_GetDebugFont(), 80, 230, 20, MakeVector(1,0,0,1), "Callstack not available in RETAIL builds"); #endif // MFSystem_Draw(); MFRenderer_EndFramePlatformSpecific(); } }
void MFCollision_DrawItem(MFCollisionItem *pItem) { // maybe reject it if its not in range.. MFVector colour = (pItem->flags & MFCIF_Disabled) ? MakeVector(1,0,0,1) : ((pItem->flags & MFCIF_Dynamic) ? MakeVector(0,0,1,1) : MakeVector(0,1,0,1)); MFMaterial_SetMaterial(MFMaterial_GetStockMaterial(MFMat_White)); switch(pItem->pTemplate->type) { case MFCT_Sphere: { MFCollisionSphere *pSphere = (MFCollisionSphere*)pItem->pTemplate->pCollisionTemplateData; MFPrimitive_DrawSphere(MFVector::zero, pSphere->radius, 8, 7, colour, pItem->worldPos, true); break; } case MFCT_Mesh: { MFCollisionMesh *pMesh = (MFCollisionMesh*)pItem->pTemplate->pCollisionTemplateData; int a; // draw each triangle MFPrimitive(PT_TriList); MFSetMatrix(pItem->worldPos); MFBegin(pMesh->numTris * 3); MFSetColour(1.0f, 1.0f, 1.0f, 0.5f); for(a=0; a<pMesh->numTris; a++) { if(pMesh->pTriangles[a].flags) MFSetColour(1.0f, 0.0f, 0.0f, 0.5f); MFSetPositionV(pMesh->pTriangles[a].verts[0]); MFSetPositionV(pMesh->pTriangles[a].verts[1]); MFSetPositionV(pMesh->pTriangles[a].verts[2]); if(pMesh->pTriangles[a].flags) { MFSetColour(1.0f, 1.0f, 1.0f, 0.5f); pMesh->pTriangles[a].flags = 0; } } MFEnd(); // draw each triangle outline MFPrimitive(PT_LineList); MFSetMatrix(pItem->worldPos); MFBegin(pMesh->numTris * 12); MFSetColourV(colour); for(a=0; a<pMesh->numTris; a++) { MFSetPositionV(pMesh->pTriangles[a].verts[0]); MFSetPositionV(pMesh->pTriangles[a].verts[1]); MFSetPositionV(pMesh->pTriangles[a].verts[1]); MFSetPositionV(pMesh->pTriangles[a].verts[2]); MFSetPositionV(pMesh->pTriangles[a].verts[2]); MFSetPositionV(pMesh->pTriangles[a].verts[0]); MFVector e1, e2, e3; e1 = (pMesh->pTriangles[a].verts[0] + pMesh->pTriangles[a].verts[1]) * 0.5f; e2 = (pMesh->pTriangles[a].verts[1] + pMesh->pTriangles[a].verts[2]) * 0.5f; e3 = (pMesh->pTriangles[a].verts[2] + pMesh->pTriangles[a].verts[0]) * 0.5f; MFSetPositionV(e1); MFSetPositionV(e1 + pMesh->pTriangles[a].edgePlanes[0] * 2.0f); MFSetPositionV(e2); MFSetPositionV(e2 + pMesh->pTriangles[a].edgePlanes[1] * 2.0f); MFSetPositionV(e3); MFSetPositionV(e3 + pMesh->pTriangles[a].edgePlanes[2] * 2.0f); // MFVector c = (pMesh->pTriangles[a].verts[0] + pMesh->pTriangles[a].verts[1] + pMesh->pTriangles[a].verts[2]) * (1.0f / 3.0f); // MFSetPosition(c); // MFSetPosition(c + pMesh->pTriangles[a].plane*3.0f); } MFEnd(); break; } case MFCT_Field: break; default: break; } }
void Game_Draw() { MFCALLSTACK; MFRenderer_SetClearColour(0.f, 0.f, 0.2f, 1.f); MFRenderer_ClearScreen(); // Set identity camera (no camera) MFView_Push(); MFView_SetAspectRatio(MFDisplay_GetNativeAspectRatio()); MFView_SetProjection(); MFMaterial_SetMaterial(MFMaterial_GetStockMaterial(MFMat_White)); // set the world matrix to identity MFMatrix world = MFMatrix::identity; // move the box into the scene (along the z axis) world.Translate(MakeVector(0, 0, 5)); // increment rotation static float rotation = 0.0f; rotation += MFSystem_TimeDelta(); // rotate the box world.RotateYPR(rotation, rotation * 2.0f, rotation * 0.5f); // begin rendering the box MFPrimitive(PT_TriList); MFSetMatrix(world); // begin rendering 12 triangles (12 * 3 vertices) MFBegin(3 * 12); // draw a bunch of triangles MFSetColour(1,0,0,1); MFSetPosition(-1,-1, -1); MFSetPosition(-1, 1, -1); MFSetPosition( 1, 1, -1); MFSetPosition(-1,-1, -1); MFSetPosition( 1, 1, -1); MFSetPosition( 1,-1, -1); MFSetColour(0,1,0,1); MFSetPosition(-1,-1,1); MFSetPosition( 1,-1,1); MFSetPosition( 1, 1,1); MFSetPosition(-1,-1,1); MFSetPosition( 1, 1,1); MFSetPosition(-1, 1,1); MFSetColour(0,0,1,1); MFSetPosition( 1,-1,1); MFSetPosition( 1,-1,-1); MFSetPosition( 1, 1,-1); MFSetPosition( 1,-1,1); MFSetPosition( 1, 1,-1); MFSetPosition( 1, 1,1); MFSetColour(1,0,1,1); MFSetPosition(-1,-1,1); MFSetPosition(-1, 1,1); MFSetPosition(-1, 1,-1); MFSetPosition(-1,-1,1); MFSetPosition(-1, 1,-1); MFSetPosition(-1,-1,-1); MFSetColour(1,1,0,1); MFSetPosition(-1, 1,1); MFSetPosition( 1, 1,1); MFSetPosition( 1, 1,-1); MFSetPosition(-1, 1,1); MFSetPosition( 1, 1,-1); MFSetPosition(-1, 1,-1); MFSetColour(0,1,1,1); MFSetPosition(-1,-1,1); MFSetPosition(-1,-1,-1); MFSetPosition( 1,-1,-1); MFSetPosition(-1,-1,1); MFSetPosition( 1,-1,-1); MFSetPosition( 1,-1,1); MFEnd(); MFRect disp; MFDisplay_GetDisplayRect(&disp); MFView_SetOrtho(&disp); pUI->Draw(); MFView_Pop(); }
void Menu::Draw() { MFVector dimensions = MakeVector(0.0f, 0.0f, 0.0f); MFVector currentPos; float requestedWidth = menuDimensions.x-40.0f; float selStart, selEnd; int a; // get menu size for(a=0; a<numChildren; a++) { MFVector dim = pChildren[a]->GetDimensions(requestedWidth); if(selection==a) { selStart = dimensions.y; selEnd = selStart + dim.y; if(selStart < -yOffset) { targetOffset = -selStart; } if(selEnd > menuDimensions.y - 75.0f - yOffset) { targetOffset = -(selEnd-(menuDimensions.y-75.0f)); } } dimensions.y += dim.y; dimensions.x = MFMax(dimensions.x, dim.x); } if(targetOffset != yOffset) { yOffset -= MFAbs(yOffset-targetOffset) < 0.1f ? yOffset-targetOffset : (yOffset-targetOffset)*0.1f; } currentPos = MakeVector(menuPosition.x+20.0f, menuPosition.y+50.0f + yOffset, 0.0f); MFPrimitive(PT_TriStrip|PT_Untextured); MFBegin(4); MFSetColourV(colour*0.4f); MFSetPosition(menuPosition.x, menuPosition.y, 0); MFSetColourV(colour*0.8f); MFSetPosition(menuPosition.x+menuDimensions.x, menuPosition.y, 0); MFSetColourV(colour*0.6f); MFSetPosition(menuPosition.x, menuPosition.y+menuDimensions.y, 0); MFSetColourV(colour); MFSetPosition(menuPosition.x+menuDimensions.x, menuPosition.y+menuDimensions.y, 0); MFEnd(); MFFont_DrawText2(MFFont_GetDebugFont(), menuPosition.x+10.0f, menuPosition.y+5.0f, MENU_FONT_HEIGHT*1.5f, MakeVector(1,0.6875f,0.5f,1), name); MFMaterial_SetMaterial(MFMaterial_GetStockMaterial(MFMat_SysLogoSmall)); float logoMargin = 5.0f; float iconSize = 35.0f; MFPrimitive(PT_TriStrip); MFBegin(4); MFSetColourV(MFVector::white); MFSetTexCoord1(0,0); MFSetPosition((menuPosition.x+menuDimensions.x) - logoMargin*2 - iconSize, menuPosition.y + logoMargin, 0); MFSetTexCoord1(1,0); MFSetPosition((menuPosition.x+menuDimensions.x) - logoMargin*2, menuPosition.y + logoMargin, 0); MFSetTexCoord1(0,1); MFSetPosition((menuPosition.x+menuDimensions.x) - logoMargin*2 - iconSize, menuPosition.y + logoMargin + iconSize, 0); MFSetTexCoord1(1,1); MFSetPosition((menuPosition.x+menuDimensions.x) - logoMargin*2, menuPosition.y + logoMargin + iconSize, 0); MFEnd(); #if MF_RENDERER == MF_DRIVER_D3D9 || MF_RENDERER == MF_DRIVER_XBOX pd3dDevice->SetRenderState(D3DRS_STENCILENABLE, TRUE); pd3dDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_ALWAYS); pd3dDevice->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_INCR); #endif MFPrimitive(PT_TriStrip|PT_Untextured); MFBegin(4); MFSetColour(0.f, 0.f, 0.f, 0.65f); MFSetPosition(menuPosition.x+15, menuPosition.y+45, 0); MFSetPosition(menuPosition.x+menuDimensions.x-15, menuPosition.y+45, 0); MFSetPosition(menuPosition.x+15, menuPosition.y+menuDimensions.y-15, 0); MFSetPosition(menuPosition.x+menuDimensions.x-15, menuPosition.y+menuDimensions.y-15, 0); MFEnd(); #if MF_RENDERER == MF_DRIVER_D3D9 || MF_RENDERER == MF_DRIVER_XBOX pd3dDevice->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_LESS); pd3dDevice->SetRenderState(D3DRS_STENCILREF, 0); #endif for(a=0; a<numChildren; a++) { if(currentPos.y > menuPosition.y + menuDimensions.y - 15.0f) break; if(selection==a) { float height = pChildren[a]->GetDimensions(requestedWidth).y; if(currentPos.y + height < menuPosition.y + 45.0f) { currentPos.y += height; continue; } MFPrimitive(PT_TriStrip|PT_Untextured); MFBegin(4); MFSetColour(0.f, 0.f, .5f, .75f); MFSetPosition(menuPosition.x+15, currentPos.y, 0); MFSetColour(0.f, 0.f, .8f, .75f); MFSetPosition(menuPosition.x+menuDimensions.x-15, currentPos.y, 0); MFSetColour(0.f, 0.f, .56f, .75f); MFSetPosition(menuPosition.x+15, currentPos.y + height, 0); MFSetColour(0.f, 0.f, .1f, .75f); MFSetPosition(menuPosition.x+menuDimensions.x-15, currentPos.y + height, 0); MFEnd(); } currentPos.y += pChildren[a]->ListDraw(selection==a, currentPos, requestedWidth); } #if MF_RENDERER == MF_DRIVER_D3D9 || MF_RENDERER == MF_DRIVER_XBOX pd3dDevice->SetRenderState(D3DRS_STENCILENABLE, FALSE); #endif }