NVECTOR2 IGraphicObject::GetBasePosOffset() { IRenderer* pRenderer = GetScene()->GetRenderer(); UINT mainWidth = pRenderer->GetMainBufferWidth(); UINT mainHeight = pRenderer->GetMainBufferHeight(); //Position Offset NVECTOR2 outBaseTopLeftPixel = *m_pBaseScreenSpacePosOffset; //mFunction_ConvertFloatVec2PixelVec(outBaseTopLeftPixel); outBaseTopLeftPixel.x = outBaseTopLeftPixel.x *float(mainWidth) / 2.0f; outBaseTopLeftPixel.y = - outBaseTopLeftPixel.y * float(mainHeight) / 2.0f; return outBaseTopLeftPixel; }
inline float IGraphicObject::mFunction_ConvertPixelLength2FloatLength(float pxLen, BOOL isWidth) { IRenderer* pRenderer = GetScene()->GetRenderer(); UINT mainWidth = pRenderer->GetMainBufferWidth(); UINT mainHeight = pRenderer->GetMainBufferHeight(); float outLength = 0; //PIXEL SPACE TO [-1,1] SCR SPACE if (isWidth) { outLength = pxLen*2.0f / (float)mainWidth; } else { outLength = pxLen * 2.0f / (float)mainHeight; } return outLength; }
void IGraphicObject::mFunction_ConvertFloatVec2PixelVec(NVECTOR2 & in_out_vec) { // ---------> // | // | PIXEL SPACE // | // ^ // | // --------|---------> // | SCR SPACE // | IRenderer* pRenderer = GetScene()->GetRenderer(); UINT mainWidth = pRenderer->GetMainBufferWidth(); UINT mainHeight = pRenderer->GetMainBufferHeight(); in_out_vec.x = float(mainWidth) *((in_out_vec.x + 1.0f) / 2.0f); in_out_vec.y = float(mainHeight)*((1.0f - in_out_vec.y) / 2.0f); };
void IGraphicObject::SetBasePosOffset(NVECTOR2 pixelOffset) { // ---------> // | // | PIXEL SPACE // | // ^ // | // --------|---------> // | SCR SPACE // | IRenderer* pRenderer = GetScene()->GetRenderer(); UINT mainWidth = pRenderer->GetMainBufferWidth(); UINT mainHeight = pRenderer->GetMainBufferHeight(); pixelOffset.x = pixelOffset.x * 2.0f / float(mainWidth); pixelOffset.y = -pixelOffset.y*2.0f / float(mainHeight); //vector difference NVECTOR2 offsetV = pixelOffset - (*m_pBaseScreenSpacePosOffset); if (offsetV.x ==0.0f && offsetV.y == 0.0f)return; *m_pBaseScreenSpacePosOffset = pixelOffset; //update vertices, deviate with the upper difference for (UINT i = 0;i < NOISE_GRAPHIC_OBJECT_BUFFER_COUNT;i++) { if (i == NOISE_GRAPHIC_OBJECT_TYPE_LINE_3D || i == NOISE_GRAPHIC_OBJECT_TYPE_POINT_3D)continue; for (UINT j = 0;j < m_pVB_Mem[i]->size();++j) //for (auto &v : *m_pVB_Mem[i]) { m_pVB_Mem[i]->at(j).Pos.x += offsetV.x; m_pVB_Mem[i]->at(j).Pos.y += offsetV.y; } mCanUpdateToGpu[i] = TRUE; } }
inline void IGraphicObject::mFunction_ConvertPixelVec2FloatVec(NVECTOR2& vec) { // ---------> // | // | PIXEL SPACE // | // ^ // | // --------|---------> // | SCR SPACE // | IRenderer* pRenderer = GetScene()->GetRenderer(); UINT mainWidth = pRenderer->GetMainBufferWidth(); UINT mainHeight = pRenderer->GetMainBufferHeight(); //PIXEL SPACE TO [-1,1] SCR SPACE float halfW= (float)mainWidth / 2.0f; float halfH = (float)mainHeight / 2.0f; vec.x = (vec.x / halfW)- 1.0f; vec.y=1.0f - (vec.y / halfH); //vec -= *m_pBaseScreenSpacePosOffset; }