Пример #1
0
	void BMaxObject::UpdateGeometry()
	{
		SetGeometryDirty(false);
		if (m_pAnimatedMesh && m_pAnimatedMesh->IsLoaded())
		{
			Vector3 vMin, vMax;
			if (m_pAnimatedMesh->GetBoundingBox(&vMin, &vMax))
			{
				Matrix4 mat;
				GetLocalTransform(&mat);
				CShapeOBB obb(CShapeBox(vMin, vMax), mat);
				CShapeBox minmaxBox;
				minmaxBox.Extend(obb);
				if (GetScaling()!= 1.0){
					minmaxBox.SetMinMax(minmaxBox.GetMin() * GetScaling(), minmaxBox.GetMax() * GetScaling());
				}
				SetAABB(&minmaxBox.GetMin(), &minmaxBox.GetMax());
			}

			UnloadPhysics();
			if (m_dwPhysicsMethod == 0)
				m_dwPhysicsMethod = PHYSICS_LAZY_LOAD;
			else if (IsPhysicsEnabled() && ((m_dwPhysicsMethod&PHYSICS_ALWAYS_LOAD)>0))
			{
				LoadPhysics();
			}
		}
	}
Пример #2
0
void SAmmoParams::Init(const XmlNodeRef& ammoParamsNode, const IEntityClass* pEntityClass_)
{
	pEntityClass = pEntityClass_;
	fpGeometryName = "";

	if (!ammoParamsNode || !pEntityClass)
	{
		CRY_ASSERT(0);
		return;
	}

	LoadFlagsAndParams(ammoParamsNode);
	LoadPhysics(ammoParamsNode);
	LoadGeometry(ammoParamsNode);
	LoadCollision(ammoParamsNode);
	LoadExplosion(ammoParamsNode);
	LoadFlashbang(ammoParamsNode);
	LoadTrailsAndWhizzes(ammoParamsNode);
	LoadLTagGrenadeParams(ammoParamsNode);
	LoadHomingSwarmParams(ammoParamsNode);
	LoadMikeBulletParams(ammoParamsNode);
	LoadGrenadeParams(ammoParamsNode);
	LoadHomingMissileParams(ammoParamsNode);
	LoadKVoltParams(ammoParamsNode);
	LoadBulletTimeParams(ammoParamsNode);
	LoadLightningBoltParams(ammoParamsNode);
	LoadC4ExplosiveParams(ammoParamsNode);
	LoadHazardParams(ammoParamsNode);
	LoadElectriProjectileParams(ammoParamsNode);
}
Пример #3
0
	void BMaxObject::EnablePhysics(bool bEnable)
	{
		if (!bEnable){
			UnloadPhysics();
			m_dwPhysicsMethod |= PHYSICS_FORCE_NO_PHYSICS;
		}
		else
		{
			m_dwPhysicsMethod &= (~PHYSICS_FORCE_NO_PHYSICS);
			if ((m_dwPhysicsMethod&PHYSICS_ALWAYS_LOAD)>0)
				LoadPhysics();
		}
	}
void SAmmoParams::Init(const IItemParamsNode *pItemParams_, const IEntityClass *pEntityClass_)
{
	pItemParams = pItemParams_;
	pEntityClass = pEntityClass_;
	fpGeometryName = "";

	if (!pItemParams || !pEntityClass)
	{
		assert(0);
		return;
	}

	pItemParams->AddRef();
	LoadFlagsAndParams();
	LoadPhysics();
	LoadGeometry();
	LoadScaledEffect();
	LoadCollision();
	LoadExplosion();
	LoadFlashbang();
	LoadTrailsAndWhizzes();
}
Пример #5
0
bool StudioModel::LoadModel( const char *pModelName )
{
	MDLCACHE_CRITICAL_SECTION_( g_pMDLCache );

	if (!pModelName)
		return 0;

	// In the case of restore, m_pModelName == modelname
	if (m_pModelName != pModelName)
	{
		// Copy over the model name; we'll need it later...
		if (m_pModelName)
		{
			delete[] m_pModelName;
		}
		m_pModelName = new char[Q_strlen(pModelName) + 1];
		strcpy( m_pModelName, pModelName );
	}

	m_MDLHandle = g_pMDLCache->FindMDL( pModelName );

	// allocate a pool for a studiohdr cache
	if (m_pStudioHdr != NULL)
	{
		delete m_pStudioHdr;
	}
	m_pStudioHdr = new CStudioHdr( g_pMDLCache->GetStudioHdr( m_MDLHandle ), g_pMDLCache );

	// manadatory to access correct verts
	SetCurrentModel();

	m_pPhysics = LoadPhysics( m_MDLHandle );

	// Copy over all of the hitboxes; we may add and remove elements
	m_HitboxSets.RemoveAll();

	CStudioHdr *pStudioHdr = GetStudioHdr();

	int i;
	for ( int s = 0; s < pStudioHdr->numhitboxsets(); s++ )
	{
		mstudiohitboxset_t *set = pStudioHdr->pHitboxSet( s );
		if ( !set )
			continue;

		m_HitboxSets.AddToTail();

		for ( i = 0; i < set->numhitboxes; ++i )
		{
			mstudiobbox_t *pHit = set->pHitbox(i);
			int nIndex = m_HitboxSets[ s ].AddToTail( );
			m_HitboxSets[s][nIndex] = *pHit;
		}

		// Set the name
		hbsetname_s *n = &m_HitboxSetNames[ m_HitboxSetNames.AddToTail() ];
		strcpy( n->name, set->pszName() );
	}

	// Copy over all of the surface props; we may change them...
	for ( i = 0; i < pStudioHdr->numbones(); ++i )
	{
		mstudiobone_t* pBone = pStudioHdr->pBone(i);

		CUtlSymbol prop( pBone->pszSurfaceProp() );
		m_SurfaceProps.AddToTail( prop );
	}

	m_physPreviewBone = -1;

	bool forceOpaque = (pStudioHdr->flags() & STUDIOHDR_FLAGS_FORCE_OPAQUE) != 0;
	bool vertexLit = false;
	m_bIsTransparent = false;
	m_bHasProxy = false;

	studiohwdata_t *pHardwareData = g_pMDLCache->GetHardwareData( m_MDLHandle );
	if ( !pHardwareData )
	{
		Assert( 0 );
		return false;
	}

	for( int lodID = pHardwareData->m_RootLOD; lodID < pHardwareData->m_NumLODs; lodID++ )
	{
		studioloddata_t *pLODData = &pHardwareData->m_pLODs[lodID];
		for ( i = 0; i < pLODData->numMaterials; ++i )
		{
			if (pLODData->ppMaterials[i]->IsVertexLit())
			{
				vertexLit = true;
			}
			if ((!forceOpaque) && pLODData->ppMaterials[i]->IsTranslucent())
			{
				m_bIsTransparent = true;
				//Msg("Translucent material %s for model %s\n", pLODData->ppMaterials[i]->GetName(), pStudioHdr->name );
			}
			if (pLODData->ppMaterials[i]->HasProxy())
			{
				m_bHasProxy = true;
			}
		}
	}

	return true;
}