void CRenderTools::Init(IGraphics *pGraphics, CUI *pUI) { m_pGraphics = pGraphics; m_pUI = pUI; m_TeeQuadContainerIndex = Graphics()->CreateQuadContainer(); Graphics()->SetColor(1.f, 1.f, 1.f, 1.f); SelectSprite(SPRITE_TEE_BODY, 0, 0, 0); QuadContainerAddSprite(m_TeeQuadContainerIndex, 64.f, false); SelectSprite(SPRITE_TEE_BODY_OUTLINE, 0, 0, 0); QuadContainerAddSprite(m_TeeQuadContainerIndex, 64.f, false); SelectSprite(SPRITE_TEE_EYE_PAIN, 0, 0, 0); QuadContainerAddSprite(m_TeeQuadContainerIndex, 64.f*0.4f, false); SelectSprite(SPRITE_TEE_EYE_HAPPY, 0, 0, 0); QuadContainerAddSprite(m_TeeQuadContainerIndex, 64.f*0.4f, false); SelectSprite(SPRITE_TEE_EYE_SURPRISE, 0, 0, 0); QuadContainerAddSprite(m_TeeQuadContainerIndex, 64.f*0.4f, false); SelectSprite(SPRITE_TEE_EYE_ANGRY, 0, 0, 0); QuadContainerAddSprite(m_TeeQuadContainerIndex, 64.f*0.4f, false); SelectSprite(SPRITE_TEE_EYE_NORMAL, 0, 0, 0); QuadContainerAddSprite(m_TeeQuadContainerIndex, 64.f*0.4f, false); SelectSprite(SPRITE_TEE_FOOT_OUTLINE, 0, 0, 0); QuadContainerAddSprite(m_TeeQuadContainerIndex, -32.f, -16.f, 64.f, 32.f); SelectSprite(SPRITE_TEE_FOOT, 0, 0, 0); QuadContainerAddSprite(m_TeeQuadContainerIndex, -32.f, -16.f, 64.f, 32.f); }
void CRenderTools::RenderSpeedupOverlay(CSpeedupTile *pSpeedup, int w, int h, float Scale) { float ScreenX0, ScreenY0, ScreenX1, ScreenY1; Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); int StartY = (int)(ScreenY0/Scale)-1; int StartX = (int)(ScreenX0/Scale)-1; int EndY = (int)(ScreenY1/Scale)+1; int EndX = (int)(ScreenX1/Scale)+1; for(int y = StartY; y < EndY; y++) for(int x = StartX; x < EndX; x++) { int mx = x; int my = y; if(mx<0) continue; // mx = 0; if(mx>=w) continue; // mx = w-1; if(my<0) continue; // my = 0; if(my>=h) continue; // my = h-1; int c = mx + my*w; int Force = (int)pSpeedup[c].m_Force; int MaxSpeed = (int)pSpeedup[c].m_MaxSpeed; if(Force) { // draw arrow Graphics()->TextureSet(g_pData->m_aImages[IMAGE_SPEEDUP_ARROW].m_Id); Graphics()->QuadsBegin(); SelectSprite(SPRITE_SPEEDUP_ARROW); Graphics()->QuadsSetRotation(pSpeedup[c].m_Angle*(3.14159265f/180.0f)); DrawSprite(mx*Scale+16, my*Scale+16, 35.0f); Graphics()->QuadsEnd(); // draw force char aBuf[16]; str_format(aBuf, sizeof(aBuf), "%d", Force); UI()->TextRender()->Text(0, mx*Scale, my*Scale+16, Scale-20, aBuf, -1); if(MaxSpeed) { str_format(aBuf, sizeof(aBuf), "%d", MaxSpeed); UI()->TextRender()->Text(0, mx*Scale, my*Scale-2, Scale-20, aBuf, -1); } } } Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); }
HRESULT OpenVideoFile(HWND hwnd, const WCHAR *sURL) { HRESULT hr = S_OK; hr = g_ThumbnailGen.OpenFile(sURL); if (FAILED(hr)) { return hr; } // Clear all the sprites. for (DWORD i = 0; i < MAX_SPRITES; i++) { g_pSprites[i].Clear(); } if (g_pRT == NULL) { // Create the Direct2D resources. hr = CreateDrawingResources(hwnd); } // Generate new sprites. if (SUCCEEDED(hr)) { assert(g_pRT != NULL); hr = g_ThumbnailGen.CreateBitmaps(g_pRT, MAX_SPRITES, g_pSprites); } if (SUCCEEDED(hr)) { UnselectAllSprites(); // Select the first sprite. SelectSprite(0); } if (SUCCEEDED(hr)) { hr = RenderFrame(hwnd); } return hr; }
void OnLButtonDown(HWND /*hwnd*/, BOOL /*fDoubleClick*/, int x, int y, UINT /*keyFlags*/) { // Scale for DPI x = static_cast<int>(x / g_fDPIScaleX); y = static_cast<int>(y / g_fDPIScaleY); for (DWORD i = 0; i < MAX_SPRITES; i++) { // Hit-test each sprite. Sprite *pSprite = &g_pSprites[i]; if (pSprite && pSprite->HitTest(x, y)) { SelectSprite(i); break; } } }
void CRenderTools::RenderItem(int ItemID, vec2 Pos, int TextureBlocks, float Scale, vec2 WeaponSize, float Alpha, float Rot) { if (ItemID >= NUM_WEAPONS) { Graphics()->TextureSet(TextureBlocks); RenderTile((ItemID-NUM_WEAPONS)%CBlockManager::MAX_BLOCKS, vec2(Pos.x+7.5f, Pos.y+3.5f), Scale, Alpha, Rot); } else { Graphics()->TextureSet(g_pData->m_aImages[IMAGE_GAME].m_Id); Graphics()->QuadsBegin(); SelectSprite(g_pData->m_Weapons.m_aId[ItemID%NUM_WEAPONS].m_pSpriteBody); Graphics()->SetColor(1.0f, 1.0f, 1.0f, Alpha); IGraphics::CQuadItem QuadItem(Pos.x, Pos.y, WeaponSize.x, WeaponSize.y); Graphics()->QuadsSetRotation(Rot); Graphics()->QuadsDrawTL(&QuadItem, 1); Graphics()->QuadsEnd(); } }
void CRenderTools::SelectSprite(int Id, int Flags, int sx, int sy) { if(Id < 0 || Id >= g_pData->m_NumSprites) return; SelectSprite(&g_pData->m_aSprites[Id], Flags, sx, sy); }
void CRenderTools::RenderTee(CAnimState *pAnim, CTeeRenderInfo *pInfo, int Emote, vec2 Dir, vec2 Pos, bool Alpha) { vec2 Direction = Dir; vec2 Position = Pos; //Graphics()->TextureSet(data->images[IMAGE_CHAR_DEFAULT].id); Graphics()->TextureSet(pInfo->m_Texture); // TODO: FIX ME Graphics()->QuadsBegin(); //Graphics()->QuadsDraw(pos.x, pos.y-128, 128, 128); // first pass we draw the outline // second pass we draw the filling for(int p = 0; p < 2; p++) { int OutLine = p==0 ? 1 : 0; for(int f = 0; f < 2; f++) { float AnimScale = pInfo->m_Size * 1.0f/64.0f; float BaseSize = pInfo->m_Size; if(f == 1) { Graphics()->QuadsSetRotation(pAnim->GetBody()->m_Angle*pi*2); // draw body if(Alpha) Graphics()->SetColor(pInfo->m_ColorBody.r, pInfo->m_ColorBody.g, pInfo->m_ColorBody.b, pInfo->m_ColorBody.a); else Graphics()->SetColor(pInfo->m_ColorBody.r, pInfo->m_ColorBody.g, pInfo->m_ColorBody.b, 1.0f); vec2 BodyPos = Position + vec2(pAnim->GetBody()->m_X, pAnim->GetBody()->m_Y)*AnimScale; SelectSprite(OutLine?SPRITE_TEE_BODY_OUTLINE:SPRITE_TEE_BODY, 0, 0, 0); IGraphics::CQuadItem QuadItem(BodyPos.x, BodyPos.y, BaseSize, BaseSize); Graphics()->QuadsDraw(&QuadItem, 1); // draw eyes if(p == 1) { switch (Emote) { case EMOTE_PAIN: SelectSprite(SPRITE_TEE_EYE_PAIN, 0, 0, 0); break; case EMOTE_HAPPY: SelectSprite(SPRITE_TEE_EYE_HAPPY, 0, 0, 0); break; case EMOTE_SURPRISE: SelectSprite(SPRITE_TEE_EYE_SURPRISE, 0, 0, 0); break; case EMOTE_ANGRY: SelectSprite(SPRITE_TEE_EYE_ANGRY, 0, 0, 0); break; default: SelectSprite(SPRITE_TEE_EYE_NORMAL, 0, 0, 0); break; } float EyeScale = BaseSize*0.40f; float h = Emote == EMOTE_BLINK ? BaseSize*0.15f : EyeScale; float EyeSeparation = (0.075f - 0.010f*absolute(Direction.x))*BaseSize; vec2 Offset = vec2(Direction.x*0.125f, -0.05f+Direction.y*0.10f)*BaseSize; IGraphics::CQuadItem Array[2] = { IGraphics::CQuadItem(BodyPos.x-EyeSeparation+Offset.x, BodyPos.y+Offset.y, EyeScale, h), IGraphics::CQuadItem(BodyPos.x+EyeSeparation+Offset.x, BodyPos.y+Offset.y, -EyeScale, h) }; Graphics()->QuadsDraw(Array, 2); } } // draw feet CAnimKeyframe *pFoot = f ? pAnim->GetFrontFoot() : pAnim->GetBackFoot(); float w = BaseSize; float h = BaseSize/2; Graphics()->QuadsSetRotation(pFoot->m_Angle*pi*2); bool Indicate = !pInfo->m_GotAirJump && g_Config.m_ClAirjumpindicator; float cs = 1.0f; // color scale if(OutLine) SelectSprite(SPRITE_TEE_FOOT_OUTLINE, 0, 0, 0); else { SelectSprite(SPRITE_TEE_FOOT, 0, 0, 0); if(Indicate) cs = 0.5f; } if(Alpha) Graphics()->SetColor(pInfo->m_ColorFeet.r*cs, pInfo->m_ColorFeet.g*cs, pInfo->m_ColorFeet.b*cs, pInfo->m_ColorFeet.a*cs); else Graphics()->SetColor(pInfo->m_ColorFeet.r*cs, pInfo->m_ColorFeet.g*cs, pInfo->m_ColorFeet.b*cs, 1.0f); IGraphics::CQuadItem QuadItem(Position.x+pFoot->m_X*AnimScale, Position.y+pFoot->m_Y*AnimScale, w, h); Graphics()->QuadsDraw(&QuadItem, 1); } } Graphics()->QuadsEnd(); }
void CRenderTools::RenderTee(CAnimState *pAnim, CTeeRenderInfo *pInfo, int Emote, vec2 Dir, vec2 Pos) { vec2 Direction = Dir; vec2 Position = Pos; //Graphics()->TextureSet(data->images[IMAGE_CHAR_DEFAULT].id); // TODO: FIX ME //Graphics()->QuadsDraw(pos.x, pos.y-128, 128, 128); // first pass we draw the outline // second pass we draw the filling for(int p = 0; p < 2; p++) { bool OutLine = p==0; for(int f = 0; f < 2; f++) { float AnimScale = pInfo->m_Size * 1.0f/64.0f; float BaseSize = pInfo->m_Size; if(f == 1) { vec2 BodyPos = Position + vec2(pAnim->GetBody()->m_X, pAnim->GetBody()->m_Y)*AnimScale; IGraphics::CQuadItem BodyItem(BodyPos.x, BodyPos.y, BaseSize, BaseSize); IGraphics::CQuadItem Item; // draw decoration if(pInfo->m_aTextures[2].IsValid()) { Graphics()->TextureSet(pInfo->m_aTextures[2]); Graphics()->QuadsBegin(); Graphics()->QuadsSetRotation(pAnim->GetBody()->m_Angle*pi*2); Graphics()->SetColor(pInfo->m_aColors[2].r, pInfo->m_aColors[2].g, pInfo->m_aColors[2].b, pInfo->m_aColors[2].a); SelectSprite(OutLine?SPRITE_TEE_DECORATION_OUTLINE:SPRITE_TEE_DECORATION, 0, 0, 0); Item = BodyItem; Graphics()->QuadsDraw(&Item, 1); Graphics()->QuadsEnd(); } // draw body (behind marking) Graphics()->TextureSet(pInfo->m_aTextures[0]); Graphics()->QuadsBegin(); Graphics()->QuadsSetRotation(pAnim->GetBody()->m_Angle*pi*2); if(OutLine) { Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); SelectSprite(SPRITE_TEE_BODY_OUTLINE, 0, 0, 0); } else { Graphics()->SetColor(pInfo->m_aColors[0].r, pInfo->m_aColors[0].g, pInfo->m_aColors[0].b, pInfo->m_aColors[0].a); SelectSprite(SPRITE_TEE_BODY, 0, 0, 0); } Item = BodyItem; Graphics()->QuadsDraw(&Item, 1); Graphics()->QuadsEnd(); // draw marking if(pInfo->m_aTextures[1].IsValid() && !OutLine) { Graphics()->TextureSet(pInfo->m_aTextures[1]); Graphics()->QuadsBegin(); Graphics()->QuadsSetRotation(pAnim->GetBody()->m_Angle*pi*2); Graphics()->SetColor(pInfo->m_aColors[1].r, pInfo->m_aColors[1].g, pInfo->m_aColors[1].b, pInfo->m_aColors[1].a); SelectSprite(SPRITE_TEE_MARKING, 0, 0, 0); Item = BodyItem; Graphics()->QuadsDraw(&Item, 1); Graphics()->QuadsEnd(); } // draw body (in front of marking) if(!OutLine) { Graphics()->TextureSet(pInfo->m_aTextures[0]); Graphics()->QuadsBegin(); Graphics()->QuadsSetRotation(pAnim->GetBody()->m_Angle*pi*2); Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); for(int t = 0; t < 2; t++) { SelectSprite(t==0?SPRITE_TEE_BODY_SHADOW:SPRITE_TEE_BODY_UPPER_OUTLINE, 0, 0, 0); Item = BodyItem; Graphics()->QuadsDraw(&Item, 1); } Graphics()->QuadsEnd(); } // draw eyes Graphics()->TextureSet(pInfo->m_aTextures[5]); Graphics()->QuadsBegin(); Graphics()->QuadsSetRotation(pAnim->GetBody()->m_Angle*pi*2); Graphics()->SetColor(pInfo->m_aColors[5].r, pInfo->m_aColors[5].g, pInfo->m_aColors[5].b, pInfo->m_aColors[5].a); if(p == 1) { switch (Emote) { case EMOTE_PAIN: SelectSprite(SPRITE_TEE_EYES_PAIN, 0, 0, 0); break; case EMOTE_HAPPY: SelectSprite(SPRITE_TEE_EYES_HAPPY, 0, 0, 0); break; case EMOTE_SURPRISE: SelectSprite(SPRITE_TEE_EYES_SURPRISE, 0, 0, 0); break; case EMOTE_ANGRY: SelectSprite(SPRITE_TEE_EYES_ANGRY, 0, 0, 0); break; default: SelectSprite(SPRITE_TEE_EYES_NORMAL, 0, 0, 0); break; } float EyeScale = BaseSize*0.60f; float h = Emote == EMOTE_BLINK ? BaseSize*0.15f/2.0f : EyeScale/2.0f; vec2 Offset = vec2(Direction.x*0.125f, -0.05f+Direction.y*0.10f)*BaseSize; IGraphics::CQuadItem QuadItem(BodyPos.x+Offset.x, BodyPos.y+Offset.y, EyeScale, h); Graphics()->QuadsDraw(&QuadItem, 1); } Graphics()->QuadsEnd(); } // draw feet Graphics()->TextureSet(pInfo->m_aTextures[4]); Graphics()->QuadsBegin(); CAnimKeyframe *pFoot = f ? pAnim->GetFrontFoot() : pAnim->GetBackFoot(); float w = BaseSize/2.1f; float h = w; Graphics()->QuadsSetRotation(pFoot->m_Angle*pi*2); if(OutLine) { Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); SelectSprite(SPRITE_TEE_FOOT_OUTLINE, 0, 0, 0); } else { bool Indicate = !pInfo->m_GotAirJump && g_Config.m_ClAirjumpindicator; float cs = 1.0f; // color scale if(Indicate) cs = 0.5f; Graphics()->SetColor(pInfo->m_aColors[4].r*cs, pInfo->m_aColors[4].g*cs, pInfo->m_aColors[4].b*cs, pInfo->m_aColors[4].a); SelectSprite(SPRITE_TEE_FOOT, 0, 0, 0); } IGraphics::CQuadItem QuadItem(Position.x+pFoot->m_X*AnimScale, Position.y+pFoot->m_Y*AnimScale, w, h); Graphics()->QuadsDraw(&QuadItem, 1); Graphics()->QuadsEnd(); } } }