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();
}
Ejemplo n.º 2
0
	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 ()));
	}
Ejemplo n.º 3
0
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();
	}
}
Ejemplo n.º 4
0
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() );
        }
    }
}