本文整理汇总了C++中MatrixF::mul方法的典型用法代码示例。如果您正苦于以下问题:C++ MatrixF::mul方法的具体用法?C++ MatrixF::mul怎么用?C++ MatrixF::mul使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类MatrixF
的用法示例。
在下文中一共展示了MatrixF::mul方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: updateEmitter
void FlyingVehicle::updateEmitter(bool active,F32 dt,ParticleEmitterData *emitter,S32 idx,S32 count)
{
if (!emitter)
return;
for (S32 j = idx; j < idx + count; j++)
if (active) {
if (mDataBlock->jetNode[j] != -1) {
if (!bool(mJetEmitter[j])) {
mJetEmitter[j] = new ParticleEmitter;
mJetEmitter[j]->onNewDataBlock(emitter,false);
mJetEmitter[j]->registerObject();
}
MatrixF mat;
Point3F pos,axis;
mat.mul(getRenderTransform(),
mShapeInstance->mNodeTransforms[mDataBlock->jetNode[j]]);
mat.getColumn(1,&axis);
mat.getColumn(3,&pos);
mJetEmitter[j]->emitParticles(pos,true,axis,getVelocity(),(U32)(dt * 1000));
}
}
else {
for (S32 j = idx; j < idx + count; j++)
if (bool(mJetEmitter[j])) {
mJetEmitter[j]->deleteWhenEmpty();
mJetEmitter[j] = 0;
}
}
}
示例2: gluProject
GLint gluProject( GLdouble objx, GLdouble objy, GLdouble objz, const F64 *model, const F64 * proj, const GLint * vp, F64 * winx, F64 * winy, F64 * winz )
{
Vector4F v = Vector4F( objx, objy, objz, 1.0f );
MatrixF pmat = MatrixF( false );
for (int i=0; i<16; i++) { ((F32*)pmat)[i] = (float)proj[i]; }
MatrixF mmat = MatrixF( false );
for (int i=0; i<16; i++) { ((F32*)mmat)[i] = (float)model[i]; }
//Luma: Projection fix
mmat.transpose();
pmat.transpose();
(pmat.mul(mmat)).mul(v);
//Luma: Projection fix
if(v.w == 0.0f)
{
return GL_FALSE;
}
F32 invW = 1.0f / v.w;
v.x *= invW;
v.y *= invW;
v.z *= invW;
*winx = (GLfloat)vp[0] + (GLfloat)vp[2] * (v.x + 1.0f) * 0.5f;
*winy = (GLfloat)vp[1] + (GLfloat)vp[3] * (v.y + 1.0f) * 0.5f;
*winz = (v.z + 1.0f) * 0.5f;
int glError;
glError = TEST_FOR_OPENGL_ERRORS
return GL_TRUE;
}
示例3: setDirtyObjectBox
void T3DSceneComponent::_ComputeObjectBox()
{
_objectBox->set(Box3F(10E30f, 10E30f, 10E30f, -10E30f, -10E30f, -10E30f));
bool gotone = false;
for (T3DSceneClient * walk = _sceneClientList; walk != NULL; walk = walk->getNextSceneClient())
{
ISolid3D * solid = dynamic_cast<ISolid3D*>(walk);
if (solid == NULL)
continue;
Box3F box = solid->getObjectBox();
if (solid->getTransform3D() != NULL)
{
MatrixF mat;
solid->getTransform3D()->getObjectMatrix(mat, true);
mat.mul(box);
}
box.extend(_objectBox->get().min);
box.extend(_objectBox->get().max);
_objectBox->set(box);
gotone = true;
}
if (!gotone)
_objectBox->set(Box3F());
setDirtyObjectBox(false);
setDirtyWorldBox(true);
}
示例4: getRenderWeaponMountTransform
void TurretShape::getRenderWeaponMountTransform( F32 delta, S32 mountPoint, const MatrixF &xfm, MatrixF *outMat )
{
// Returns mount point to world space transform
if ( mountPoint >= 0 && mountPoint < SceneObject::NumMountPoints) {
S32 ni = mDataBlock->weaponMountNode[mountPoint];
if (ni != -1) {
MatrixF mountTransform = mShapeInstance->mNodeTransforms[ni];
mountTransform.mul( xfm );
const Point3F& scale = getScale();
// The position of the mount point needs to be scaled.
Point3F position = mountTransform.getPosition();
position.convolve( scale );
mountTransform.setPosition( position );
// Also we would like the object to be scaled to the model.
mountTransform.scale( scale );
outMat->mul(getRenderTransform(), mountTransform);
return;
}
}
// Then let SceneObject handle it.
GrandParent::getRenderMountTransform( delta, mountPoint, xfm, outMat );
}
示例5: _calcClipSpaceAABB
Box3F PSSMLightShadowMap::_calcClipSpaceAABB(const Frustum& f, const MatrixF& transform, F32 farDist)
{
// Calculate frustum center
Point3F center(0,0,0);
for (U32 i = 0; i < 8; i++)
{
const Point3F& pt = f.getPoints()[i];
center += pt;
}
center /= 8;
// Calculate frustum bounding sphere radius
F32 radius = 0.0f;
for (U32 i = 0; i < 8; i++)
radius = getMax(radius, (f.getPoints()[i] - center).lenSquared());
radius = mFloor( mSqrt(radius) );
// Now build box for sphere
Box3F result;
Point3F radiusBox(radius, radius, radius);
result.minExtents = center - radiusBox;
result.maxExtents = center + radiusBox;
// Transform to light projection space
transform.mul(result);
return result;
}
示例6: _setScanBox
void AITurretShape::_setScanBox()
{
mTransformedScanBox = mScanBox;
MatrixF mat;
getScanTransform(mat);
mat.mul(mTransformedScanBox);
}
示例7: _roundProjection
// This "rounds" the projection matrix to remove subtexel movement during shadow map
// rasterization. This is here to reduce shadow shimmering.
void PSSMLightShadowMap::_roundProjection(const MatrixF& lightMat, const MatrixF& cropMatrix, Point3F &offset, U32 splitNum)
{
// Round to the nearest shadowmap texel, this helps reduce shimmering
MatrixF currentProj = GFX->getProjectionMatrix();
currentProj = cropMatrix * currentProj * lightMat;
// Project origin to screen.
Point4F originShadow4F(0,0,0,1);
currentProj.mul(originShadow4F);
Point2F originShadow(originShadow4F.x / originShadow4F.w, originShadow4F.y / originShadow4F.w);
// Convert to texture space (0..shadowMapSize)
F32 t = mNumSplits < 4 ? mShadowMapTex->getWidth() / mNumSplits : mShadowMapTex->getWidth() / 2;
Point2F texelsToTexture(t / 2.0f, mShadowMapTex->getHeight() / 2.0f);
if (mNumSplits >= 4) texelsToTexture.y *= 0.5f;
originShadow.convolve(texelsToTexture);
// Clamp to texel boundary
Point2F originRounded;
originRounded.x = mFloor(originShadow.x + 0.5f);
originRounded.y = mFloor(originShadow.y + 0.5f);
// Subtract origin to get an offset to recenter everything on texel boundaries
originRounded -= originShadow;
// Convert back to texels (0..1) and offset
originRounded.convolveInverse(texelsToTexture);
offset.x += originRounded.x;
offset.y += originRounded.y;
}
示例8: AssertFatal
void T3DSceneComponent::AddSceneClient(T3DSceneClient * sceneClient)
{
AssertFatal(sceneClient,"Cannot add a NULL scene client");
// add to the front of the list
sceneClient->setNextSceneClient(_sceneClientList);
_sceneClientList = sceneClient;
// extend object box
ISolid3D * solid = dynamic_cast<ISolid3D*>(sceneClient);
if (solid != NULL)
{
if (isObjectBoxLocked())
setDirtyObjectBox(true);
else
{
Box3F box = solid->getObjectBox();
if (solid->getTransform3D() != NULL)
{
MatrixF mat;
solid->getTransform3D()->getObjectMatrix(mat, true);
mat.mul(box);
}
box.extend(_objectBox->get().min);
box.extend(_objectBox->get().max);
_objectBox->set(box);
}
// policy is that we become parent transform
if (solid->getTransform3D() != NULL && solid->getTransform3D()->isChildOf(_transform, true))
solid->getTransform3D()->setParentTransform(_transform);
}
}
示例9: getRenderImageTransform
void TurretShape::getRenderImageTransform(U32 imageSlot,S32 node,MatrixF* mat)
{
// Same as ShapeBase::getRenderImageTransform() other than getRenderWeaponMountTransform() below
// Image transform in world space
MountedImage& image = mMountedImageList[imageSlot];
if (image.dataBlock)
{
if (node != -1)
{
ShapeBaseImageData& data = *image.dataBlock;
U32 shapeIndex = getImageShapeIndex(image);
MatrixF nmat = image.shapeInstance[shapeIndex]->mNodeTransforms[node];
MatrixF mmat;
if ( data.useEyeNode && isFirstPerson() && data.eyeMountNode[shapeIndex] != -1 )
{
MatrixF emat;
getRenderEyeBaseTransform(&emat, mDataBlock->mountedImagesBank);
MatrixF mountTransform = image.shapeInstance[shapeIndex]->mNodeTransforms[data.eyeMountNode[shapeIndex]];
mountTransform.affineInverse();
mmat.mul(emat, mountTransform);
}
else if ( data.useEyeOffset && isFirstPerson() )
{
MatrixF emat;
getRenderEyeTransform(&emat);
mmat.mul(emat,data.eyeOffset);
}
else
{
MatrixF emat;
getRenderWeaponMountTransform( 0.0f, imageSlot, MatrixF::Identity, &emat );
mmat.mul(emat,data.mountTransform[shapeIndex]);
}
mat->mul(mmat, nmat);
}
else
getRenderImageTransform(imageSlot,mat);
}
else
*mat = getRenderTransform();
}
示例10: getBoundingBox
Box3F ForestConvex::getBoundingBox(const MatrixF& mat, const Point3F& scale) const
{
Box3F newBox = box;
newBox.minExtents.convolve(scale);
newBox.maxExtents.convolve(scale);
mat.mul(newBox);
return newBox;
}
示例11: getBoundingBox
Box3F Convex::getBoundingBox(const MatrixF& mat, const Point3F& scale) const
{
Box3F wBox;//TOFIX = mObject->getObjBox();
wBox.minExtents.convolve(scale);
wBox.maxExtents.convolve(scale);
mat.mul(wBox);
return wBox;
}
示例12: gluUnProject
GLint gluUnProject( GLdouble winx, GLdouble winy, GLdouble winz, const F64 *model, const F64 * proj, const GLint * vp, F64 * x, F64 * y, F64 * z )
{
Vector4F v = Vector4F( 2.0f*(winx-vp[0])/vp[2] - 1.0f, 2.0f*(winy-vp[1])/vp[2] - 1.0f, 2.0f*vp[2] - 1.0f, 1.0f );
MatrixF pmat = MatrixF( false );
for (int i=0; i<16; i++) { ((F32*)pmat)[i] = (float)proj[i]; }
MatrixF mmat = MatrixF( false );
for (int i=0; i<16; i++) { ((F32*)mmat)[i] = (float)model[i]; }
mmat = pmat.mul(mmat);
mmat = mmat.inverse();
mmat.mul( v );
*x = v.x;
*y = v.y;
*z = v.z;
int glError;
glError = TEST_FOR_OPENGL_ERRORS
return GL_TRUE;
}
示例13: setRenderPosition
void Etherform::setRenderPosition(const Point3F& pos, const Point3F& rot, F32 dt)
{
MatrixF xRot, zRot;
xRot.set(EulerF(rot.x, 0, 0));
zRot.set(EulerF(0, 0, rot.z));
MatrixF temp;
temp.mul(zRot, xRot);
temp.setColumn(3, pos);
Parent::setRenderTransform(temp);
}
示例14: getObjectBox
Box3F T3DSceneComponent::getWorldBox()
{
if (DirtyWorldBox && !LockWorldBox)
_UpdateWorldBox();
MatrixF mat = getTransform3D()->getWorldMatrix();
Box3F box = getObjectBox();
mat.mul(box);
return box;
}
示例15: addPath
void TSShapeInstance::addPath(TSThread *gt, F32 start, F32 end, MatrixF *mat)
{
// never get here while in transition...
AssertFatal(!gt->transitionData.inTransition,"TSShapeInstance::addPath");
if (!mat)
mat = &mGroundTransform;
MatrixF startInvM;
gt->getGround(start,&startInvM);
startInvM.inverse();
MatrixF endM;
gt->getGround(end,&endM);
MatrixF addM;
addM.mul(startInvM,endM);
endM.mul(*mat,addM);
*mat = endM;
}