void CRenderer::DrawRect( float x, float y, float w, float h, const CIwColour & color ) { int32 nVerts = 5; CIwSVec2 * vertex = IW_GX_ALLOC(CIwSVec2, nVerts); uint16* indexStream = IW_GX_ALLOC(uint16, nVerts); CIwColour* colour = IW_GX_ALLOC(CIwColour,nVerts); int count = 0; for (int i = 0; i < nVerts; i++) { colour[i] = color; indexStream[count] = count; count++; } vertex[0].x = FLOAT_TO_FIXED(x); vertex[0].y = FLOAT_TO_FIXED(y); vertex[1].x = FLOAT_TO_FIXED((x + w)); vertex[1].y = FLOAT_TO_FIXED(y); vertex[2].x = FLOAT_TO_FIXED((x + w)); vertex[2].y = FLOAT_TO_FIXED((y + h)); vertex[3].x = FLOAT_TO_FIXED(x); vertex[3].y = FLOAT_TO_FIXED((y + h)); vertex[4] = vertex[0]; Draw(IW_GX_LINE_STRIP, vertex, NULL, indexStream, colour, nVerts, NULL ); }
// This is the main rendering function that you have to implement and provide to ImGui (via setting up 'RenderDrawListsFn' in the ImGuiIO structure) void ImGui_Marmalade_RenderDrawLists(ImDrawData* draw_data) { // Handle cases of screen coordinates != from framebuffer coordinates (e.g. retina displays) ImGuiIO& io = ImGui::GetIO(); draw_data->ScaleClipRects(io.DisplayFramebufferScale); // Render command lists for(int n = 0; n < draw_data->CmdListsCount; n++) { const ImDrawList* cmd_list = draw_data->CmdLists[n]; const unsigned char* vtx_buffer = (const unsigned char*)&cmd_list->VtxBuffer.front(); const ImDrawIdx* idx_buffer = &cmd_list->IdxBuffer.front(); int nVert = cmd_list->VtxBuffer.size(); CIwFVec2* pVertStream = IW_GX_ALLOC(CIwFVec2, nVert); CIwFVec2* pUVStream = IW_GX_ALLOC(CIwFVec2, nVert); CIwColour* pColStream = IW_GX_ALLOC(CIwColour, nVert); for( int i=0; i < nVert; i++ ) { // TODO: optimize multiplication on gpu using vertex shader pVertStream[i].x = cmd_list->VtxBuffer[i].pos.x * g_scale.x; pVertStream[i].y = cmd_list->VtxBuffer[i].pos.y * g_scale.y; pUVStream[i].x = cmd_list->VtxBuffer[i].uv.x; pUVStream[i].y = cmd_list->VtxBuffer[i].uv.y; pColStream[i] = cmd_list->VtxBuffer[i].col; } IwGxSetVertStreamScreenSpace(pVertStream, nVert); IwGxSetUVStream(pUVStream); IwGxSetColStream(pColStream, nVert); IwGxSetNormStream(0); for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.size(); cmd_i++) { const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; if (pcmd->UserCallback) { pcmd->UserCallback(cmd_list,pcmd); } else { CIwMaterial* pCurrentMaterial = IW_GX_ALLOC_MATERIAL(); pCurrentMaterial->SetShadeMode(CIwMaterial::SHADE_FLAT); pCurrentMaterial->SetCullMode(CIwMaterial::CULL_NONE); pCurrentMaterial->SetFiltering(false); pCurrentMaterial->SetAlphaMode(CIwMaterial::ALPHA_BLEND); pCurrentMaterial->SetDepthWriteMode(CIwMaterial::DEPTH_WRITE_NORMAL); pCurrentMaterial->SetAlphaTestMode(CIwMaterial::ALPHATEST_DISABLED); pCurrentMaterial->SetTexture((CIwTexture*)pcmd->TextureId); IwGxSetMaterial(pCurrentMaterial); IwGxDrawPrims(IW_GX_TRI_LIST, (uint16*)idx_buffer, pcmd->ElemCount); } idx_buffer += pcmd->ElemCount; } IwGxFlush(); } // TODO: restore modified state (i.e. mvp matrix) }
void DrawRect(int x, int y, int width, int height, uint8 r, uint8 g, uint8 b) { int right = x + width; int bottom = y + height; if (x < 0) x = 0; if (y < 0) y = 0; if (right > (int32)s3eSurfaceGetInt(S3E_SURFACE_WIDTH)) right = s3eSurfaceGetInt(S3E_SURFACE_WIDTH); if (bottom > (int32)s3eSurfaceGetInt(S3E_SURFACE_HEIGHT)) bottom = s3eSurfaceGetInt(S3E_SURFACE_HEIGHT); // Draw the text IwGxSetScreenSpaceSlot(0); CIwMaterial *fadeMat = IW_GX_ALLOC_MATERIAL(); fadeMat->SetAlphaMode(CIwMaterial::NONE); fadeMat->SetShadeMode(CIwMaterial::SHADE_FLAT); IwGxSetMaterial(fadeMat); CIwColour* cols = IW_GX_ALLOC(CIwColour, 4); for (int i = 0; i < 4; i++) cols[i].Set(r, g, b); CIwSVec2 xy(x, y); CIwSVec2 wh(width, height); IwGxDrawRectScreenSpace(&xy, &wh, cols); }
void MapBackground::RenderElement(CIwUIGraphics& parentGraphics) { // Render tiles for the background std::list<MapTile*>::iterator iter = gVectorImageUrls.begin(); int i = 0; while (iter != gVectorImageUrls.end()) { MapTile* pTile = *iter; if (pTile->pTexture) { //Calculate the top left of the map image CIwSVec2 topLeft, bottomRight; topLeft.x = pTile->location.x; topLeft.y = pTile->location.y; CIwUIRect rect(CIwVec2(topLeft.x, topLeft.y), CIwVec2(pTile->pTexture->GetWidth(), pTile->pTexture->GetHeight())); CIwUIColour c(0xff,0xff,0xff,0xff); CIwColour* wtf = IW_GX_ALLOC(CIwColour, 4); CIwMaterial* pMat = IW_GX_ALLOC_MATERIAL(); pMat->SetModulateMode(CIwMaterial::MODULATE_NONE); pMat->SetTexture(pTile->pTexture); parentGraphics.DrawImage(pTile->pTexture, pMat, rect, CIwSVec2(0,0), CIwSVec2(4096, 4096), c, false); } iter++; } }
bool Notify(CIwUIElement* pReceiver, CIwEvent* pEvent) { int id = pEvent->GetID(); if (id == IWUI_EVENT_CLICK) { CIwUIEventClick* a = (CIwUIEventClick*)pEvent; if (!a->GetPressed()) { EventStruct x; x.pReceiver = pReceiver; x.pEvent = IW_GX_ALLOC(CIwUIEventClick, 1); memcpy(x.pEvent, a, sizeof(CIwUIEventClick)); g_events.append(x); return true; } } return CIwUIController::Notify(pReceiver, pEvent); if (pEvent->GetSender()) { s3eDeviceYield(0); return true; } return CIwUIController::FilterEvent(pEvent); }
void CRenderer::Draw( IwGxPrimType type, const CIwSVec2 * vertex, const CIwSVec2 * uv, const uint16* indexStream, const CIwColour * colour, int32 vertexCount, CIwMaterial * mat ) { if ( mat == NULL ) { mat = mDefaultMaterial; } if (( GetVBSize() + vertexCount >= RENDER_MAX_BUFF_SIZE || (mat != mCurrMtl) || (GetBufferType() != type) || (uv == NULL && GetUVBSize() != 0) || (indexStream == NULL && GetIBSize() != 0) || (colour == NULL && GetCBSize() != 0) )) { DrawBatch(); } if ( (uint32)vertexCount >= RENDER_MAX_BUFF_SIZE ) { CIwSVec2 * _v = IW_GX_ALLOC(CIwSVec2, vertexCount); CIwSVec2 * _uv = IW_GX_ALLOC(CIwSVec2, vertexCount); CIwColour * _c = IW_GX_ALLOC(CIwColour, vertexCount); uint16 * _is = NULL; if (indexStream != NULL ) { _is = IW_GX_ALLOC(uint16, vertexCount); memcpy(_is, indexStream, vertexCount*sizeof(uint16)); } memcpy(&_v[0], &vertex[0], vertexCount*sizeof(CIwSVec2)); memcpy(&_uv[0], &uv[0], vertexCount*sizeof(CIwSVec2)); memcpy(&_c[0], &colour[0], vertexCount*sizeof(CIwColour)); CameraTransform( &_v[0], vertexCount); DrawDirect(type, _v, _uv, _is, _c, vertexCount, mat); } else { mCurrMtl = mat; SetBufferType(type); AddBuffer(type, vertex, uv, indexStream, colour, vertexCount); CameraTransform( &mVB[GetVBSize() - vertexCount], vertexCount); } }
CIwSVec2* AllocClientScreenRectangle() { CIwSVec2* pCoords = IW_GX_ALLOC(CIwSVec2, 4); pCoords[0].x = 0; pCoords[0].y = 0; pCoords[1].x = 0; pCoords[1].y = (int16)IwGxGetScreenHeight(); pCoords[2].x = (int16)IwGxGetScreenWidth(); pCoords[2].y = 0; pCoords[3].x = (int16)IwGxGetScreenWidth(); pCoords[3].y = (int16)IwGxGetScreenHeight(); return pCoords; }
static void SoftkeyRender(const char* text, s3eDeviceSoftKeyPosition pos, void(*handler)()) { // TODO: Hardocoded font width and height (boo!) int width = 7; int height = 30; width *= strlen(text) * 2; int x = 0; int y = 0; switch (pos) { case S3E_DEVICE_SOFTKEY_BOTTOM_LEFT: y = IwGxGetScreenHeight() - height; x = 0; break; case S3E_DEVICE_SOFTKEY_BOTTOM_RIGHT: y = IwGxGetScreenHeight() - height; x = IwGxGetScreenWidth() - width; break; case S3E_DEVICE_SOFTKEY_TOP_RIGHT: y = 0; x = IwGxGetScreenWidth() - width; break; case S3E_DEVICE_SOFTKEY_TOP_LEFT: x = 0; y = 0; break; } CIwMaterial *fadeMat = IW_GX_ALLOC_MATERIAL(); fadeMat->SetAlphaMode(CIwMaterial::SUB); IwGxSetMaterial(fadeMat); IwGxPrintString(x + 10, y+10, text, false); CIwColour* cols = IW_GX_ALLOC(CIwColour, 4); memset(cols, 50, sizeof(CIwColour)*4); if (s3ePointerGetState(S3E_POINTER_BUTTON_SELECT) & S3E_POINTER_STATE_PRESSED) { int pointerx = s3ePointerGetX(); int pointery = s3ePointerGetY(); if (pointerx >= x && pointerx <= x+width && pointery >=y && pointery <= y+height) { memset(cols, 15, sizeof(CIwColour)*4); handler(); } } // Draw button area CIwSVec2 XY(x, y-2), dXY(width, height); IwGxDrawRectScreenSpace(&XY, &dXY, cols); }
void CEndGameState::Render() { IW_CALLSTACK("CEndGameState::Render"); IwGxClear(IW_GX_COLOUR_BUFFER_F | IW_GX_DEPTH_BUFFER_F); GetWorld().Render(); IwGxLightingOff(); IwGxSetScreenSpaceOrg( &CIwSVec2::g_Zero ); CIwColour* cols = IW_GX_ALLOC(CIwColour, 4); memset(cols, 255, sizeof(CIwColour) * 4 ); if (GetWorld().GetUICar()->GetPosition() == 1 ) { CIwMaterial* mat = (CIwMaterial *)IwGetResManager()->GetGroupNamed("ui")->GetResNamed("youwin", IW_GX_RESTYPE_MATERIAL); IwGxSetMaterial(mat); } else { CIwMaterial* mat = (CIwMaterial *)IwGetResManager()->GetGroupNamed("ui")->GetResNamed("youlose", IW_GX_RESTYPE_MATERIAL); IwGxSetMaterial(mat); } const uint32 imageWidth = 128; const uint32 imageHeight = 32; CIwSVec2 XY( (int16)((IwGxGetScreenWidth()/2) - (imageWidth/2)), (int16)(IwGxGetScreenHeight()/4) ), dXY( (int16)imageWidth, (int16)imageHeight ); IwGxDrawRectScreenSpace(&XY, &dXY, cols); IwGxLightingOn(); IwGxFlush(); IwGxSwapBuffers(); #ifdef IW_DEBUG // Reset metrics for next frame IwGxMetricsReset(); #endif }
// BatchDrawPrims - Currently only supports batching of Quad lists void CzPlatformRender::BatchDrawPrims(bool filter) { if (NextMaterial == 0) return; // Allocate memory from data cache for verts, UV's and colours for (int t = 0; t < NextMaterial; t++) { int prim_count = MaterialUsedCounts[t] * 4; BatchVerts[t] = IW_GX_ALLOC(CzVec2, prim_count); BatchUVs[t] = IW_GX_ALLOC(CzVec2, prim_count); BatchColours[t] = IW_GX_ALLOC(CzColour, prim_count); BatchIndices[t] = IW_GX_ALLOC(uint16, prim_count); } // Populate the data cache CzRenderPrim** prims = Primitives; for (int t = 0; t < NextPrimitive; t++) { CzRenderPrim *prim = *prims; int mat_id = prim->MaterialID; int idx = MaterialIndices[mat_id]; CzVec2* v = BatchVerts[mat_id] + idx; CzVec2* uv = BatchUVs[mat_id] + idx; CzColour* c = BatchColours[mat_id] + idx; uint16* i = BatchIndices[mat_id] + idx; for (int t2 = 0; t2 < 4; t2++) { v->x = (prim->Verts + t2)->x; v->y = (prim->Verts + t2)->y; uv->x = (prim->UVs + t2)->x; uv->y = (prim->UVs + t2)->y; c->set(*(prim->Colours + t2)); v++; uv++; c++; } // TODO: ERROR - Does not work with batched ngon *i++ = idx; *i++ = idx + 3; *i++ = idx + 2; *i++ = idx + 1; MaterialIndices[mat_id] += 4; prims++; } // Render batched streams CzRenderMaterial** mats = Materials; for (int t = 0; t < NextMaterial; t++) { int count = MaterialUsedCounts[t] * 4; IwGxSetUVStream((CIwFVec2*)BatchUVs[t], 0); IwGxSetVertStreamScreenSpace((CIwFVec2*)BatchVerts[t], count); IwGxSetColStream((CIwColour*)(BatchColours[t]), count); IwGxSetNormStream(NULL); CIwMaterial* mat = IW_GX_ALLOC_MATERIAL(); CIwTexture* texture = static_cast<CIwTexture*>((*mats)->Image->getTexture()); mat->SetTexture(texture); mat->SetDepthWriteMode(CIwMaterial::DEPTH_WRITE_DISABLED); mat->SetClamping(false); mat->SetFiltering(filter); mat->SetAlphaMode(CIwMaterial::ALPHA_BLEND); mat->SetCullMode(CIwMaterial::CULL_BACK); // mat->SetCullMode(CIwMaterial::CULL_NONE); IwGxSetMaterial(mat); IwGxDrawPrims(IW_GX_QUAD_LIST, BatchIndices[t], count); mats++; } // Reset batch pointers for (int t = 0; t < NextMaterial; t++) MaterialUsedCounts[t] = 0; for (int t = 0; t < NextMaterial; t++) MaterialIndices[t] = 0; NextPrimitive = 0; NextMaterial = 0; }
void CzPlatformRender::DrawText(CzFontPreparedText prepared_text, CzFont* font, CzMatrix3* transform, const CzColour& colour, CzVec4& skew, bool filter, eCzAlphaMode alpha_mode) { CIwMaterial::AlphaMode am = (CIwMaterial::AlphaMode)alpha_mode; // TODO Add proper method map Marmalade Alpha mode to Marmalade // Cache the transform float m00 = transform->m[0][0]; float m01 = transform->m[0][1]; float m10 = transform->m[1][0]; float m11 = transform->m[1][1]; float tx = transform->getX(); float ty = transform->getY(); float sx1 = (float)skew.x; float sx2 = (float)skew.y; float sy1 = (float)skew.z; float sy2 = (float)skew.w; /* CzIRect clip = ScreenClipRect; clip.x <<= 3; clip.y <<= 3; clip.w = clip.x + (clip.w << 3); clip.h = clip.y + (clip.h << 3);*/ IwGxLightingOn(); IwGxSetColStream(NULL); IwGxSetNormStream(NULL); CIwGxFont* mfont = static_cast<CIwGxFont*>(font->getFontHandle()); CIwGxFontPreparedData* prep_text = static_cast<CIwGxFontPreparedData*>(prepared_text); // A font can consist of multiple materials so we need to process all of them for (int t = 0; t < mfont->GetNumberMaterials(); t++) { // Set UV stream uint32* char_ids; int num_chars = IwGxFontSetUVs(*prep_text, -1, t, &char_ids); // Generate transformed vertices from glyphs int nv = num_chars << 2; CzVec2* pVerts = IW_GX_ALLOC(CzVec2, nv); CzVec2* pVert = pVerts; if (m01 == 0 && m10 == 0) { // No rotation optimisation for (int t2 = 0; t2 < num_chars; t2++) { CIwRect rc = prep_text->GetCharacterArea(char_ids[t2]); float x1 = (float)rc.x; float y1 = (float)rc.y; float x2 = x1 + (float)rc.w; float y2 = y1 + (float)rc.h; float ax = (m00 * x1) + tx; float ay = (m11 * y1) + ty; float bx = (m00 * x2) + tx; float by = (m11 * y2) + ty; // if ((ax < clip.w && bx >= clip.x) && (ay < clip.h && by >= clip.y)) // { pVert->x = ax + sx1; pVert->y = ay + sy1; pVert++; pVert->x = ax - sx1; pVert->y = by + sy2; pVert++; pVert->x = bx - sx2; pVert->y = by - sy2; pVert++; pVert->x = bx + sx2; pVert->y = ay - sy1; pVert++; // } } } else { for (int t2 = 0; t2 < num_chars; t2++) { CIwRect rc = prep_text->GetCharacterArea(char_ids[t2]); float x1 = (float)rc.x; float y1 = (float)rc.y; float x2 = x1 + (float)rc.w; float y2 = y1 + (float)rc.h; pVert->x = (m00 * x1 + m10 * y1 + tx + sx1); pVert->y = (m01 * x1 + m11 * y1 + ty + sy1); pVert++; pVert->x = (m00 * x1 + m10 * y2 + tx - sx1); pVert->y = (m01 * x1 + m11 * y2 + ty + sy2); pVert++; pVert->x = (m00 * x2 + m10 * y2 + tx - sx2); pVert->y = (m01 * x2 + m11 * y2 + ty - sy2); pVert++; pVert->x = (m00 * x2 + m10 * y1 + tx + sx2); pVert->y = (m01 * x2 + m11 * y1 + ty - sy1); pVert++; } } if (nv > 0) { // Set vertex stream IwGxSetVertStreamScreenSpace((CIwFVec2*)pVerts, nv); // Create a material CIwMaterial* mat = IW_GX_ALLOC_MATERIAL(); mat->Copy(*IwGxFontGetFont()->GetMaterial(t)); mat->SetDepthWriteMode(CIwMaterial::DEPTH_WRITE_DISABLED); mat->SetColEmissive(colour.get()); mat->SetClamping(true); mat->SetFiltering(filter); mat->SetAlphaMode(am); mat->SetCullMode(CIwMaterial::CULL_BACK); // mat->SetCullMode(CIwMaterial::CULL_NONE); IwGxSetMaterial(mat); // Finally draw the glyphs IwGxDrawPrims(IW_GX_QUAD_LIST, NULL, nv); CurrentAlphaMode = alpha_mode; } } IwGxLightingOff(); CurrentTexture = NULL; }
extern "C" void RenderCursorskeys() { int height = 20; int width = 45; int lefty = IwGxGetScreenHeight() - (height * 2); int leftx = (IwGxGetScreenWidth() - 220) / 2; int upy = IwGxGetScreenHeight() - (height * 3); int upx = leftx+width + (width/2); int downy = IwGxGetScreenHeight() - height; int downx = upx; int righty = IwGxGetScreenHeight() - (height * 2); int rightx = downx + width + (width/2); CIwMaterial *fadeMat = IW_GX_ALLOC_MATERIAL(); fadeMat->SetAlphaMode(CIwMaterial::SUB); IwGxSetMaterial(fadeMat); g_Cursorkey = EXCURSOR_NONE; if ( (s3eKeyboardGetState(s3eKeyLeft) & S3E_KEY_STATE_DOWN) ) g_Cursorkey = EXCURSOR_LEFT; if ( (s3eKeyboardGetState(s3eKeyRight) & S3E_KEY_STATE_DOWN) ) g_Cursorkey = EXCURSOR_RIGHT; if ( (s3eKeyboardGetState(s3eKeyUp) & S3E_KEY_STATE_DOWN) ) g_Cursorkey = EXCURSOR_UP; if ( (s3eKeyboardGetState(s3eKeyDown) & S3E_KEY_STATE_DOWN) ) g_Cursorkey = EXCURSOR_DOWN; if(s3ePointerGetInt(S3E_POINTER_AVAILABLE)) { if (s3ePointerGetState(S3E_POINTER_BUTTON_SELECT) & S3E_POINTER_STATE_DOWN) { int pointerx = s3ePointerGetX(); int pointery = s3ePointerGetY(); // Check left if (pointerx >= leftx && pointerx <= leftx+width && pointery >=lefty && pointery <= lefty+height) g_Cursorkey = EXCURSOR_LEFT; // Check right if (pointerx >= rightx && pointerx <= rightx+width && pointery >=righty && pointery <= righty+height) g_Cursorkey = EXCURSOR_RIGHT; // Check up if (pointerx >= upx && pointerx <= upx+width && pointery >=upy && pointery <= upy+height) g_Cursorkey = EXCURSOR_UP; // Check down if (pointerx >= downx && pointerx <= downx+width && pointery >=downy && pointery <= downy+height) g_Cursorkey = EXCURSOR_DOWN; } CIwColour* cols = IW_GX_ALLOC(CIwColour, 4); if((s3ePointerGetState(S3E_POINTER_BUTTON_SELECT) & S3E_POINTER_STATE_DOWN) && (g_Cursorkey != EXCURSOR_NONE)) memset(cols, 10, sizeof(CIwColour)*4); else memset(cols, 50, sizeof(CIwColour)*4); // draw black rect covering screen CIwSVec2 rectdim(width, height); CIwSVec2 uXY(upx, upy-2); IwGxDrawRectScreenSpace(&uXY, &rectdim, cols); IwGxPrintString(upx + 10, upy + 5, "Up", false); CIwSVec2 dXY(downx, downy-2); IwGxDrawRectScreenSpace(&dXY, &rectdim, cols); IwGxPrintString(downx + 10, downy + 5, "Down", false); CIwSVec2 lXY(leftx, lefty-2); IwGxDrawRectScreenSpace(&lXY, &rectdim, cols); IwGxPrintString(leftx + 10, lefty + 5, "Left", false); CIwSVec2 rXY(rightx, righty-2); IwGxDrawRectScreenSpace(&rXY, &rectdim, cols); IwGxPrintString(rightx + 10, righty + 5, "Right", false); } }
extern "C" void RenderButtons() { ExButtons* pbutton = g_ButtonsHead; if(g_ButtonsHead) { pbutton = g_ButtonsHead; while(pbutton != NULL) { // Check the key and pointer states. pbutton->key_state = s3eKeyboardGetState(pbutton->key); if( s3eKeyboardGetState(pbutton->key) & S3E_KEY_STATE_DOWN ) { if(pbutton->handler) pbutton->handler(); } if (!(s3ePointerGetState(S3E_POINTER_BUTTON_SELECT) & S3E_POINTER_STATE_UP)) { int pointerx = s3ePointerGetX(); int pointery = s3ePointerGetY(); if (pointerx >= pbutton->x && pointerx <= pbutton->x+pbutton->w && pointery >=pbutton->y && pointery <= pbutton->y+pbutton->h) { if (s3ePointerGetState(S3E_POINTER_BUTTON_SELECT) & S3E_POINTER_STATE_DOWN) { pbutton->key_state = S3E_KEY_STATE_DOWN; } if (s3ePointerGetState(S3E_POINTER_BUTTON_SELECT) & S3E_POINTER_STATE_PRESSED) { pbutton->key_state = S3E_KEY_STATE_PRESSED; } if(pbutton->handler) pbutton->handler(); } } // Draw the text IwGxSetScreenSpaceSlot(0); if(s3ePointerGetInt(S3E_POINTER_AVAILABLE)) { CIwMaterial *fadeMat = IW_GX_ALLOC_MATERIAL(); fadeMat->SetAlphaMode(CIwMaterial::SUB); IwGxSetMaterial(fadeMat); CIwColour* cols = IW_GX_ALLOC(CIwColour, 4); if(pbutton->key_state == S3E_KEY_STATE_DOWN) memset(cols, 15, sizeof(CIwColour)*4); else memset(cols, 50, sizeof(CIwColour)*4); // Draw button area CIwSVec2 XY(pbutton->x, pbutton->y-2), dXY(pbutton->w, pbutton->h); IwGxDrawRectScreenSpace(&XY, &dXY, cols); } IwGxPrintString(pbutton->x + 2, pbutton->y + ((pbutton->h - 10)/2), pbutton->name, false); pbutton = pbutton->next; } } }
void MapBackground::RenderBackgroundOnSurface(CIw2DSurface* pSurface) { std::list<MapTile*>::iterator iter = gVectorImageUrls.begin(); // Set up a view matrix to rotate what we are viewing about the z-axis // This normalizes the center of the screen to (0,0), so we need to offset // our coordinates. // We also need to scale in our X and Y directions. CIwColour colClear; colClear = IwGxGetColClear(); if (g_dAlpha < 0xFF) { IwGxSetColClear(0, 0, 0, 0); } CIwColour* cols = IW_GX_ALLOC(CIwColour, 4); for (int i = 0; i < 4; ++i) { cols[i].r = cols[i].g = cols[i].b = 0xff; cols[i].a = (uint8)g_dAlpha; } //static CIwSVec2 uvs[4] = //{ // CIwSVec2(0 << 12, 0 << 12), // CIwSVec2(0 << 12, 1 << 12), // CIwSVec2(1 << 12, 1 << 12), // CIwSVec2(1 << 12, 0 << 12), //}; static CIwSVec2 uvs[4] = { CIwSVec2((0 << 12) + 1, (0 << 12) + 1), CIwSVec2((0 << 12) + 1, (1 << 12) - 1), CIwSVec2((1 << 12) - 1, (1 << 12) - 1), CIwSVec2((1 << 12) - 1, (0 << 12) + 1), }; static CIwSVec2 uvsRot[4] = { CIwSVec2((0 << 12) + 20, (0 << 12) + 20), CIwSVec2((0 << 12) + 20, (1 << 12) - 20), CIwSVec2((1 << 12) - 20, (1 << 12) - 20), CIwSVec2((1 << 12) - 20, (0 << 12) + 20), }; while (iter != gVectorImageUrls.end()) { MapTile* pTile = *iter; CIwTexture* pTexture = pTile->pTexture; if (pTexture) { //Calculate the top left of the map image CIwSVec2 topLeft = pTile->location; CIwMaterial* pMat = IW_GX_ALLOC_MATERIAL(); pMat->SetAlphaMode(CIwMaterial::ALPHA_BLEND); pMat->SetModulateMode(CIwMaterial::MODULATE_RGB); // Use Texture on Material pMat->SetTexture(pTexture); IwGxSetMaterial(pMat); int xOffset = IwGxGetScreenWidth() / 2; int yOffset = IwGxGetScreenHeight() / 2; CIwSVec3* pWSCoords= IW_GX_ALLOC(CIwSVec3, 4); pWSCoords[0].x = topLeft.x; pWSCoords[0].y = topLeft.y; pWSCoords[1].x = topLeft.x; pWSCoords[1].y = topLeft.y + 256; pWSCoords[2].x = topLeft.x + 256; pWSCoords[2].y = topLeft.y + 256; pWSCoords[3].x = topLeft.x + 256; pWSCoords[3].y = topLeft.y; pWSCoords[0].z = pWSCoords[1].z = pWSCoords[2].z = pWSCoords[3].z = 0; // Scale the coordinates by offsetting, scaling and rendering for (int i = 0; i < 4; ++i) { pWSCoords[i].x -= xOffset; pWSCoords[i].y -= yOffset; } IwGxSetVertStreamWorldSpace(pWSCoords, 4); if (g_bScaledMode) { IwGxSetUVStream(uvsRot); } else { IwGxSetUVStream(uvs); } IwGxSetColStream(cols); IwGxDrawPrims(IW_GX_QUAD_LIST, NULL, 4); } iter++; } IwGxSetColStream(NULL); //IwGxSetColClear(colClear.r, colClear.g, colClear.b, colClear.a); }
void MapBackground::DownloadTiles() { CIwTexture* tx = (CIwTexture*)IwGetResManager()->GetResNamed("logo", IW_GX_RESTYPE_TEXTURE); uint32 w1 = tx->GetWidth(); uint32 h1 = tx->GetHeight(); //static CIwSVec2 uvs[4] = //{ // CIwSVec2(0 << 12, 0 << 12), // CIwSVec2(0 << 12, 1 << 12), // CIwSVec2(1 << 12, 1 << 12), // CIwSVec2(1 << 12, 0 << 12), //}; static CIwSVec2 uvs[4] = { CIwSVec2((0 << 12) + 10, (0 << 12) + 10), CIwSVec2((0 << 12) + 10, (1 << 12) - 10), CIwSVec2((1 << 12) - 10, (1 << 12) - 10), CIwSVec2((1 << 12) - 10, (0 << 12) + 10), }; int w = w1/2; int h = h1/2; int counter = 0; while (true) { IwGetHTTPQueue()->Update(); IwGetNotificationHandler()->Update(); IwGetMultiplayerHandler()->Update(); IwGxClear(IW_GX_COLOUR_BUFFER_F | IW_GX_DEPTH_BUFFER_F); CIwMaterial* pMat = IW_GX_ALLOC_MATERIAL(); pMat->SetModulateMode(CIwMaterial::MODULATE_NONE); pMat->SetTexture(tx); IwGxSetMaterial(pMat); CIwMat rotMat; rotMat.SetIdentity(); double perCentAngle = (counter / 80.0); iwangle degAng = (iwangle)(IW_GEOM_ONE * perCentAngle); rotMat.SetRotZ(degAng); rotMat.t.z = -0x200; IwGxSetViewMatrix(&rotMat); CIwSVec3* pWSCoords= IW_GX_ALLOC(CIwSVec3, 4); pWSCoords[0].x = -w; pWSCoords[0].y = -h; pWSCoords[1].x = -w; pWSCoords[1].y = h; pWSCoords[2].x = w; pWSCoords[2].y = h; pWSCoords[3].x = w; pWSCoords[3].y = -h; pWSCoords[0].z = pWSCoords[1].z = pWSCoords[2].z = pWSCoords[3].z = 0; if (!g_bInProgress) { MapTile* pNextDownload = GetNextDownload(NULL); if (pNextDownload) { IwGetNotificationHandler()->PushNotification((int)this, pNextDownload->szImageUrl, 10*1000); g_bInProgress = true; LoadMapTileImage(pNextDownload); } else { IwGetNotificationHandler()->ClearNotification((int)this); break; } } IwGxSetVertStreamWorldSpace(pWSCoords, 4); IwGxSetUVStream(uvs); IwGxDrawPrims(IW_GX_QUAD_LIST, NULL, 4); IwGetNotificationHandler()->Render(); IwGxFlush(); IwGxSwapBuffers(); s3eDeviceYield(50); counter++; } }