void CPUTGUIElement::Resize(int x, int y, int width, int height, int windowWidth, int windowHeight) { if(mParentRelative) { mPosX = mRelX + x; mPosY = mRelY + y; if(mRelX < 0) mPosX += width; if(mRelY < 0) mPosY += height; } else { mPosX = mRelX; mPosY = mRelY; if(mRelX < 0) mPosX += windowWidth; if(mRelY < 0) mPosY += windowHeight; } float4x4 m = float4x4Translation((float)mPosX, (float)mPosY, 0); SetParentMatrix(m); CPUTRenderNode* pNode = mpChild; if(pNode) { ((CPUTGUIElement*)pNode)->Resize(mPosX, mPosY, mWidth, mHeight, windowWidth, windowHeight); } pNode = mpSibling; while(pNode) { ((CPUTGUIElement*)pNode)->Resize(x, y, width, height, windowWidth, windowHeight); pNode = pNode->GetSibling(); } }
void DrawBox(CPUTRenderParameters &renderParams, float3 position, float3 size, CPUTColor4 color) { size *= 0.01f; float4x4 parentMatrix = float4x4Scale(size) * float4x4Translation(position); gUtilGlob.boxModel->SetParentMatrix(parentMatrix); gUtilGlob.boxModel->mUserData1 = color.ToFloat4(); gUtilGlob.boxModel->Render(renderParams, 0); }
void MySample::UpdateMatrixBuffers() { // Update GUI int rows = currentRowCount; int columns = currentColCount; int index = 0; float angle_value = 360.0 / columns; float radius = (columns / k2Pi); for (int i = 0; i < rows; ++i) { int add_value = 0; for (int j = 0; j < columns; ++j) { if( (i % 2) == 0 ) { add_value = angle_value + (angle_value / 2.0); } world[index] = float4x4RotationY( kPi / 2.0f) * float4x4Translation(float3(0.0f, 0.0f + (100.0f * i), 100.0f * radius)) * float4x4RotationY( DegreesToRadians(add_value + (angle_value * j))); ++index; } } // Now update buffer const int numInstances = columns * rows; // Support shader CPUTMaterialEffectOGL *pMatEffect = (CPUTMaterialEffectOGL*) supportMaterial->GetMaterialEffects()[0]; DEBUG_PRINT("pMatEffect: %p", pMatEffect); GLuint shaderProgID = pMatEffect->GetShaderID(); DEBUG_PRINT("shaderProgID: %d", shaderProgID); GLuint worldMatrixBufferLoc = glGetUniformLocation( shaderProgID, "instancedWorld" ); DEBUG_PRINT("worldMatrixBufferLoc: %d", worldMatrixBufferLoc); GL_CHECK(glUseProgram(shaderProgID)); GL_CHECK(glUniformMatrix4fv( worldMatrixBufferLoc, numInstances, GL_FALSE, (const GLfloat *) &world[0] )); // Tech unit shader pMatEffect = (CPUTMaterialEffectOGL*) techMaterial->GetMaterialEffects()[0]; assert(pMatEffect); shaderProgID = pMatEffect->GetShaderID(); worldMatrixBufferLoc = glGetUniformLocation( shaderProgID, "instancedWorld" ); GL_CHECK(glUseProgram(shaderProgID)); GL_CHECK(glUniformMatrix4fv( worldMatrixBufferLoc, numInstances, GL_FALSE, (const GLfloat *) &world[0] )); GL_CHECK(glUseProgram(0)); }
void MySample::Update(double deltaSeconds) { static double time = 0.0f; float rows = 0.0f; float columns = 0.0f; float angle_value = 0.0f; // Update cam lookY = cameraY / 4.0f; lookZ = lookY / 3.0f; time += (deltaSeconds); /* DEMO SECTION */ if (time > 360.0f) time = 0.0f; float4 temp = float4(1.0f, 1.0f, 1.0f, 1.0f) * (float4x4RotationY( kPi / 2.0f) * float4x4Translation(float3(0.0f, 0.0f, 50.0f * (9 / k2Pi))) * float4x4RotationY( DegreesToRadians((40.0f * ( 0.5f * time))))); mpCamera->SetPosition( temp.x, cameraY, temp.z ); mpCamera->LookAt( 1.0f, lookY, lookZ ); /* END DEMO SECTION */ mpCameraController->Update((float)deltaSeconds); currentTime = (float)deltaSeconds; fpsTime += (float) deltaSeconds; fpsCount++; fps = fpsCount / fpsTime; if( fpsTime >= 1.0f ) { fpsTime = 0.0f; fpsCount = 0; } // Update GUI rows = (float) currentRowCount; // for slider columns = (float) currentColCount; // for slider angle_value = 360.0 / columns; stringstream textStream; const int numInstances = (int)columns * (int) rows; textStream << "FPS:"<< fps; pTextMethod->SetText(PrepareText(textStream), 0.5f); }
void CPUTGUIElement::Render(CPUTRenderParameters ¶ms, int materialIndex) { if(mVisible) { if(mpSprite) { float4x4 world = float4x4Translation((float)mPosX, (float)mPosY, 0.0); float4x4 projection(*params.mpCamera->GetProjectionMatrix()); mConstants.wvpMatrix = world*projection; mConstants.position.x = (float)mPosX; mConstants.position.y = (float)mPosY; mConstants.position.z = (float)mWidth; mConstants.position.w = (float)mHeight; if(mHighlighted) mConstants.backgroundcolor = mBackgroundHighlightColor; else mConstants.backgroundcolor = mBackgroundColor; mConstants.foregroundcolor = mForegroundColor; mConstants.resolution.x = (float)params.mWidth; mConstants.resolution.y = (float)params.mHeight; mConstants.mousePosition = mMousePosition; #ifdef CPUT_FOR_DX11 ID3D11DeviceContext *pDeviceContext = CPUT_DX11::GetContext(); ID3D11Buffer *pBuffer = mpConstants->GetNativeBuffer(); D3D11_MAPPED_SUBRESOURCE mapInfo; pDeviceContext->Map( pBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapInfo ); GUIConstants *pCb = (GUIConstants*)mapInfo.pData; memcpy(pCb, &mConstants, sizeof(GUIConstants)); pDeviceContext->Unmap(pBuffer, 0); #else mpConstants->SetSubData(0, sizeof(GUIConstants), &mConstants); #endif mpSprite->DrawSprite(params); } if(mpTextMesh) { float4x4 world = float4x4Translation((float)(mTextX+mPosX), (float)(mTextY+mPosY), 0.0); float4x4 projection(*params.mpCamera->GetProjectionMatrix()); mConstants.wvpMatrix = world*projection; mConstants.position.x = (float)mTextX+mPosX; mConstants.position.y = (float)mTextY+mPosY; mConstants.position.z = (float)mWidth; mConstants.position.w = (float)mHeight; mConstants.backgroundcolor = mBackgroundColor; if(mHighlighted) mConstants.foregroundcolor = mForegroundHighlightColor; else mConstants.foregroundcolor = mForegroundColor; mConstants.resolution.x = (float)params.mWidth; mConstants.resolution.y = (float)params.mHeight; #ifdef CPUT_FOR_DX11 ID3D11DeviceContext *pDeviceContext = CPUT_DX11::GetContext(); ID3D11Buffer *pBuffer = mpConstants->GetNativeBuffer(); D3D11_MAPPED_SUBRESOURCE mapInfo; pDeviceContext->Map( pBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapInfo ); GUIConstants *pCb = (GUIConstants*)mapInfo.pData; memcpy(pCb, &mConstants, sizeof(GUIConstants)); pDeviceContext->Unmap(pBuffer, 0); mpTextMaterial->GetMaterialEffects()[mpTextMaterial->GetCurrentEffect()]->SetRenderStates(params); mpTextMesh->Draw(params, mpVertexLayout); #else mpConstants->SetSubData(0, sizeof(GUIConstants), &mConstants); mpTextMaterial->GetMaterialEffects()[mpTextMaterial->GetCurrentEffect()]->SetRenderStates(params); mpTextMesh->Draw(params, NULL); #endif } } }
bool CPUTGUIElement::Load(CPUTConfigBlock* pBlock, int* pParent) { CPUTConfigEntry* pEntry = NULL; pEntry = pBlock->GetValueByName(NAME); if (pEntry->IsValid()) mName= pEntry->ValueAsString(); pEntry = pBlock->GetValueByName(PARENT); if(pEntry->IsValid()) *pParent = pEntry->ValueAsInt(); pEntry = pBlock->GetValueByName(WIDTH); if(pEntry->IsValid()) mWidth = pEntry->ValueAsInt(); pEntry = pBlock->GetValueByName(HEIGHT); if(pEntry->IsValid()) mHeight = pEntry->ValueAsInt(); pEntry = pBlock->GetValueByName(POS_X); if(pEntry->IsValid()) mRelX = pEntry->ValueAsInt(); pEntry = pBlock->GetValueByName(POS_Y); if(pEntry->IsValid()) mRelY = pEntry->ValueAsInt(); pEntry = pBlock->GetValueByName(PARENT_RELATIVE); if(pEntry->IsValid()) mParentRelative = pEntry->ValueAsBool(); pEntry = pBlock->GetValueByName(VISIBLE); if(pEntry->IsValid()) mVisible = pEntry->ValueAsBool(); pEntry = pBlock->GetValueByName(FOREGROUND_COLOR); if(pEntry->IsValid()) { pEntry->ValueAsFloatArray((float*)&mForegroundColor, 4); mForegroundHighlightColor = mForegroundColor; } pEntry = pBlock->GetValueByName(BACKGROUND_COLOR); if(pEntry->IsValid()) { pEntry->ValueAsFloatArray((float*)&mBackgroundColor, 4); mBackgroundHighlightColor = mBackgroundColor; } pEntry = pBlock->GetValueByName(FOREGROUND_HIGHLIGHT_COLOR); if(pEntry->IsValid()) pEntry->ValueAsFloatArray((float*)&mForegroundHighlightColor, 4); pEntry = pBlock->GetValueByName(BACKGROUND_HIGHLIGHT_COLOR); if(pEntry->IsValid()) pEntry->ValueAsFloatArray((float*)&mBackgroundHighlightColor, 4); pEntry = pBlock->GetValueByName(MATERIAL); if(pEntry->IsValid()) { cString materialName = pEntry->ValueAsString(); mpSprite = CPUTSprite::CreateSprite(0.0, 0.0, 1.0, 1.0, materialName); } pEntry = pBlock->GetValueByName(TEXT_MATERIAL); if(pEntry->IsValid()) { cString materialName = pEntry->ValueAsString(); mpTextMaterial = CPUTAssetLibrary::GetAssetLibrary()->GetMaterial(materialName); } const cString FONT = _L("font"); pEntry = pBlock->GetValueByName(FONT); if(pEntry->IsValid()) { cString fontName; pEntry->ValueAsString(&fontName); mpFont = (CPUTFont*)CPUTAssetLibrary::GetAssetLibrary()->GetFontByName(fontName); if(mpFont == NULL) { DEBUG_PRINT(_L("Failed to load font: %s"), fontName.c_str()); } } pEntry = pBlock->GetValueByName(TEXT); cString string; if(pEntry->IsValid()) { pEntry->ValueAsString(&string); SetText(string); } pEntry = pBlock->GetValueByName(HIGHLIGHT); if(pEntry->IsValid()) { mHighlighted = pEntry->ValueAsBool(); } pEntry = pBlock->GetValueByName(MOUSE_CLICK); if(pEntry->IsValid()) { pEntry->ValueAsString(&mClick.key); mEventHandler = true; } pEntry = pBlock->GetValueByName(MOUSE_UP); if(pEntry->IsValid()) { pEntry->ValueAsString(&mUp.key); mEventHandler = true; } pEntry = pBlock->GetValueByName(MOUSE_DOWN); if(pEntry->IsValid()) { pEntry->ValueAsString(&mDown.key); mEventHandler = true; } pEntry = pBlock->GetValueByName(MOUSE_OUT); if(pEntry->IsValid()) { pEntry->ValueAsString(&mOut.key); mEventHandler = true; } pEntry = pBlock->GetValueByName(MOUSE_IN); if(pEntry->IsValid()) { pEntry->ValueAsString(&mIn.key); mEventHandler = true; } pEntry = pBlock->GetValueByName(HOTKEY); if(pEntry->IsValid()) { cString key; pEntry->ValueAsString(&key); mHotkey = MapKey(key); mEventHandler = true; } pEntry = pBlock->GetValueByName(HOTKEY_UP); if(pEntry->IsValid()) { pEntry->ValueAsString(&mKeyUp.key); mEventHandler = true; } pEntry = pBlock->GetValueByName(HOTKEY_DOWN); if(pEntry->IsValid()) { pEntry->ValueAsString(&mKeyDown.key); mEventHandler = true; } mParentMatrix = float4x4Translation((float)mPosX, (float)mPosY, 0.0); return true; }