void DiCircleEmitter::InitParticlePosition(DiParticle* particle) { float angle = 0; if (mRandom) { angle = DiMath::RangeRandom(0, DiMath::TWO_PI); } else { mCircleAngle += mStep; mCircleAngle = mCircleAngle > DiMath::TWO_PI ? mCircleAngle - DiMath::TWO_PI : mCircleAngle; angle = mCircleAngle; } mX = DiMath::Cos(angle); mZ = DiMath::Sin(angle); DiParticleSystem* sys = mParentElement->GetParentSystem(); if (sys) { particle->position = GetDerivedPosition() + sys->GetDerivedOrientation() * mOrientation * (mEmitterScale * DiVec3(mX * mRadius, 0, mZ * mRadius)); } else { particle->position = GetDerivedPosition() + mEmitterScale * ( mOrientation * DiVec3(mX * mRadius, 0, mZ * mRadius) ); } particle->originalPosition = particle->position; }
void DiBone::GetOffsetTransform( DiMat4& m ) const { DiVec3 locScale = GetDerivedScale() * mBindDerivedInverseScale; DiQuat locRotate = GetDerivedOrientation() * mBindDerivedInverseOrientation; DiVec3 locTranslate = GetDerivedPosition() + locRotate * (locScale * mBindDerivedInversePosition); m.makeTransform(locTranslate, locScale, locRotate); }
void DiBone::SetBindingPose() { SetInitialState(); mBindDerivedInversePosition = -GetDerivedPosition(); mBindDerivedInverseScale = DiVec3::UNIT_SCALE / GetDerivedScale(); mBindDerivedInverseOrientation = GetDerivedOrientation().Inverse(); }
void DiBone::GetOffsetTransform(btTransform& t) const { DiVec3 locScale = GetDerivedScale() * mBindDerivedInverseScale; DiQuat locRotate = GetDerivedOrientation() * mBindDerivedInverseOrientation; DiVec3 locTranslate = GetDerivedPosition() + locRotate * (locScale * mBindDerivedInversePosition); t.setOrigin(btVector3(locTranslate.x,locTranslate.y,locTranslate.z)); btQuaternion qt; qt.setValue(locRotate.x,locRotate.y,locRotate.z,locRotate.w); t.setRotation(qt); t.setBasis(t.getBasis().scaled(btVector3(locScale.x, locScale.y, locScale.z))); }
bool DiInstancedModel::FindVisible( DiCamera *camera ) const { bool retVal = GetVisible(); float r = DiMath::BoundingRadiusFromAABB(GetBoundingBox()); if( retVal && camera ) { retVal = camera->IsVisible(DiSphere(GetDerivedPosition(),r)); } return retVal; }
void DiGravityController::PreProcessParticles(DiParticleElement* particleTechnique, float timeElapsed) { GetDerivedPosition(); }