View this first
And this second
As you can see this uses my visiblity function to only show a certain amount of the whole quad (in this case, the 64x64128x128(forgot I had it stretched) section that the mouse is over.) I have a few ideas on how to incorporate this into my game.
For those that are wondering, this is the heart of the beast:
Vertex* Quad::GetVertices(Texture* pSrcTexture, bool bVisibleUpdate, RECT* pClippingRect){ if(bVisibleUpdate) { RECT QuadRect = {m_Position.x, m_Position.y, m_Position.x + m_nWidth, m_Position.y + m_nHeight}; RECT VisibleRect; IntersectRect(&VisibleRect, pClippingRect, &QuadRect); float fOffsetX = abs(QuadRect.left - VisibleRect.left); float fOffsetY = abs(QuadRect.top - VisibleRect.top); D3DXVECTOR2 Position; float fWidth, fHeight; RECT SrcRect; Position.x = m_Position.x + fOffsetX; Position.y = m_Position.y + fOffsetY; fWidth = VisibleRect.right - VisibleRect.left; fHeight = VisibleRect.bottom - VisibleRect.top; SrcRect.left = m_SrcRect0.left + fOffsetX; SrcRect.top = m_SrcRect0.top + fOffsetY; SrcRect.right = SrcRect.left + fWidth; SrcRect.bottom = SrcRect.top + fHeight; m_Vertices[0].SetXY(Position.x, Position.y + fHeight); m_Vertices[1].SetXY(Position.x, Position.y); m_Vertices[2].SetXY(Position.x + fWidth, Position.y); m_Vertices[3].SetXY(Position.x, Position.y + fHeight); m_Vertices[4].SetXY(Position.x + fWidth, Position.y); m_Vertices[5].SetXY(Position.x + fWidth, Position.y + fHeight); m_Vertices[0].SetColor(m_nTint); m_Vertices[1].SetColor(m_nTint); m_Vertices[2].SetColor(m_nTint); m_Vertices[3].SetColor(m_nTint); m_Vertices[4].SetColor(m_nTint); m_Vertices[5].SetColor(m_nTint); float fLeft = (float)SrcRect.left / (float)pSrcTexture->GetWidth(); float fTop = (float)SrcRect.top / (float)pSrcTexture->GetHeight(); float fRight = (float)SrcRect.right / (float)pSrcTexture->GetWidth(); float fBottom = (float)SrcRect.bottom / (float)pSrcTexture->GetHeight(); m_Vertices[0].SetUV(fLeft, fBottom); m_Vertices[1].SetUV(fLeft, fTop); m_Vertices[2].SetUV(fRight, fTop); m_Vertices[3].SetUV(fLeft, fBottom); m_Vertices[4].SetUV(fRight, fTop); m_Vertices[5].SetUV(fRight, fBottom); return (Vertex*)m_Vertices; } if(m_bDirtyPosition) { m_Vertices[0].SetXY(m_Position.x, m_Position.y + m_nHeight); m_Vertices[1].SetXY(m_Position.x, m_Position.y); m_Vertices[2].SetXY(m_Position.x + m_nWidth, m_Position.y); m_Vertices[3].SetXY(m_Position.x, m_Position.y + m_nHeight); m_Vertices[4].SetXY(m_Position.x + m_nWidth, m_Position.y); m_Vertices[5].SetXY(m_Position.x + m_nWidth, m_Position.y + m_nHeight); } if(m_bDirtyTint) { m_Vertices[0].SetColor(m_nTint); m_Vertices[1].SetColor(m_nTint); m_Vertices[2].SetColor(m_nTint); m_Vertices[3].SetColor(m_nTint); m_Vertices[4].SetColor(m_nTint); m_Vertices[5].SetColor(m_nTint); } if(m_bDirtySource0) { float fLeft = (float)m_SrcRect0.left / (float)pSrcTexture->GetWidth(); float fTop = (float)m_SrcRect0.top / (float)pSrcTexture->GetHeight(); float fRight = (float)m_SrcRect0.right / (float)pSrcTexture->GetWidth(); float fBottom = (float)m_SrcRect0.bottom / (float)pSrcTexture->GetHeight(); m_Vertices[0].SetUV(fLeft, fBottom); m_Vertices[1].SetUV(fLeft, fTop); m_Vertices[2].SetUV(fRight, fTop); m_Vertices[3].SetUV(fLeft, fBottom); m_Vertices[4].SetUV(fRight, fTop); m_Vertices[5].SetUV(fRight, fBottom); } m_bDirtyPosition = false; m_bDirtySize = false; m_bDirtyTint = false; m_bDirtySource0 = false; return (Vertex*)m_Vertices;}
This isn't the fastest method, but I'm not worried about that right now (it runs, and it doesn't lag the system at all, so I'm sticking with it.)
Next up will be a movie with sound and a moving thingy.
You're journal has really gone up a few more notches since I last was reading it. Your progress seems to be great! I'm particularly interested in the RPG-ish game you've got in development down there. I'll be sure to keep a keener eye on your journal.