void TCompCharacterController::onCreate(const TMsgEntityCreated &) { m_pActor = g_PhysxManager->CreateCharacterController(m_radius, m_height); m_affectGravity = true; m_gravitySpeed = -10.0f; m_maxSpeed = 7.0f; CEntity *e = CHandle(this).getOwner(); if (e) { //update position from CC to match the render transform TCompName *nameComp = e->get<TCompName>(); if (nameComp) name = std::string(nameComp->name); TCompTransform *mtx = e->get<TCompTransform>(); PxExtendedVec3 p = Vec3ToPxExVec3(mtx->getPosition()); p.y += m_height + m_radius; //add height value from capsule, center from collider at center of the shape m_pActor->setPosition(p); //save parent handle m_pActor->getActor()->userData = (void*)CHandle(this).getOwner().asUnsigned(); //default flags for character controllers m_filter = DEFAULT_DATA_CC; UpdateTags(); } InitAABB(); }
void GraffitiTab::SetupEdits () { new Util::ClearLineEditAddon (CoreProxy_, Ui_.Album_); new Util::ClearLineEditAddon (CoreProxy_, Ui_.Artist_); new Util::ClearLineEditAddon (CoreProxy_, Ui_.Title_); auto genreMgr = new Util::LineEditButtonManager (Ui_.Genre_); Ui_.Genre_->SetSeparator (" / "); auto model = new Util::TagsCompletionModel (this); model->UpdateTags (Genres); auto completer = new Util::TagsCompleter (Ui_.Genre_); completer->OverrideModel (model); Ui_.Genre_->AddSelector (genreMgr); new Util::ClearLineEditAddon (CoreProxy_, Ui_.Genre_, genreMgr); connect (Ui_.ArtistSetAll_, SIGNAL (released ()), this, SLOT (on_Artist__textChanged ())); connect (Ui_.AlbumSetAll_, SIGNAL (released ()), this, SLOT (on_Album__textChanged ())); connect (Ui_.TitleSetAll_, SIGNAL (released ()), this, SLOT (on_Title__textChanged ())); connect (Ui_.GenreSetAll_, SIGNAL (released ()), this, SLOT (on_Genre__textChanged ())); connect (Ui_.YearSetAll_, SIGNAL (released ()), this, SLOT (on_Year__valueChanged ())); }
void CPersistantDebug::Update( float frameTime ) { if (m_objects.empty()) return; IRenderAuxGeom * pAux = gEnv->pRenderer->GetIRenderAuxGeom(); static const int flags3D = e_Mode3D | e_AlphaBlended | e_DrawInFrontOff | e_FillModeSolid | e_CullModeBack | e_DepthWriteOn | e_DepthTestOn; static const int flags2D = e_Mode2D | e_AlphaBlended; std::vector<ListObj::iterator> toClear; std::vector<MapListObj::iterator> toClearMap; for (MapListObj::iterator iterMap = m_objects.begin(); iterMap != m_objects.end(); ++iterMap) { toClear.resize(0); for (ListObj::iterator iterList = iterMap->second.begin(); iterList != iterMap->second.end(); ++iterList) { iterList->timeRemaining -= frameTime; if (iterList->timeRemaining <= 0.0f && !(iterList->obj == eOT_EntityTag && iterList->columns.size() > 1)) toClear.push_back(iterList); else { ColorF clr = iterList->clr; clr.a *= iterList->timeRemaining / iterList->totalTime; switch (iterList->obj) { case eOT_Sphere: pAux->SetRenderFlags( flags3D ); pAux->DrawSphere( iterList->pos, iterList->radius, clr ); break; case eOT_Quat: pAux->SetRenderFlags( flags3D ); { float r = iterList->radius; Vec3 x = r * iterList->q.GetColumn0(); Vec3 y = r * iterList->q.GetColumn1(); Vec3 z = r * iterList->q.GetColumn2(); Vec3 p = iterList->pos; OBB obb = OBB::CreateOBB( Matrix33::CreateIdentity(), Vec3(0.05f,0.05f,0.05f), ZERO ); pAux->DrawOBB( obb, p, false, clr, eBBD_Extremes_Color_Encoded ); pAux->DrawLine( p, ColorF(1,0,0,clr.a), p+x, ColorF(1,0,0,clr.a) ); pAux->DrawLine( p, ColorF(0,1,0,clr.a), p+y, ColorF(0,1,0,clr.a) ); pAux->DrawLine( p, ColorF(0,0,1,clr.a), p+z, ColorF(0,0,1,clr.a) ); } break; case eOT_Arrow: pAux->SetRenderFlags( flags3D ); pAux->DrawLine( iterList->pos - iterList->dir * iterList->radius, clr, iterList->pos + iterList->dir * iterList->radius, clr ); pAux->DrawCone( iterList->pos + iterList->dir * iterList->radius, iterList->dir, 0.1f * iterList->radius, 0.3f * iterList->radius, clr ); break; case eOT_Line: pAux->SetRenderFlags( flags3D ); pAux->DrawLine( iterList->pos, clr, iterList->pos + iterList->dir, clr ); break; case eOT_Cone: pAux->SetRenderFlags( flags3D ); pAux->DrawCone( iterList->pos, iterList->dir, iterList->radius, iterList->radius2, clr ); break; case eOT_Cylinder: pAux->SetRenderFlags( flags3D ); pAux->DrawCylinder( iterList->pos, iterList->dir, iterList->radius, iterList->radius2, clr ); break; case eOT_AABB: pAux->SetRenderFlags( flags3D ); pAux->DrawAABB( AABB(iterList->pos,iterList->dir), Matrix34(IDENTITY), false, clr, eBBD_Faceted ); break; case eOT_Line2D: pAux->SetRenderFlags( flags2D ); pAux->DrawLine( iterList->pos, clr, iterList->dir, clr ); break; case eOT_Text: { float clrAry[4] = {clr.r, clr.g, clr.b, clr.a}; gEnv->pRenderer->Draw2dLabel( iterList->pos.x, iterList->pos.y, iterList->radius, clrAry, false, "%s", iterList->text.c_str() ); } break; case eOT_Disc: { pAux->SetRenderFlags( flags3D ); vtx_idx indTriQuad[ 6 ] = { 0, 2, 1, 0, 3, 2 }; vtx_idx indTriTri[ 3 ] = { 0, 1, 2 }; int steps = (int)(10 * iterList->radius2); steps = std::max(steps, 10); float angStep = gf_PI2 / steps; for (int i=0; i<steps; i++) { float a0 = angStep*i; float a1 = angStep*(i+1); float c0 = cosf( a0 ); float c1 = cosf( a1 ); float s0 = sinf( a0 ); float s1 = sinf( a1 ); Vec3 pts[4]; int n, n2; vtx_idx * indTri; if (iterList->radius) { n = 4; n2 = 6; pts[0] = iterList->pos + iterList->radius * Vec3( c0, s0, 0 ); pts[1] = iterList->pos + iterList->radius * Vec3( c1, s1, 0 ); pts[2] = iterList->pos + iterList->radius2 * Vec3( c1, s1, 0 ); pts[3] = iterList->pos + iterList->radius2 * Vec3( c0, s0, 0 ); indTri = indTriQuad; } else { n = 3; n2 = 3; pts[0] = iterList->pos; pts[1] = pts[0] + iterList->radius2 * Vec3( c0, s0, 0 ); pts[2] = pts[0] + iterList->radius2 * Vec3( c1, s1, 0 ); indTri = indTriTri; } pAux->DrawTriangles( pts, n, indTri, n2, clr ); } } break; case eOT_EntityTag: { UpdateTags(frameTime, *iterList); } break; } } } while (!toClear.empty()) { iterMap->second.erase(toClear.back()); toClear.pop_back(); } if (iterMap->second.empty()) toClearMap.push_back(iterMap); } while (!toClearMap.empty()) { m_objects.erase(toClearMap.back()); toClearMap.pop_back(); } }
void CPersistantDebug::UpdateTags(float frameTime, SObj& obj, bool doFirstPass) { if (!doFirstPass) { // Every update calls itself recursively first to calculate the widths of each column // for multicolumn mode. Not the prettiest thing, but it's the best idea I've got so far! UpdateTags(frameTime, obj, true); frameTime = 0.f; for (int i=0; i<obj.columns.size(); ++i) obj.columns[i].height = 0.f; } IFFont *pFont = gEnv->pCryFont->GetFont("default"); assert(pFont); STextDrawContext ctx; ctx.SetSizeIn800x600(false); ctx.SetProportional(true); for (TListTag::iterator iterList = obj.tags.begin(); iterList != obj.tags.end(); ++iterList) { if (iterList->vScreenPos.IsZero()) continue; float tagMaxDist = iterList->params.viewDistance; float fontSize = iterList->params.size * m_pETFontSizeMultiplier->GetFVal(); // Calculate size of text on screen (so we can place it properly) ctx.SetSize(Vec2(12*fontSize, 12*fontSize)); Vec2 textBoxSize = pFont->GetTextSize(iterList->params.text.c_str(), true, ctx); if (doFirstPass) { int pos(iterList->params.column - 1); obj.columns[pos].width = max(obj.columns[pos].width, textBoxSize.x + 15.f); } else { // Determine position SColumn &column = obj.columns[iterList->params.column - 1]; Vec3 screenPos(iterList->vScreenPos); screenPos.x = screenPos.x*0.01f*gEnv->pRenderer->GetWidth(); screenPos.y = screenPos.y*0.01f*gEnv->pRenderer->GetHeight() - textBoxSize.y - column.height; column.height += textBoxSize.y; // Adjust X value for multi-columns if (obj.columns.size() > 1) { int centerLine = obj.columns.size() / 2; if (iterList->params.column <= centerLine) for (int i=iterList->params.column-1; i<centerLine; ++i) screenPos.x -= obj.columns[i].width; else for (int i=centerLine; i<iterList->params.column-1; ++i) screenPos.x += obj.columns[i].width; if (obj.columns.size() % 2 != 0) screenPos.x -= textBoxSize.x*0.5f; } else { screenPos.x -= textBoxSize.x*0.5f; } // Determine color ColorF clr = iterList->params.color; if (1==m_pETColorOverrideEnable->GetIVal()) { clr.r = max(0.f, min(1.f, m_pETColorOverrideR->GetFVal())); clr.g = max(0.f, min(1.f, m_pETColorOverrideG->GetFVal())); clr.b = max(0.f, min(1.f, m_pETColorOverrideB->GetFVal())); } clr.a *= iterList->params.fadeTime / iterList->totalFadeTime; // Apply fade out time to alpha float clrAry[4] = {clr.r, clr.g, clr.b, clr.a}; gEnv->pRenderer->Draw2dLabel( screenPos.x, screenPos.y, fontSize, clrAry, true, "%s", iterList->params.text.c_str() ); } } }