📄 shapeimage.cc
字号:
//
setImage(imageSlot,imageData,skinNameHandle,loaded);
//see if the image has a light source
if (imageData->lightType != ShapeBaseImageData::NoLight)
Sim::getLightSet()->addObject(this);
return true;
}
bool ShapeBase::unmountImage(U32 imageSlot)
{
bool returnValue = false;
MountedImage& image = mMountedImageList[imageSlot];
if (image.dataBlock)
{
StringHandle temp;
setImage(imageSlot,0, temp);
returnValue = true;
}
//see if we're still part of the light group
bool found = false;
for (S32 i = 0; i < MaxMountedImages; i++)
{
ShapeBaseImageData* imageData = getMountedImage(i);
if (imageData != NULL && imageData->lightType != ShapeBaseImageData::NoLight)
{
found = true;
break;
}
}
if (!found)
Sim::getLightSet()->removeObject(this);
return returnValue;
}
//----------------------------------------------------------------------------
ShapeBaseImageData* ShapeBase::getMountedImage(U32 imageSlot)
{
return mMountedImageList[imageSlot].dataBlock;
}
ShapeBase::MountedImage* ShapeBase::getImageStruct(U32 imageSlot)
{
return &mMountedImageList[imageSlot];
}
ShapeBaseImageData* ShapeBase::getPendingImage(U32 imageSlot)
{
ShapeBaseImageData* data = mMountedImageList[imageSlot].nextImage;
return (data == InvalidImagePtr)? 0: data;
}
bool ShapeBase::isImageFiring(U32 imageSlot)
{
MountedImage& image = mMountedImageList[imageSlot];
return image.dataBlock && image.state->fire;
}
bool ShapeBase::isImageReady(U32 imageSlot,U32 ns,U32 depth)
{
// Will pressing the trigger lead to a fire state?
MountedImage& image = mMountedImageList[imageSlot];
if (depth++ > 5 || !image.dataBlock)
return false;
ShapeBaseImageData::StateData& stateData = (ns == -1) ?
*image.state : image.dataBlock->state[ns];
if (stateData.fire)
return true;
// Try the transitions...
if (stateData.ignoreLoadedForReady == true) {
if ((ns = stateData.transition.loaded[true]) != -1)
if (isImageReady(imageSlot,ns,depth))
return true;
} else {
if ((ns = stateData.transition.loaded[image.loaded]) != -1)
if (isImageReady(imageSlot,ns,depth))
return true;
}
if ((ns = stateData.transition.ammo[image.ammo]) != -1)
if (isImageReady(imageSlot,ns,depth))
return true;
if ((ns = stateData.transition.target[image.target]) != -1)
if (isImageReady(imageSlot,ns,depth))
return true;
if ((ns = stateData.transition.wet[image.wet]) != -1)
if (isImageReady(imageSlot,ns,depth))
return true;
if ((ns = stateData.transition.trigger[1]) != -1)
if (isImageReady(imageSlot,ns,depth))
return true;
if ((ns = stateData.transition.timeout) != -1)
if (isImageReady(imageSlot,ns,depth))
return true;
return false;
}
bool ShapeBase::isImageMounted(ShapeBaseImageData* imageData)
{
for (U32 i = 0; i < MaxMountedImages; i++)
if (imageData == mMountedImageList[i].dataBlock)
return true;
return false;
}
S32 ShapeBase::getMountSlot(ShapeBaseImageData* imageData)
{
for (U32 i = 0; i < MaxMountedImages; i++)
if (imageData == mMountedImageList[i].dataBlock)
return i;
return -1;
}
StringHandle ShapeBase::getImageSkinTag(U32 imageSlot)
{
MountedImage& image = mMountedImageList[imageSlot];
return image.dataBlock? image.skinNameHandle : StringHandle();
}
const char* ShapeBase::getImageState(U32 imageSlot)
{
MountedImage& image = mMountedImageList[imageSlot];
return image.dataBlock? image.state->name: 0;
}
void ShapeBase::setImageAmmoState(U32 imageSlot,bool ammo)
{
MountedImage& image = mMountedImageList[imageSlot];
if (image.dataBlock && !image.dataBlock->usesEnergy && image.ammo != ammo) {
setMaskBits(ImageMaskN << imageSlot);
image.ammo = ammo;
}
}
bool ShapeBase::getImageAmmoState(U32 imageSlot)
{
MountedImage& image = mMountedImageList[imageSlot];
if (!image.dataBlock)
return false;
return image.ammo;
}
void ShapeBase::setImageWetState(U32 imageSlot,bool wet)
{
MountedImage& image = mMountedImageList[imageSlot];
if (image.dataBlock && image.wet != wet) {
setMaskBits(ImageMaskN << imageSlot);
image.wet = wet;
}
}
bool ShapeBase::getImageWetState(U32 imageSlot)
{
MountedImage& image = mMountedImageList[imageSlot];
if (!image.dataBlock)
return false;
return image.wet;
}
void ShapeBase::setImageLoadedState(U32 imageSlot,bool loaded)
{
MountedImage& image = mMountedImageList[imageSlot];
if (image.dataBlock && image.loaded != loaded) {
setMaskBits(ImageMaskN << imageSlot);
image.loaded = loaded;
}
}
bool ShapeBase::getImageLoadedState(U32 imageSlot)
{
MountedImage& image = mMountedImageList[imageSlot];
if (!image.dataBlock)
return false;
return image.loaded;
}
void ShapeBase::getMuzzleVector(U32 imageSlot,VectorF* vec)
{
MatrixF mat;
getMuzzleTransform(imageSlot,&mat);
MountedImage& image = mMountedImageList[imageSlot];
if (image.dataBlock->correctMuzzleVector)
if (GameConnection * gc = getControllingClient())
if (gc->isFirstPerson() && !gc->isAIControlled())
if (getCorrectedAim(mat, vec))
return;
mat.getColumn(1,vec);
}
void ShapeBase::getMuzzlePoint(U32 imageSlot,Point3F* pos)
{
MatrixF mat;
getMuzzleTransform(imageSlot,&mat);
mat.getColumn(3,pos);
}
void ShapeBase::getRenderMuzzleVector(U32 imageSlot,VectorF* vec)
{
MatrixF mat;
getRenderMuzzleTransform(imageSlot,&mat);
MountedImage& image = mMountedImageList[imageSlot];
if (image.dataBlock->correctMuzzleVector)
if (GameConnection * gc = getControllingClient())
if (gc->isFirstPerson() && !gc->isAIControlled())
if (getCorrectedAim(mat, vec))
return;
mat.getColumn(1,vec);
}
void ShapeBase::getRenderMuzzlePoint(U32 imageSlot,Point3F* pos)
{
MatrixF mat;
getRenderMuzzleTransform(imageSlot,&mat);
mat.getColumn(3,pos);
}
//----------------------------------------------------------------------------
void ShapeBase::scriptCallback(U32 imageSlot,const char* function)
{
MountedImage& image = mMountedImageList[imageSlot];
char buff1[32];
dSprintf(buff1,sizeof(buff1),"%d",imageSlot);
Con::executef(image.dataBlock, 3, function,scriptThis(),buff1);
}
//----------------------------------------------------------------------------
void ShapeBase::getMountTransform(U32 mountPoint,MatrixF* mat)
{
// Returns mount point to world space transform
if (mountPoint < ShapeBaseData::NumMountPoints) {
S32 ni = mDataBlock->mountPointNode[mountPoint];
if (ni != -1) {
MatrixF mountTransform = mShapeInstance->mNodeTransforms[ni];
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.
mat->mul(mObjToWorld, mountTransform);
return;
}
}
*mat = mObjToWorld;
}
void ShapeBase::getImageTransform(U32 imageSlot,MatrixF* mat)
{
// Image transform in world space
MountedImage& image = mMountedImageList[imageSlot];
if (image.dataBlock) {
ShapeBaseImageData& data = *image.dataBlock;
MatrixF nmat;
if (data.useEyeOffset && isFirstPerson()) {
getEyeTransform(&nmat);
mat->mul(nmat,data.eyeOffset);
}
else {
getMountTransform(image.dataBlock->mountPoint,&nmat);
mat->mul(nmat,data.mountTransform);
}
}
else
*mat = mObjToWorld;
}
void ShapeBase::getImageTransform(U32 imageSlot,S32 node,MatrixF* mat)
{
// Muzzle transform in world space
MountedImage& image = mMountedImageList[imageSlot];
if (image.dataBlock) {
if (node != -1) {
MatrixF imat;
getImageTransform(imageSlot,&imat);
mat->mul(imat,image.shapeInstance->mNodeTransforms[node]);
}
else
getImageTransform(imageSlot,mat);
}
else
*mat = mObjToWorld;
}
void ShapeBase::getImageTransform(U32 imageSlot,StringTableEntry nodeName,MatrixF* mat)
{
getImageTransform( imageSlot, getNodeIndex( imageSlot, nodeName ), mat );
}
void ShapeBase::getMuzzleTransform(U32 imageSlot,MatrixF* mat)
{
// Muzzle transform in world space
MountedImage& image = mMountedImageList[imageSlot];
if (image.dataBlock)
getImageTransform(imageSlot,image.dataBlock->muzzleNode,mat);
else
*mat = mObjToWorld;
}
//----------------------------------------------------------------------------
void ShapeBase::getRenderMountTransform(U32 mountPoint,MatrixF* mat)
{
// Returns mount point to world space transform
if (mountPoint < ShapeBaseData::NumMountPoints) {
S32 ni = mDataBlock->mountPointNode[mountPoint];
if (ni != -1) {
MatrixF mountTransform = mShapeInstance->mNodeTransforms[ni];
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 );
mat->mul(getRenderTransform(), mountTransform);
return;
}
}
// Return origin by default.
*mat = getRenderTransform();
}
void ShapeBase::getRenderImageTransform(U32 imageSlot,MatrixF* mat)
{
// Image transform in world space
MountedImage& image = mMountedImageList[imageSlot];
if (image.dataBlock) {
ShapeBaseImageData& data = *image.dataBlock;
MatrixF nmat;
if (data.useEyeOffset && isFirstPerson()) {
getRenderEyeTransform(&nmat);
mat->mul(nmat,data.eyeOffset);
}
else {
getRenderMountTransform(data.mountPoint,&nmat);
mat->mul(nmat,data.mountTransform);
}
}
else
*mat = getRenderTransform();
}
void ShapeBase::getRenderImageTransform(U32 imageSlot,S32 node,MatrixF* mat)
{
// Muzzle transform in world space
MountedImage& image = mMountedImageList[imageSlot];
if (image.dataBlock) {
if (node != -1) {
MatrixF imat;
getRenderImageTransform(imageSlot,&imat);
mat->mul(imat,image.shapeInstance->mNodeTransforms[node]);
}
else
getRenderImageTransform(imageSlot,mat);
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -