Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Alpha41/relation vec clean #1329

Open
wants to merge 13 commits into
base: development
Choose a base branch
from
Open
2 changes: 1 addition & 1 deletion Engine/source/T3D/guiObjectView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -565,7 +565,7 @@ void GuiObjectView::renderWorld( const RectI& updateRect )
if( mMountedModelInstance && mMountNode != -1 )
{
GFX->pushWorldMatrix();
GFX->multWorld(mModelInstance->mNodeTransforms[ mMountNode ] );
GFX->multWorld(*(mModelInstance->mNodeTransforms[mMountNode]));
GFX->multWorld( mMountTransform );

mMountedModelInstance->render( rdata );
Expand Down
2 changes: 1 addition & 1 deletion Engine/source/T3D/physics/physicsDebris.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -522,7 +522,7 @@ void PhysicsDebris::interpolateTick( F32 dt )
return;

const MatrixF &objectXfm = getRenderWorldTransform();
Vector<MatrixF> &nodeXfms = mShapeInstance->mNodeTransforms;
Vector<MatrixF> &nodeXfms = *(mShapeInstance->mNodeTransforms.refGlobal());

MatrixF globalXfm;
MatrixF tempXfm;
Expand Down
14 changes: 7 additions & 7 deletions Engine/source/T3D/player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5599,9 +5599,9 @@ void Player::getEyeTransform(MatrixF* mat)
if (imageIndex >= 0)
{
// Get the image's eye node's position relative to the eye mount node
MatrixF mountTransform = image->shapeInstance[shapeIndex]->mNodeTransforms[data->eyeMountNode[shapeIndex]];
MatrixF mountTransform = *(image->shapeInstance[shapeIndex]->mNodeTransforms[data->eyeMountNode[shapeIndex]]);
Point3F eyeMountNodePos = mountTransform.getPosition();
mountTransform = image->shapeInstance[shapeIndex]->mNodeTransforms[data->eyeNode[shapeIndex]];
mountTransform = *(image->shapeInstance[shapeIndex]->mNodeTransforms[data->eyeNode[shapeIndex]]);
Point3F eyeNodePos = mountTransform.getPosition() - eyeMountNodePos;

// Now transform to the image's eye node (position only)
Expand Down Expand Up @@ -5647,7 +5647,7 @@ void Player::getEyeBaseTransform(MatrixF* mat, bool includeBank)
MatrixF eyeMat(true);
if (mDataBlock->eyeNode != -1)
{
sp = mShapeInstance->mNodeTransforms[mDataBlock->eyeNode];
sp = *(mShapeInstance->mNodeTransforms[mDataBlock->eyeNode]);
}
else
{
Expand Down Expand Up @@ -5679,9 +5679,9 @@ void Player::getRenderEyeTransform(MatrixF* mat)
if ( data.useEyeNode && isFirstPerson() && data.eyeMountNode[shapeIndex] != -1 && data.eyeNode[shapeIndex] != -1 )
{
// Get the eye node's position relative to the eye mount node
MatrixF mountTransform = image.shapeInstance[shapeIndex]->mNodeTransforms[data.eyeMountNode[shapeIndex]];
MatrixF mountTransform = *(image.shapeInstance[shapeIndex]->mNodeTransforms[data.eyeMountNode[shapeIndex]]);
Point3F eyeMountNodePos = mountTransform.getPosition();
mountTransform = image.shapeInstance[shapeIndex]->mNodeTransforms[data.eyeNode[shapeIndex]];
mountTransform = *(image.shapeInstance[shapeIndex]->mNodeTransforms[data.eyeNode[shapeIndex]]);
Point3F eyeNodePos = mountTransform.getPosition() - eyeMountNodePos;

// Now transform to the image's eye node (position only)
Expand Down Expand Up @@ -5727,7 +5727,7 @@ void Player::getRenderEyeBaseTransform(MatrixF* mat, bool includeBank)
MatrixF eyeMat(true);
if (mDataBlock->eyeNode != -1)
{
sp = mShapeInstance->mNodeTransforms[mDataBlock->eyeNode];
sp = *(mShapeInstance->mNodeTransforms[mDataBlock->eyeNode]);
}
else
{
Expand Down Expand Up @@ -5877,7 +5877,7 @@ void Player::renderMountedImage( U32 imageSlot, TSRenderState &rstate, SceneRend
{
MatrixF nmat;
getRenderEyeBaseTransform(&nmat, mDataBlock->mountedImagesBank);
MatrixF offsetMat = image.shapeInstance[imageShapeIndex]->mNodeTransforms[data.eyeMountNode[imageShapeIndex]];
MatrixF offsetMat = *(image.shapeInstance[imageShapeIndex]->mNodeTransforms[data.eyeMountNode[imageShapeIndex]]);
offsetMat.affineInverse();
world.mul(nmat,offsetMat);
}
Expand Down
2 changes: 1 addition & 1 deletion Engine/source/T3D/rigidShape.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -982,7 +982,7 @@ void RigidShape::getCameraTransform(F32* pos,MatrixF* mat)
Point3F osp,sp;
if (mDataBlock->cameraNode != -1)
{
mShapeInstance->mNodeTransforms[mDataBlock->cameraNode].getColumn(3,&osp);
osp = mShapeInstance->mNodeTransforms.getPosition(mDataBlock->cameraNode);
getRenderTransform().mulP(osp,&sp);
}
else
Expand Down
2 changes: 1 addition & 1 deletion Engine/source/T3D/sfx/sfx3DWorld.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ void SFX3DObject::getEarTransform( MatrixF& transform ) const
if ( earNode != -1 && earNode != datablock->eyeNode )
{
transform = shape->getTransform();
transform *= shapeInstance->mNodeTransforms[ earNode ];
transform *= *(shapeInstance->mNodeTransforms[ earNode ]);
}
else
{
Expand Down
12 changes: 6 additions & 6 deletions Engine/source/T3D/shapeBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2029,7 +2029,7 @@ void ShapeBase::getNodeTransform(const char* nodeName, MatrixF* outMat)
const Point3F& scale = getScale();
if (nodeIDx != -1)
{
nodeTransform = mShapeInstance->mNodeTransforms[nodeIDx];
nodeTransform = *(mShapeInstance->mNodeTransforms[nodeIDx]);
nodeTransform.mul(xfm);
}
// The position of the mount point needs to be scaled.
Expand Down Expand Up @@ -2066,7 +2066,7 @@ void ShapeBase::getEyeBaseTransform(MatrixF* mat, bool includeBank)
// Returns eye to world space transform
S32 eyeNode = mDataBlock->eyeNode;
if (eyeNode != -1)
mat->mul(getTransform(), mShapeInstance->mNodeTransforms[eyeNode]);
mat->mul(getTransform(), *(mShapeInstance->mNodeTransforms[eyeNode]));
else
*mat = getTransform();
}
Expand All @@ -2081,7 +2081,7 @@ void ShapeBase::getRenderEyeBaseTransform(MatrixF* mat, bool includeBank)
// Returns eye to world space transform
S32 eyeNode = mDataBlock->eyeNode;
if (eyeNode != -1)
mat->mul(getRenderTransform(), mShapeInstance->mNodeTransforms[eyeNode]);
mat->mul(getRenderTransform(), *(mShapeInstance->mNodeTransforms[eyeNode]));
else
*mat = getRenderTransform();
}
Expand Down Expand Up @@ -2116,7 +2116,7 @@ void ShapeBase::getCameraTransform(F32* pos,MatrixF* mat)
// Use the camera node's pos.
Point3F osp,sp;
if (mDataBlock->cameraNode != -1) {
mShapeInstance->mNodeTransforms[mDataBlock->cameraNode].getColumn(3,&osp);
osp = mShapeInstance->mNodeTransforms.getPosition(mDataBlock->cameraNode);

// Scale the camera position before applying the transform
const Point3F& scale = getScale();
Expand Down Expand Up @@ -2195,7 +2195,7 @@ void ShapeBase::getNodeTransform(const char* nodeName, const MatrixF& xfm, Matri
const Point3F& scale = getScale();
if (nodeIDx != -1)
{
nodeTransform = mShapeInstance->mNodeTransforms[nodeIDx];
nodeTransform = *(mShapeInstance->mNodeTransforms[nodeIDx]);
nodeTransform.mul(xfm);
}
// The position of the mount point needs to be scaled.
Expand Down Expand Up @@ -3550,7 +3550,7 @@ void ShapeBaseConvex::findNodeTransform()
const TSShape::Object* obj = &shape->objects[i];
if (obj->numMeshes && detail->objectDetailNum < obj->numMeshes)
{
nodeTransform = &si->mNodeTransforms[obj->nodeIndex];
nodeTransform = si->mNodeTransforms[obj->nodeIndex];
return;
}
}
Expand Down
16 changes: 8 additions & 8 deletions Engine/source/T3D/shapeImage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1869,7 +1869,7 @@ void ShapeBase::getMountTransform( S32 index, const MatrixF &xfm, MatrixF *outMa
if ( index >= 0 && index < SceneObject::NumMountPoints) {
S32 ni = mDataBlock->mountPointNode[index];
if (ni != -1) {
MatrixF mountTransform = mShapeInstance->mNodeTransforms[ni];
MatrixF mountTransform = *(mShapeInstance->mNodeTransforms[ni]);
mountTransform.mul( xfm );
const Point3F& scale = getScale();

Expand Down Expand Up @@ -1903,7 +1903,7 @@ void ShapeBase::getImageTransform(U32 imageSlot,MatrixF* mat)

getEyeBaseTransform(&nmat, mDataBlock->mountedImagesBank);

MatrixF mountTransform = image.shapeInstance[shapeIndex]->mNodeTransforms[data.eyeMountNode[shapeIndex]];
MatrixF mountTransform = *(image.shapeInstance[shapeIndex]->mNodeTransforms[data.eyeMountNode[shapeIndex]]);

mat->mul(nmat, mountTransform);
}
Expand Down Expand Up @@ -1931,7 +1931,7 @@ void ShapeBase::getImageTransform(U32 imageSlot,S32 node,MatrixF* mat)
ShapeBaseImageData& data = *image.dataBlock;
U32 shapeIndex = getImageShapeIndex(image);

MatrixF nmat = image.shapeInstance[shapeIndex]->mNodeTransforms[node];
MatrixF nmat = *(image.shapeInstance[shapeIndex]->mNodeTransforms[node]);
MatrixF mmat;

if (data.useEyeNode && isFirstPerson() && data.eyeMountNode[shapeIndex] != -1)
Expand All @@ -1942,7 +1942,7 @@ void ShapeBase::getImageTransform(U32 imageSlot,S32 node,MatrixF* mat)
MatrixF emat;
getEyeBaseTransform(&emat, mDataBlock->mountedImagesBank);

MatrixF mountTransform = image.shapeInstance[shapeIndex]->mNodeTransforms[data.eyeMountNode[shapeIndex]];
MatrixF mountTransform = *(image.shapeInstance[shapeIndex]->mNodeTransforms[data.eyeMountNode[shapeIndex]]);
mountTransform.affineInverse();

mmat.mul(emat, mountTransform);
Expand Down Expand Up @@ -1993,7 +1993,7 @@ void ShapeBase::getRenderMountTransform( F32 delta, S32 mountPoint, const Matrix
if ( mountPoint >= 0 && mountPoint < SceneObject::NumMountPoints) {
S32 ni = mDataBlock->mountPointNode[mountPoint];
if (ni != -1) {
MatrixF mountTransform = mShapeInstance->mNodeTransforms[ni];
MatrixF mountTransform = *(mShapeInstance->mNodeTransforms[ni]);
mountTransform.mul( xfm );
const Point3F& scale = getScale();

Expand Down Expand Up @@ -2027,7 +2027,7 @@ void ShapeBase::getRenderImageTransform( U32 imageSlot, MatrixF* mat, bool noEye
if ( data.useEyeNode && isFirstPerson() && data.eyeMountNode[shapeIndex] != -1 ) {
getRenderEyeBaseTransform(&nmat, mDataBlock->mountedImagesBank);

MatrixF mountTransform = image.shapeInstance[shapeIndex]->mNodeTransforms[data.eyeMountNode[shapeIndex]];
MatrixF mountTransform = *(image.shapeInstance[shapeIndex]->mNodeTransforms[data.eyeMountNode[shapeIndex]]);

mat->mul(nmat, mountTransform);
}
Expand Down Expand Up @@ -2057,15 +2057,15 @@ void ShapeBase::getRenderImageTransform(U32 imageSlot,S32 node,MatrixF* mat)
ShapeBaseImageData& data = *image.dataBlock;
U32 shapeIndex = getImageShapeIndex(image);

MatrixF nmat = image.shapeInstance[shapeIndex]->mNodeTransforms[node];
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]];
MatrixF mountTransform = *(image.shapeInstance[shapeIndex]->mNodeTransforms[data.eyeMountNode[shapeIndex]]);
mountTransform.affineInverse();

mmat.mul(emat, mountTransform);
Expand Down
2 changes: 1 addition & 1 deletion Engine/source/T3D/tsStatic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1871,7 +1871,7 @@ void TSStatic::getNodeTransform(const char *nodeName, const MatrixF &xfm, Matrix
const Point3F& scale = getScale();
if (nodeIDx != -1)
{
nodeTransform = mShapeInstance->mNodeTransforms[nodeIDx];
nodeTransform = *(mShapeInstance->mNodeTransforms[nodeIDx]);
nodeTransform.mul(xfm);
}
// The position of the mount point needs to be scaled.
Expand Down
2 changes: 1 addition & 1 deletion Engine/source/T3D/turret/aiTurretShape.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -872,7 +872,7 @@ void AITurretShape::_trackTarget(F32 dt)
if (node != -1)
{
// Get the current position of our node
MatrixF* nodeTrans = &mShapeInstance->mNodeTransforms[node];
MatrixF* nodeTrans = mShapeInstance->mNodeTransforms[node];
Point3F currentPos;
nodeTrans->getColumn(3, &currentPos);

Expand Down
24 changes: 12 additions & 12 deletions Engine/source/T3D/turret/turretShape.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -765,7 +765,7 @@ bool TurretShape::getNodeTransform(S32 node, MatrixF& mat)
if (node == -1)
return false;

MatrixF nodeTransform = mShapeInstance->mNodeTransforms[node];
MatrixF nodeTransform = *(mShapeInstance->mNodeTransforms[node]);
const Point3F& scale = getScale();

// The position of the node needs to be scaled.
Expand Down Expand Up @@ -806,7 +806,7 @@ void TurretShape::_updateNodes(const Point3F& rot)
S32 node = mDataBlock->headingNode;
if (node != -1)
{
MatrixF* mat = &mShapeInstance->mNodeTransforms[node];
MatrixF* mat = mShapeInstance->mNodeTransforms[node];
Point3F defaultPos = mShapeInstance->getShape()->defaultTranslations[node];
Quat16 defaultRot = mShapeInstance->getShape()->defaultRotations[node];

Expand All @@ -820,7 +820,7 @@ void TurretShape::_updateNodes(const Point3F& rot)
node = mDataBlock->pitchNode;
if (node != -1)
{
MatrixF* mat = &mShapeInstance->mNodeTransforms[node];
MatrixF* mat = mShapeInstance->mNodeTransforms[node];
Point3F defaultPos = mShapeInstance->getShape()->defaultTranslations[node];
Quat16 defaultRot = mShapeInstance->getShape()->defaultRotations[node];

Expand All @@ -836,7 +836,7 @@ void TurretShape::_updateNodes(const Point3F& rot)
node = mDataBlock->pitchNodes[i];
if (node != -1)
{
MatrixF* mat = &mShapeInstance->mNodeTransforms[node];
MatrixF* mat = mShapeInstance->mNodeTransforms[node];
Point3F defaultPos = mShapeInstance->getShape()->defaultTranslations[node];
Quat16 defaultRot = mShapeInstance->getShape()->defaultRotations[node];

Expand All @@ -849,7 +849,7 @@ void TurretShape::_updateNodes(const Point3F& rot)
node = mDataBlock->headingNodes[i];
if (node != -1)
{
MatrixF* mat = &mShapeInstance->mNodeTransforms[node];
MatrixF* mat = mShapeInstance->mNodeTransforms[node];
Point3F defaultPos = mShapeInstance->getShape()->defaultTranslations[node];
Quat16 defaultRot = mShapeInstance->getShape()->defaultRotations[node];

Expand Down Expand Up @@ -999,7 +999,7 @@ void TurretShape::getCameraTransform(F32* pos,MatrixF* mat)
Point3F osp,sp;
if (mDataBlock->cameraNode != -1)
{
mShapeInstance->mNodeTransforms[mDataBlock->cameraNode].getColumn(3,&osp);
osp = mShapeInstance->mNodeTransforms.getPosition(mDataBlock->cameraNode);
getRenderTransform().mulP(osp,&sp);
}
else
Expand Down Expand Up @@ -1141,7 +1141,7 @@ void TurretShape::getWeaponMountTransform( S32 index, const MatrixF &xfm, Matrix
if ( index >= 0 && index < ShapeBase::MaxMountedImages) {
S32 ni = mDataBlock->weaponMountNode[index];
if (ni != -1) {
MatrixF mountTransform = mShapeInstance->mNodeTransforms[ni];
MatrixF mountTransform = *(mShapeInstance->mNodeTransforms[ni]);
mountTransform.mul( xfm );
const Point3F& scale = getScale();

Expand All @@ -1166,7 +1166,7 @@ void TurretShape::getRenderWeaponMountTransform( F32 delta, S32 mountPoint, cons
if ( mountPoint >= 0 && mountPoint < ShapeBase::MaxMountedImages) {
S32 ni = mDataBlock->weaponMountNode[mountPoint];
if (ni != -1) {
MatrixF mountTransform = mShapeInstance->mNodeTransforms[ni];
MatrixF mountTransform = *(mShapeInstance->mNodeTransforms[ni]);
mountTransform.mul( xfm );
const Point3F& scale = getScale();

Expand Down Expand Up @@ -1244,7 +1244,7 @@ void TurretShape::getImageTransform(U32 imageSlot,S32 node,MatrixF* mat)
ShapeBaseImageData& data = *image.dataBlock;
U32 shapeIndex = getImageShapeIndex(image);

MatrixF nmat = image.shapeInstance[shapeIndex]->mNodeTransforms[node];
MatrixF nmat = *(image.shapeInstance[shapeIndex]->mNodeTransforms[node]);
MatrixF mmat;

if (data.useEyeNode && isFirstPerson() && data.eyeMountNode[shapeIndex] != -1)
Expand All @@ -1255,7 +1255,7 @@ void TurretShape::getImageTransform(U32 imageSlot,S32 node,MatrixF* mat)
MatrixF emat;
getEyeBaseTransform(&emat, mDataBlock->mountedImagesBank);

MatrixF mountTransform = image.shapeInstance[shapeIndex]->mNodeTransforms[data.eyeMountNode[shapeIndex]];
MatrixF mountTransform = *(image.shapeInstance[shapeIndex]->mNodeTransforms[data.eyeMountNode[shapeIndex]]);
mountTransform.affineInverse();

mmat.mul(emat, mountTransform);
Expand Down Expand Up @@ -1295,15 +1295,15 @@ void TurretShape::getRenderImageTransform(U32 imageSlot,S32 node,MatrixF* mat)
ShapeBaseImageData& data = *image.dataBlock;
U32 shapeIndex = getImageShapeIndex(image);

MatrixF nmat = image.shapeInstance[shapeIndex]->mNodeTransforms[node];
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]];
MatrixF mountTransform = *(image.shapeInstance[shapeIndex]->mNodeTransforms[data.eyeMountNode[shapeIndex]]);
mountTransform.affineInverse();

mmat.mul(emat, mountTransform);
Expand Down
2 changes: 1 addition & 1 deletion Engine/source/T3D/vehicles/flyingVehicle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -752,7 +752,7 @@ void FlyingVehicle::updateEmitter(bool active,F32 dt,ParticleEmitterData *emitte
MatrixF mat;
Point3F pos,axis;
mat.mul(getRenderTransform(),
mShapeInstance->mNodeTransforms[mDataBlock->jetNode[j]]);
*(mShapeInstance->mNodeTransforms[mDataBlock->jetNode[j]]));
mat.getColumn(1,&axis);
mat.getColumn(3,&pos);
mJetEmitter[j]->emitParticles(pos,true,axis,getVelocity(),(U32)(dt * 1000));
Expand Down
2 changes: 1 addition & 1 deletion Engine/source/T3D/vehicles/hoverVehicle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -960,7 +960,7 @@ void HoverVehicle::updateEmitter(bool active,F32 dt,ParticleEmitterData *emitter
MatrixF mat;
Point3F pos,axis;
mat.mul(getRenderTransform(),
mShapeInstance->mNodeTransforms[mDataBlock->jetNode[j]]);
*(mShapeInstance->mNodeTransforms[mDataBlock->jetNode[j]]));
mat.getColumn(1,&axis);
mat.getColumn(3,&pos);
mJetEmitter[j]->emitParticles(pos,true,axis,getVelocity(),(U32)(dt * 1000.0f));
Expand Down
2 changes: 1 addition & 1 deletion Engine/source/T3D/vehicles/vehicle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -675,7 +675,7 @@ void Vehicle::getCameraTransform(F32* pos, MatrixF* mat)
Point3F osp, sp;
if (mDataBlock->cameraNode != -1)
{
mShapeInstance->mNodeTransforms[mDataBlock->cameraNode].getColumn(3, &osp);
osp = mShapeInstance->mNodeTransforms.getPosition(mDataBlock->cameraNode);
getRenderTransform().mulP(osp, &sp);
}
else
Expand Down
6 changes: 3 additions & 3 deletions Engine/source/T3D/vehicles/wheeledVehicle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -375,18 +375,18 @@ bool WheeledVehicleData::preload(bool server, String &errorStr)
dSprintf(buff,sizeof(buff),"spring%d",i);
wp->springSequence = mShape->findSequence(buff);
if (wp->springSequence == -1)
si->mNodeTransforms[wp->springNode].getColumn(3, &wp->pos);
wp->pos = si->mNodeTransforms.getPosition(wp->springNode);
else {
si->setSequence(thread,wp->springSequence,0);
si->animate();
si->mNodeTransforms[wp->springNode].getColumn(3, &wp->pos);
wp->pos = si->mNodeTransforms.getPosition(wp->springNode);

// Determin the length of the animation so we can scale it
// according the actual wheel position.
Point3F downPos;
si->setSequence(thread,wp->springSequence,1);
si->animate();
si->mNodeTransforms[wp->springNode].getColumn(3, &downPos);
downPos = si->mNodeTransforms.getPosition(wp->springNode);
wp->springLength = wp->pos.z - downPos.z;
if (!wp->springLength)
wp->springSequence = -1;
Expand Down
Loading
Loading