// Constructor //----------------------------------------------------------------------------- CPUTRenderNode::CPUTRenderNode(): mpParent(NULL), mpChild(NULL), mpSibling(NULL) { // set transform to identity mWorldMatrix = float4x4Identity(); mParentMatrix = float4x4Identity(); // always create with everything dirty mWorldMatrixDirty = true; }
void CPUTGuiControllerOGL::UpdateConstantBuffer() { if(mpConstantBufferVS ) { float znear = 0.1f; float zfar = 100.0f; float4x4 m; m = float4x4OrthographicOffCenterLH(0, (float)mWidth, (float)mHeight, 0, znear, zfar); GUIConstantBufferVS ConstantBufferMatrices; ConstantBufferMatrices.Projection = m; m = float4x4Identity(); ConstantBufferMatrices.Model = m; mpConstantBufferVS->SetData(0, sizeof(GUIConstantBufferVS), &ConstantBufferMatrices); } }
// Draw - must be positioned after all the controls are defined //-------------------------------------------------------------------------------- void CPUTGuiControllerOGL::Draw() { HEAPCHECK; static double timeSinceLastFPSUpdate = 0; static int framesSinceLastFPSUpdate = 0; static double avgFPS = 0; static double minFrameTime = 999; static double maxFrameTime = 0; static CPUT_RECT windowRect = {0, 0, 0, 0}; if( 0 == GetNumberOfControlsInPanel()) { return; } // check and see if any of the controls resized themselves int ControlCount=GetNumberOfControlsInPanel(); bool ResizingNeeded = false; for(int ii=0; ii<ControlCount; ii++) { CPUTControl *pControl = mControlPanelIDList[mActiveControlPanelSlotID]->mControlList[ii]; if(true == pControl->ControlResizedItself()) { ResizingNeeded = true; pControl->ControlResizingHandled(); } } // if any of the controls resized, then re-do the autoarrangment if(true == ResizingNeeded) { this->Resize(); } // Now check to see if any controls' graphics are dirty for(int ii=0; ii<ControlCount; ii++) { CPUTControl *pControl = mControlPanelIDList[mActiveControlPanelSlotID]->mControlList[ii]; if(true == pControl->ControlGraphicsDirty()) { mUberBufferDirty = true; break; } } // if any of the controls have announced they are dirty, then rebuild the mirror buffer and update the GFX buffer if(mUberBufferDirty) { // if a resize was flagged, do it now. if(mRecalculateLayout) { RecalculateLayout(); mRecalculateLayout = false; } // 'clear' the buffer by resetting the pointer to the head mUberBufferIndex = 0; mTextUberBufferIndex = 0; mFocusedControlBufferIndex = 0; mFocusedControlTextBufferIndex = 0; int ii=0; while(ii<GetNumberOfControlsInPanel()) { CPUTControl *pControl = mControlPanelIDList[mActiveControlPanelSlotID]->mControlList[ii]; // don't draw the focus control - draw it last so it stays on 'top' if(mpFocusControl != pControl) { switch(pControl->GetType()) { case CPUT_BUTTON: ((CPUTButton*)pControl)->DrawIntoBuffer(mpMirrorBuffer, &mUberBufferIndex, mUberBufferMax, mpTextMirrorBuffer, &mTextUberBufferIndex, CPUT_GUI_BUFFER_STRING_SIZE); break; case CPUT_CHECKBOX: ((CPUTCheckbox*)pControl)->DrawIntoBuffer(mpMirrorBuffer, &mUberBufferIndex, mUberBufferMax, mpTextMirrorBuffer, &mTextUberBufferIndex, CPUT_GUI_BUFFER_STRING_SIZE); break; case CPUT_SLIDER: ((CPUTSlider*)pControl)->DrawIntoBuffer(mpMirrorBuffer, &mUberBufferIndex, mUberBufferMax, mpTextMirrorBuffer, &mTextUberBufferIndex, CPUT_GUI_BUFFER_STRING_SIZE); break; case CPUT_DROPDOWN: ((CPUTDropdown*)pControl)->DrawIntoBuffer(mpMirrorBuffer, &mUberBufferIndex, mUberBufferMax, mpTextMirrorBuffer, &mTextUberBufferIndex, CPUT_GUI_BUFFER_STRING_SIZE); break; case CPUT_STATIC: ((CPUTText*)pControl)->DrawIntoBuffer(mpTextMirrorBuffer, &mTextUberBufferIndex, CPUT_GUI_BUFFER_STRING_SIZE); break; } } ii++; HEAPCHECK } // do the 'focused' control last so it stays on top (i.e. dropdowns) if(mpFocusControl) { switch(mpFocusControl->GetType()) { case CPUT_BUTTON: ((CPUTButton*)mpFocusControl)->DrawIntoBuffer(mpFocusedControlMirrorBuffer, &mFocusedControlBufferIndex, mUberBufferMax, mpFocusedControlTextMirrorBuffer, &mFocusedControlTextBufferIndex, CPUT_GUI_BUFFER_STRING_SIZE); break; case CPUT_CHECKBOX: ((CPUTCheckbox*)mpFocusControl)->DrawIntoBuffer(mpFocusedControlMirrorBuffer, &mFocusedControlBufferIndex, mUberBufferMax, mpFocusedControlTextMirrorBuffer, &mFocusedControlTextBufferIndex, CPUT_GUI_BUFFER_STRING_SIZE); break; case CPUT_SLIDER: ((CPUTSlider*)mpFocusControl)->DrawIntoBuffer(mpFocusedControlMirrorBuffer, &mFocusedControlBufferIndex, mUberBufferMax, mpFocusedControlTextMirrorBuffer, &mFocusedControlTextBufferIndex, CPUT_GUI_BUFFER_STRING_SIZE); break; case CPUT_DROPDOWN: ((CPUTDropdown*)mpFocusControl)->DrawIntoBuffer(mpFocusedControlMirrorBuffer, &mFocusedControlBufferIndex, mUberBufferMax, mpFocusedControlTextMirrorBuffer, &mFocusedControlTextBufferIndex, CPUT_GUI_BUFFER_STRING_SIZE); break; case CPUT_STATIC: ((CPUTText*)mpFocusControl)->DrawIntoBuffer(mpFocusedControlMirrorBuffer, &mFocusedControlTextBufferIndex, CPUT_GUI_BUFFER_STRING_SIZE); break; } } // update the uber-buffers with the control graphics UpdateUberBuffers(); // Clear dirty flag on uberbuffer mUberBufferDirty = false; } HEAPCHECK if( mpConstantBufferVS ) { // set up orthographic display int windowWidth, windowHeight; float znear = 0.1f; float zfar = 100.0f; float4x4 m; pWindow->GetClientDimensions( &windowWidth, &windowHeight ); m = float4x4OrthographicOffCenterLH(0, (float)windowWidth, (float)windowHeight, 0, znear, zfar); GUIConstantBufferVS ConstantBufferMatrices; ConstantBufferMatrices.Projection = m; m = float4x4Identity(); ConstantBufferMatrices.Model = m; GL_CHECK(glBindBuffer(GL_UNIFORM_BUFFER, mpConstantBufferVS->GetBufferID())); GL_CHECK(glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(GUIConstantBufferVS), &ConstantBufferMatrices)); GL_CHECK(glBindBuffer(GL_UNIFORM_BUFFER, 0)); } CPUTRenderParameters params; mpControlMaterial->GetMaterialEffects()[0]->SetRenderStates(params); glDisable(GL_CULL_FACE); glDisable(GL_DEPTH_TEST); // draw the control graphics CPUTRenderParameters p; mpUberBuffer->Draw(p, NULL); mpTextMaterial->GetMaterialEffects()[0]->SetRenderStates(params); // draw text things here // draw the FPS counter mpTextUberBuffer->Draw(p, NULL); mpControlMaterial->GetMaterialEffects()[0]->SetRenderStates(params); mpFocusedControlBuffer->Draw(p, NULL); // draw focused control mpTextMaterial->GetMaterialEffects()[0]->SetRenderStates(params); mpFocusedControlTextBuffer->Draw(p, NULL); glEnable(GL_CULL_FACE); glDisable(GL_DEPTH_TEST); GL_CHECK(glBindBuffer(GL_UNIFORM_BUFFER, 0)); HEAPCHECK; }