From: Andrew R. <aar...@us...> - 2005-03-18 14:02:59
|
Update of /cvsroot/planeshift/planeshift/src/common/effects In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2110/src/common/effects Modified Files: pseffect.cpp pseffect.h pseffectanchor.cpp pseffectanchor.h pseffectobj.cpp pseffectobj.h pseffectobjquad.cpp pseffectobjsound.cpp pseffectobjspire.cpp Log Message: Index: pseffect.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/common/effects/pseffect.cpp,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** pseffect.cpp 31 Dec 2004 01:45:10 -0000 1.19 --- pseffect.cpp 18 Mar 2005 14:02:49 -0000 1.20 *************** *** 216,221 **** { // make the base angle point towards the target ! csVector3 diff = attachTarget->GetMovable()->GetPosition() - attachPos->GetMovable()->GetPosition(); ! rotBase = csYRotMatrix3(atan2(-diff.x, -diff.z)); } --- 216,224 ---- { // make the base angle point towards the target ! csVector3 diff = attachPos->GetMovable()->GetPosition() - attachTarget->GetMovable()->GetPosition(); ! csReversibleTransform transf; ! transf.LookAt(diff, csVector3(0,1,0)); ! rotBase = transf.GetT2O(); ! //rotBase = csYRotMatrix3(3.14159f - atan2(-diff.x, -diff.z)); } *************** *** 228,233 **** --- 231,244 ---- // the base position is either the offset (absolute position) or the attached mesh if it exists. csVector3 newPos = offset; + csMatrix3 posTransf; posTransf.Identity(); if (attachPos) + { newPos = attachPos->GetMovable()->GetPosition(); + posTransf = attachPos->GetMovable()->GetTransform().GetT2O(); + } + + csMatrix3 targetTransf = posTransf; + if (attachTarget) + targetTransf = attachTarget->GetMovable()->GetTransform().GetT2O(); // effect anchors *************** *** 238,248 **** hasSuccess = true; ! effectAnchors[i]->SetPosition(newPos, sectors); // target of the anchor is either the given target if it exists or the position if (attachTarget) ! effectAnchors[i]->SetTarget(attachTarget->GetMovable()->GetPosition()); else ! effectAnchors[i]->SetTarget(newPos); // if we're attached to both a position and target then orient the anchor --- 249,259 ---- hasSuccess = true; ! effectAnchors[i]->SetPosition(newPos, sectors, posTransf); // target of the anchor is either the given target if it exists or the position if (attachTarget) ! effectAnchors[i]->SetTarget(attachTarget->GetMovable()->GetPosition(), targetTransf); else ! effectAnchors[i]->SetTarget(newPos, posTransf); // if we're attached to both a position and target then orient the anchor *************** *** 274,277 **** --- 285,300 ---- } + // update the position of this obj + if (attachPos) + { + effectObjs[i]->SetPosition(posTransf); + if (!targetListener) + effectObjs[i]->SetTarget(posTransf); + } + + // update the target of this obj + if (attachTarget) + effectObjs[i]->SetTarget(targetTransf); + // if we're attached to both a position and target then orient the anchor if (attachPos && attachTarget) *************** *** 316,321 **** { // make the base angle point towards the target ! csVector3 diff = attachTarget->GetMovable()->GetPosition() - attachPos->GetMovable()->GetPosition(); ! rotBase = csYRotMatrix3(atan2(-diff.x, -diff.z)); } --- 339,347 ---- { // make the base angle point towards the target ! csVector3 diff = attachPos->GetMovable()->GetPosition() - attachTarget->GetMovable()->GetPosition(); ! csReversibleTransform transf; ! transf.LookAt(diff, csVector3(0,1,0)); ! rotBase = transf.GetT2O(); ! //rotBase = csYRotMatrix3(3.14159f - atan2(-diff.x, -diff.z)); } *************** *** 328,333 **** --- 354,367 ---- // the base position is either the offset (absolute position) or the attached mesh if it exists. csVector3 newPos = offset; + csMatrix3 posTransf; posTransf.Identity(); if (attachPos) + { newPos = attachPos->GetMovable()->GetPosition(); + posTransf = attachPos->GetMovable()->GetTransform().GetT2O(); + } + + csMatrix3 targetTransf = posTransf; + if (attachTarget) + targetTransf = attachTarget->GetMovable()->GetTransform().GetT2O(); // effect anchors *************** *** 338,348 **** hasSuccess = true; ! effectAnchors[i]->SetPosition(newPos, sector); // target of the anchor is either the given target if it exists or the position if (attachTarget) ! effectAnchors[i]->SetTarget(attachTarget->GetMovable()->GetPosition()); else ! effectAnchors[i]->SetTarget(newPos); // if we're attached to both a position and target then orient the anchor --- 372,383 ---- hasSuccess = true; ! effectAnchors[i]->SetPosition(newPos, sector, posTransf); // target of the anchor is either the given target if it exists or the position if (attachTarget) ! effectAnchors[i]->SetTarget(attachTarget->GetMovable()->GetPosition(), ! targetTransf); else ! effectAnchors[i]->SetTarget(newPos, posTransf); // if we're attached to both a position and target then orient the anchor *************** *** 373,376 **** --- 408,424 ---- } } + + // update the position of this obj + if (attachPos) + { + effectObjs[i]->SetPosition(posTransf); + if (!targetListener) + effectObjs[i]->SetTarget(posTransf); + } + + // update the target of this obj + if (attachTarget) + effectObjs[i]->SetTarget(targetTransf); + // if we're attached to both a position and target then orient the anchor *************** *** 394,397 **** --- 442,447 ---- csVector3 newPos; csVector3 newTarget; + csMatrix3 newPosTransf; + csMatrix3 newTargetTransf; if (positionListener) *************** *** 402,406 **** // if the attachMesh has moved, then flag a position update ! if (positionListener->GrabNewData(newSectors, newPos)) { if (!newSectors) --- 452,456 ---- // if the attachMesh has moved, then flag a position update ! if (positionListener->GrabNewData(newSectors, newPos, newPosTransf)) { if (!newSectors) *************** *** 416,420 **** { // if the targetMesh has moved, then flag a target update ! if (targetListener->GrabNewData(newTarget)) updateTarget = true; } --- 466,470 ---- { // if the targetMesh has moved, then flag a target update ! if (targetListener->GrabNewData(newTarget, newTargetTransf)) updateTarget = true; } *************** *** 427,432 **** { // make the base angle point towards the target ! csVector3 diff = targetListener->GetPosition() - positionListener->GetPosition(); ! rotBase = csYRotMatrix3(3.14159f - atan2(-diff.x, -diff.z)); } } --- 477,485 ---- { // make the base angle point towards the target ! csVector3 diff = positionListener->GetPosition() - targetListener->GetPosition(); ! csReversibleTransform transf; ! transf.LookAt(diff, csVector3(0,1,0)); ! rotBase = transf.GetT2O(); ! //rotBase = csYRotMatrix3(3.14159f - atan2(-diff.x, -diff.z)); } } *************** *** 441,452 **** if (updatePos) { ! effectAnchors[a]->SetPosition(newPos, newSectors); if (!targetListener) ! effectAnchors[a]->SetTarget(newPos); } // update the target of this anchor if (updateTarget) ! effectAnchors[a]->SetTarget(newTarget); // update the direction/orientation of this anchor --- 494,505 ---- if (updatePos) { ! effectAnchors[a]->SetPosition(newPos, newSectors, newPosTransf); if (!targetListener) ! effectAnchors[a]->SetTarget(newPos, newPosTransf); } // update the target of this anchor if (updateTarget) ! effectAnchors[a]->SetTarget(newTarget, newTargetTransf); // update the direction/orientation of this anchor *************** *** 465,468 **** --- 518,533 ---- continue; + // update the position of this obj + if (updatePos) + { + effectObjs[a]->SetPosition(newPosTransf); + if (!targetListener) + effectObjs[a]->SetTarget(newPosTransf); + } + + // update the target of this obj + if (updateTarget) + effectObjs[a]->SetTarget(newTargetTransf); + // update the orientation of the obj if (updatePos || updateTarget) Index: pseffect.h =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/common/effects/pseffect.h,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** pseffect.h 18 Dec 2004 03:14:07 -0000 1.10 --- pseffect.h 18 Mar 2005 14:02:50 -0000 1.11 *************** *** 24,27 **** --- 24,29 ---- #include <csutil/csstring.h> #include <csutil/array.h> + #include <csgeom/matrix3.h> + #include <iengine/movable.h> #include <csutil/ref.h> #include <csutil/scf.h> *************** *** 165,168 **** --- 167,171 ---- iSectorList * moveSectors; csVector3 movePos; + csMatrix3 transf; bool movableDead; *************** *** 172,175 **** --- 175,179 ---- moveSectors = 0; movePos = csVector3(0,0,0); + transf.Identity(); movableDead = false; *************** *** 190,193 **** --- 194,198 ---- movePos = movable->GetPosition(); moveSectors = movable->GetSectors(); + transf = movable->GetTransform().GetT2O(); } *************** *** 210,216 **** * @param newSectors a container to store all the sectors that the movable is in * @param newPos a container to store the new position of the movable * @return true if the movable has changed since this function was called last */ ! bool GrabNewData(iSectorList *& newSectors, csVector3 & newPos) { if (!moveSectors) --- 215,222 ---- * @param newSectors a container to store all the sectors that the movable is in * @param newPos a container to store the new position of the movable + * @param newTransf a container to store the new transform of the movable * @return true if the movable has changed since this function was called last */ ! bool GrabNewData(iSectorList *& newSectors, csVector3 & newPos, csMatrix3 & newTransf) { if (!moveSectors) *************** *** 219,222 **** --- 225,229 ---- newSectors = moveSectors; newPos = movePos; + newTransf = transf; moveSectors = 0; *************** *** 226,232 **** /** Gets the new movable data if there is any * @param newPos a container to store the new position of the movable * @return true if the movable has changed since this function was called last */ ! bool GrabNewData(csVector3& newPos) { if (!moveSectors) --- 233,240 ---- /** Gets the new movable data if there is any * @param newPos a container to store the new position of the movable + * @param newTransf a container to store the new transform of the movable * @return true if the movable has changed since this function was called last */ ! bool GrabNewData(csVector3 & newPos, csMatrix3 & newTransf) { if (!moveSectors) *************** *** 234,237 **** --- 242,246 ---- newPos = movePos; + newTransf = transf; moveSectors = 0; return true; *************** *** 243,246 **** --- 252,256 ---- } }; + csRef<psEffectMovableListener> positionListener; csRef<psEffectMovableListener> targetListener; Index: pseffectanchor.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/common/effects/pseffectanchor.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** pseffectanchor.cpp 11 Mar 2005 05:46:06 -0000 1.3 --- pseffectanchor.cpp 18 Mar 2005 14:02:50 -0000 1.4 *************** *** 192,198 **** objTargetOffset = csVector3(0,0,0); objOffset = csVector3(0,0,0); ! absDir = false; ! distScale = csVector3(0,0,1); keyFrames.AttachNew(new psEffectAnchorKeyFrameGroup); --- 192,200 ---- objTargetOffset = csVector3(0,0,0); objOffset = csVector3(0,0,0); + posTransf.Identity(); + targetTransf.Identity(); ! dir = DT_NONE; ! distScale = csVector3(1,1,1); keyFrames.AttachNew(new psEffectAnchorKeyFrameGroup); *************** *** 214,223 **** csRef<iDocumentNode> dataNode; ! // absolute direction ! dataNode = node->GetNode("abs_dir"); if (dataNode) ! absDir = true; else ! absDir = false; // target distance scale --- 216,234 ---- csRef<iDocumentNode> dataNode; ! // direction ! dataNode = node->GetNode("dir"); if (dataNode) ! { ! csString dirName = dataNode->GetContentsValue(); ! dirName.Downcase(); ! if (dirName == "target") ! dir = DT_TARGET; ! else if (dirName == "origin") ! dir = DT_ORIGIN; ! else ! dir = DT_NONE; ! } else ! dir = DT_NONE; // target distance scale *************** *** 277,288 **** // TOTARGET ! objTargetOffset = lerpVec(csVector3(keyFrames->Get(currKeyFrame)->actions[psEffectAnchorKeyFrame::KA_TOTARGET_X], ! keyFrames->Get(currKeyFrame)->actions[psEffectAnchorKeyFrame::KA_TOTARGET_Y], ! keyFrames->Get(currKeyFrame)->actions[psEffectAnchorKeyFrame::KA_TOTARGET_Z]), ! csVector3(keyFrames->Get(nextKeyFrame)->actions[psEffectAnchorKeyFrame::KA_TOTARGET_X], ! keyFrames->Get(nextKeyFrame)->actions[psEffectAnchorKeyFrame::KA_TOTARGET_Y], ! keyFrames->Get(nextKeyFrame)->actions[psEffectAnchorKeyFrame::KA_TOTARGET_Z]), ! keyFrames->Get(currKeyFrame)->time, keyFrames->Get(nextKeyFrame)->time, life); // POSITION objOffset = lerpVec(csVector3(keyFrames->Get(currKeyFrame)->actions[psEffectAnchorKeyFrame::KA_POS_X], --- 288,303 ---- // TOTARGET ! objTargetOffset = lerpVec( ! csVector3(keyFrames->Get(currKeyFrame)->actions[psEffectAnchorKeyFrame::KA_TOTARGET_X], ! keyFrames->Get(currKeyFrame)->actions[psEffectAnchorKeyFrame::KA_TOTARGET_Y], ! keyFrames->Get(currKeyFrame)->actions[psEffectAnchorKeyFrame::KA_TOTARGET_Z]), ! csVector3(keyFrames->Get(nextKeyFrame)->actions[psEffectAnchorKeyFrame::KA_TOTARGET_X], ! keyFrames->Get(nextKeyFrame)->actions[psEffectAnchorKeyFrame::KA_TOTARGET_Y], ! keyFrames->Get(nextKeyFrame)->actions[psEffectAnchorKeyFrame::KA_TOTARGET_Z]), ! keyFrames->Get(currKeyFrame)->time, keyFrames->Get(nextKeyFrame)->time, life); ! ! TransformOffset(objTargetOffset); + // POSITION objOffset = lerpVec(csVector3(keyFrames->Get(currKeyFrame)->actions[psEffectAnchorKeyFrame::KA_POS_X], *************** *** 293,301 **** keyFrames->Get(nextKeyFrame)->actions[psEffectAnchorKeyFrame::KA_POS_Z]), keyFrames->Get(currKeyFrame)->time, keyFrames->Get(nextKeyFrame)->time, life); ! ! TransformOffset(objTargetOffset); mesh->GetMovable()->SetPosition(objEffectPos + objBasePos + objTargetOffset + objOffset); ! mesh->GetMovable()->SetTransform(matBase); mesh->GetMovable()->UpdateMove(); --- 308,321 ---- keyFrames->Get(nextKeyFrame)->actions[psEffectAnchorKeyFrame::KA_POS_Z]), keyFrames->Get(currKeyFrame)->time, keyFrames->Get(nextKeyFrame)->time, life); ! ! // adjust position by direction if there is one ! if (dir == DT_TARGET) ! objOffset = targetTransf * csVector3(-objOffset.x, objOffset.y, -objOffset.z); ! else if (dir == DT_ORIGIN) ! objOffset = posTransf * csVector3(-objOffset.x, objOffset.y, -objOffset.z); ! mesh->GetMovable()->SetPosition(objEffectPos + objBasePos + objTargetOffset + objOffset); ! //mesh->GetMovable()->SetTransform(matBase); mesh->GetMovable()->UpdateMove(); *************** *** 309,313 **** newAnchor->animLength = animLength; newAnchor->objOffset = objOffset; ! newAnchor->absDir = absDir; newAnchor->distScale = distScale; --- 329,333 ---- newAnchor->animLength = animLength; newAnchor->objOffset = objOffset; ! newAnchor->dir = dir; newAnchor->distScale = distScale; *************** *** 324,332 **** } ! void psEffectAnchor::SetPosition(const csVector3 & basePos, iSector * sector) { if (sector) { objEffectPos = basePos; mesh->GetMovable()->SetPosition(objEffectPos + objBasePos + objTargetOffset + objOffset); mesh->GetMovable()->SetSector(sector); --- 344,353 ---- } ! void psEffectAnchor::SetPosition(const csVector3 & basePos, iSector * sector, const csMatrix3 & transf) { if (sector) { objEffectPos = basePos; + posTransf = transf; mesh->GetMovable()->SetPosition(objEffectPos + objBasePos + objTargetOffset + objOffset); mesh->GetMovable()->SetSector(sector); *************** *** 334,342 **** } ! void psEffectAnchor::SetPosition(const csVector3 & basePos, iSectorList * sectors) { if (sectors) { objEffectPos = basePos; mesh->GetMovable()->SetPosition(objEffectPos + objBasePos + objTargetOffset + objOffset); mesh->GetMovable()->SetSector(sectors->Get(0)); --- 355,364 ---- } ! void psEffectAnchor::SetPosition(const csVector3 & basePos, iSectorList * sectors, const csMatrix3 & transf) { if (sectors) { objEffectPos = basePos; + posTransf = transf; mesh->GetMovable()->SetPosition(objEffectPos + objBasePos + objTargetOffset + objOffset); mesh->GetMovable()->SetSector(sectors->Get(0)); *************** *** 346,352 **** } ! void psEffectAnchor::SetTarget(const csVector3 & newTarget) { target = newTarget; } --- 368,375 ---- } ! void psEffectAnchor::SetTarget(const csVector3 & newTarget, const csMatrix3 & transf) { target = newTarget; + targetTransf = transf; } *************** *** 373,388 **** void psEffectAnchor::TransformOffset(csVector3 & offset) { ! // distance scale ! float tarDiff = (target - objEffectPos).Norm(); ! if (distScale.x != 0) ! offset.x *= tarDiff * distScale.x; ! if (distScale.y != 0) ! offset.y *= tarDiff * distScale.y; ! if (distScale.z != 0) ! offset.z *= tarDiff * distScale.z; ! // direction ! if (!absDir) offset = matBase * offset; } --- 396,413 ---- void psEffectAnchor::TransformOffset(csVector3 & offset) { ! if (offset.x != 0 || offset.y != 0 || offset.z != 0) ! { ! // distance scale ! float tarDiff = -(target - objEffectPos).Norm(); ! if (distScale.x != 0) ! offset.x *= tarDiff * distScale.x; ! if (distScale.y != 0) ! offset.y *= tarDiff * distScale.y; ! if (distScale.z != 0) ! offset.z *= tarDiff * distScale.z; ! // direction offset = matBase * offset; + } } Index: pseffectanchor.h =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/common/effects/pseffectanchor.h,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** pseffectanchor.h 11 Mar 2005 05:46:23 -0000 1.4 --- pseffectanchor.h 18 Mar 2005 14:02:50 -0000 1.5 *************** *** 181,197 **** * @param basePos The new position of the anchor. * @param sector The new sector of the anchor */ ! virtual void SetPosition(const csVector3 & basePos, iSector * sector); /** Sets a new position for the effect anchor. * @param basePos The new position of the anchor. * @param sectors The new sectors of the anchor. */ ! virtual void SetPosition(const csVector3 & basePos, iSectorList * sectors); /** Sets the target of the effect anchor. * @param newTarget The new target. */ ! void SetTarget(const csVector3 & newTarget); /** Returns the name of this effect anchor. --- 181,200 ---- * @param basePos The new position of the anchor. * @param sector The new sector of the anchor + * @param transf The transform of the position. */ ! virtual void SetPosition(const csVector3 & basePos, iSector * sector, const csMatrix3 & transf); /** Sets a new position for the effect anchor. * @param basePos The new position of the anchor. * @param sectors The new sectors of the anchor. + * @param transf The transform of the position. */ ! virtual void SetPosition(const csVector3 & basePos, iSectorList * sectors, const csMatrix3 & transf); /** Sets the target of the effect anchor. * @param newTarget The new target. + * @param transf The transform of the target. */ ! void SetTarget(const csVector3 & newTarget, const csMatrix3 & transf); /** Returns the name of this effect anchor. *************** *** 234,243 **** * @return true if it has an absolute direction, false otherwise. */ ! bool HasAbsDir() const { return absDir; } /** Sets whether or not this anchor has an absolute direction. * @param hasAbsDir True if it should have an absolute direction, false otherwise. */ ! void SetAbsDir(bool hasAbsDir) { absDir = hasAbsDir; } /** Grabs the dist scale (how much each component of the position is affected by target distance) vector for --- 237,246 ---- * @return true if it has an absolute direction, false otherwise. */ ! bool HasAbsDir() const { } /** Sets whether or not this anchor has an absolute direction. * @param hasAbsDir True if it should have an absolute direction, false otherwise. */ ! void SetAbsDir(bool hasAbsDir) { } /** Grabs the dist scale (how much each component of the position is affected by target distance) vector for *************** *** 259,263 **** size_t AddKeyFrame(float time); ! protected: --- 262,274 ---- size_t AddKeyFrame(float time); ! enum DIR_TYPE ! { ! DT_NONE = 0, ! DT_ORIGIN, ! DT_TARGET, ! ! DT_COUNT ! }; ! protected: *************** *** 302,315 **** /// The complete offset, this gets modified by the position action, generally. csVector3 objOffset; /// Stores the target of the effect. csVector3 target; /// The mesh that makes up this anchor. csRef<iMeshWrapper> mesh; ! /// Decides if the direction/orientation should be absolute or based on the direction to the target. ! bool absDir; ! /// How to scale the x,y,z position by the distance from the target. csVector3 distScale; --- 313,328 ---- /// The complete offset, this gets modified by the position action, generally. csVector3 objOffset; + csMatrix3 posTransf; /// Stores the target of the effect. csVector3 target; + csMatrix3 targetTransf; /// The mesh that makes up this anchor. csRef<iMeshWrapper> mesh; ! /// What type of direction does this movable have ! int dir; ! /// How to scale the x,y,z position by the distance from the target. csVector3 distScale; Index: pseffectobj.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/common/effects/pseffectobj.cpp,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** pseffectobj.cpp 18 Dec 2004 03:14:07 -0000 1.21 --- pseffectobj.cpp 18 Mar 2005 14:02:50 -0000 1.22 *************** *** 27,30 **** --- 27,31 ---- #include <iengine/movable.h> #include <iengine/sector.h> + #include <iengine/camera.h> #include <cstool/csview.h> #include <imesh/particles.h> *************** *** 59,63 **** psEffectObjKeyFrame::IT_LERP, /* PADDING */ psEffectObjKeyFrame::IT_FLOOR, /* ANIMATE */ - psEffectObjKeyFrame::IT_FLOOR /* PLAY */ }; --- 60,63 ---- *************** *** 106,110 **** actions[KA_PADDING] = 0.1f; actions[KA_ANIMATE] = 1; - actions[KA_PLAY] = 0; while (xmlbinds->HasNext()) --- 106,109 ---- *************** *** 243,260 **** actions[KA_ANIMATE] = -1; } - else if (action == "play") - { - specAction.SetBit(KA_PLAY); - csString val = keyNode->GetAttributeValue("value"); - val.Downcase(); - if (val == "stop" || val == "false") - actions[KA_PLAY] = 0; - else if ( val == "once" || val == "true" ) - actions[KA_PLAY] = 1; - else if ( val == "loop" ) - actions[KA_PLAY] = 2; - else if ( val == "pause" ) - actions[KA_PLAY] = 3; - } } } --- 242,245 ---- *************** *** 401,410 **** mixmode = CS_FX_ADD; ! // absolute direction ! dataNode = node->GetNode("abs_dir"); if (dataNode) ! absDir = true; else ! absDir = false; // KEYFRAMES --- 386,408 ---- mixmode = CS_FX_ADD; ! // direction ! dataNode = node->GetNode("dir"); if (dataNode) ! { ! csString dirName = dataNode->GetContentsValue(); ! dirName.Downcase(); ! if (dirName == "target") ! dir = DT_TARGET; ! else if (dirName == "origin") ! dir = DT_ORIGIN; ! else if (dirName == "totarget") ! dir = DT_TO_TARGET; ! else if (dirName == "camera") ! dir = DT_CAMERA; ! else ! dir = DT_NONE; ! } else ! dir = DT_NONE; // KEYFRAMES *************** *** 440,443 **** --- 438,443 ---- bool psEffectObj::Update(csTicks elapsed) { + const static csMatrix3 UP_FIX(1,0,0, 0,0,1, 0,1,0); + life += (float)elapsed; while (life > animLength && killTime <= 0) *************** *** 450,455 **** anchorMesh->GetChildren()->Add(mesh); } ! ! if (keyFrames->Length() != 0) { currKeyFrame = FindKeyFrameByTime(life); --- 450,468 ---- anchorMesh->GetChildren()->Add(mesh); } ! ! if (keyFrames->Length() == 0) ! { ! if (dir == DT_CAMERA) ! { ! csVector3 camDir = -view->GetCamera()->GetTransform().GetO2TTranslation() ! + anchorMesh->GetMovable()->GetPosition(); ! csReversibleTransform rt; ! rt.LookAt(camDir, csVector3(0.f,1.f,0.f)); ! matBase = rt.GetT2O() * UP_FIX; ! } ! mesh->GetMovable()->SetTransform(matBase); ! mesh->GetMovable()->UpdateMove(); ! } ! else { currKeyFrame = FindKeyFrameByTime(life); *************** *** 457,460 **** --- 470,475 ---- if (nextKeyFrame >= keyFrames->Length()) nextKeyFrame = 0; + + // grab and lerp values // ROTATE *************** *** 467,474 **** csVector3 lerpRot = lerpVec(v1,v2, keyFrames->Get(currKeyFrame)->time, keyFrames->Get(nextKeyFrame)->time, life); - csMatrix3 matRot = csZRotMatrix3(lerpRot.z) * csYRotMatrix3(lerpRot.y) * csXRotMatrix3(lerpRot.x); - csMatrix3 matTransform = matRot * matBase; - // SPIN v1 = csVector3(keyFrames->Get(currKeyFrame)->actions[psEffectObjKeyFrame::KA_SPIN_X], --- 482,486 ---- *************** *** 479,484 **** keyFrames->Get(nextKeyFrame)->actions[psEffectObjKeyFrame::KA_SPIN_Z]); csVector3 lerpSpin = lerpVec(v1,v2, ! keyFrames->Get(currKeyFrame)->time, keyFrames->Get(nextKeyFrame)->time, life); ! matTransform *= csYRotMatrix3(-lerpSpin.z) * csZRotMatrix3(lerpSpin.y) * csXRotMatrix3(lerpSpin.x); // SCALE --- 491,495 ---- keyFrames->Get(nextKeyFrame)->actions[psEffectObjKeyFrame::KA_SPIN_Z]); csVector3 lerpSpin = lerpVec(v1,v2, ! keyFrames->Get(currKeyFrame)->time, keyFrames->Get(nextKeyFrame)->time, life); // SCALE *************** *** 486,493 **** keyFrames->Get(nextKeyFrame)->actions[psEffectObjKeyFrame::KA_SCALE], keyFrames->Get(currKeyFrame)->time, keyFrames->Get(nextKeyFrame)->time, life); ! matTransform *= lerpScale; ! ! mesh->GetMovable()->SetTransform(matTransform); ! // POSITION v1 = csVector3(keyFrames->Get(currKeyFrame)->actions[psEffectObjKeyFrame::KA_POS_X], --- 497,501 ---- keyFrames->Get(nextKeyFrame)->actions[psEffectObjKeyFrame::KA_SCALE], keyFrames->Get(currKeyFrame)->time, keyFrames->Get(nextKeyFrame)->time, life); ! // POSITION v1 = csVector3(keyFrames->Get(currKeyFrame)->actions[psEffectObjKeyFrame::KA_POS_X], *************** *** 498,503 **** keyFrames->Get(nextKeyFrame)->actions[psEffectObjKeyFrame::KA_POS_Z]); csVector3 objOffset = lerpVec(v1, v2, ! keyFrames->Get(currKeyFrame)->time, keyFrames->Get(nextKeyFrame)->time, life); ! mesh->GetMovable()->SetPosition(matRot * objOffset); mesh->GetMovable()->UpdateMove(); } --- 506,546 ---- keyFrames->Get(nextKeyFrame)->actions[psEffectObjKeyFrame::KA_POS_Z]); csVector3 objOffset = lerpVec(v1, v2, ! keyFrames->Get(currKeyFrame)->time, keyFrames->Get(nextKeyFrame)->time, life); ! ! // calculate rotation from lerped values ! csMatrix3 matRot = csZRotMatrix3(lerpRot.z) * csYRotMatrix3(lerpRot.y) * csXRotMatrix3(lerpRot.x); ! if (dir != DT_CAMERA) ! matRot = matRot * matBase; ! ! // calculate new position ! csVector3 newPos = matRot * csVector3(-objOffset.x, objOffset.y, -objOffset.z); ! ! csMatrix3 matTransform; ! if (dir == DT_CAMERA) ! { ! csVector3 camDir = -view->GetCamera()->GetTransform().GetO2TTranslation() ! + anchorMesh->GetMovable()->GetPosition() + newPos; ! csReversibleTransform rt; ! rt.LookAt(camDir, csVector3(sin(lerpSpin.y),cos(lerpSpin.y),0.f)); ! matBase = rt.GetT2O() * UP_FIX; ! ! // rotate and spin should have no effect on the transform when we want it to face the camera ! matTransform = matBase; ! } ! else ! { ! matTransform = matRot; ! ! matTransform *= csZRotMatrix3(lerpSpin.z) * csYRotMatrix3(lerpSpin.y) * csXRotMatrix3(lerpSpin.x); ! } ! ! // apply scale ! matTransform *= lerpScale; ! ! // set new transform ! mesh->GetMovable()->SetTransform(matTransform); ! ! // set new position ! mesh->GetMovable()->SetPosition(newPos); mesh->GetMovable()->UpdateMove(); } *************** *** 529,533 **** newObj->isAlive = isAlive; newObj->zFunc = zFunc; ! newObj->absDir = absDir; newObj->priority = priority; newObj->mixmode = mixmode; --- 572,576 ---- newObj->isAlive = isAlive; newObj->zFunc = zFunc; ! newObj->dir = dir; newObj->priority = priority; newObj->mixmode = mixmode; *************** *** 569,576 **** } ! void psEffectObj::SetRotBase(const csMatrix3 &newRotBase) { ! if (!absDir) ! matBase = newRotBase * matUp; } --- 612,631 ---- } ! void psEffectObj::SetRotBase(const csMatrix3 & newRotBase) { ! if (dir == DT_TO_TARGET) ! matBase = newRotBase; ! } ! ! void psEffectObj::SetPosition(const csMatrix3 & newPosTransf) ! { ! if (dir == DT_ORIGIN) ! matBase = newPosTransf; ! } ! ! void psEffectObj::SetTarget(const csMatrix3 & newTargetTransf) ! { ! if (dir == DT_TARGET) ! matBase = newTargetTransf; } Index: pseffectobj.h =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/common/effects/pseffectobj.h,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** pseffectobj.h 18 Dec 2004 03:14:07 -0000 1.18 --- pseffectobj.h 18 Mar 2005 14:02:50 -0000 1.19 *************** *** 84,88 **** KA_PADDING, KA_ANIMATE, - KA_PLAY, KA_COUNT --- 84,87 ---- *************** *** 196,200 **** * @param rot the base rotation matrix of the angle */ ! void SetRotBase(const csMatrix3 &newRotBase); /** Sets the name of the anchor that this effect obj is attached to. --- 195,209 ---- * @param rot the base rotation matrix of the angle */ ! void SetRotBase(const csMatrix3 & newRotBase); ! ! /** Sets the position rotation of the effect obj. ! * @param newPosTransf the new position rotation. ! */ ! void SetPosition(const csMatrix3 & newPosTransf); ! ! /** Sets the target rotation of the effect obj. ! * @param newTargetTransf the new target rotation. ! */ ! void SetTarget(const csMatrix3 & newTargetTransf); /** Sets the name of the anchor that this effect obj is attached to. *************** *** 228,232 **** */ psEffectObjKeyFrame * GetKeyFrame(size_t idx) const; ! protected: --- 237,252 ---- */ psEffectObjKeyFrame * GetKeyFrame(size_t idx) const; ! ! enum DIR_TYPE ! { ! DT_NONE = 0, ! DT_ORIGIN, ! DT_TARGET, ! DT_TO_TARGET, ! DT_CAMERA, ! ! DT_COUNT ! }; ! protected: *************** *** 271,275 **** csMatrix3 matBase; csMatrix3 matUp; ! csRef<iMeshFactoryWrapper> meshFact; csRef<iMeshWrapper> mesh; --- 291,295 ---- csMatrix3 matBase; csMatrix3 matUp; ! csRef<iMeshFactoryWrapper> meshFact; csRef<iMeshWrapper> mesh; *************** *** 282,288 **** unsigned int mixmode; ! // decide if direction should be abs or not ! bool absDir; ! // used for the update loop size_t currKeyFrame; --- 302,308 ---- unsigned int mixmode; ! // direction ! int dir; ! // used for the update loop size_t currKeyFrame; Index: pseffectobjquad.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/common/effects/pseffectobjquad.cpp,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** pseffectobjquad.cpp 13 Nov 2004 09:40:40 -0000 1.13 --- pseffectobjquad.cpp 18 Mar 2005 14:02:50 -0000 1.14 *************** *** 99,106 **** objUp = up; csReversibleTransform rt; ! rt.LookAt(up, csVector3(0,2,1)); matUp = rt.GetT2O(); matBase = matUp; // common flags mesh->GetFlags().Set(CS_ENTITY_NOHITBEAM); --- 99,108 ---- objUp = up; csReversibleTransform rt; ! rt.LookAt(csVector3(up.x, up.z, up.y), csVector3(0,2,1)); matUp = rt.GetT2O(); matBase = matUp; + //matBase.Identity(); + // common flags mesh->GetFlags().Set(CS_ENTITY_NOHITBEAM); *************** *** 207,214 **** // add the vertex data ! facState->SetVertex(a, 0, csVector3( 0.5f*scale, 0.5f*scale, 0)); ! facState->SetVertex(a, 1, csVector3(-0.5f*scale, 0.5f*scale, 0)); ! facState->SetVertex(a, 2, csVector3(-0.5f*scale,-0.5f*scale, 0)); ! facState->SetVertex(a, 3, csVector3( 0.5f*scale,-0.5f*scale, 0)); // calculate texture coordinates according to the cell animations --- 209,216 ---- // add the vertex data ! facState->SetVertex(a, 0, csVector3( 0.5f*scale, 0, 0.5f*scale)); ! facState->SetVertex(a, 1, csVector3(-0.5f*scale, 0, 0.5f*scale)); ! facState->SetVertex(a, 2, csVector3(-0.5f*scale, 0, -0.5f*scale)); ! facState->SetVertex(a, 3, csVector3( 0.5f*scale, 0, -0.5f*scale)); // calculate texture coordinates according to the cell animations *************** *** 225,232 **** // normals ! facState->SetNormal(a, 0, csVector3(0, 0, 1)); ! facState->SetNormal(a, 1, csVector3(0, 0, 1)); ! facState->SetNormal(a, 2, csVector3(0, 0, 1)); ! facState->SetNormal(a, 3, csVector3(0, 0, 1)); if (a == keyFrames->Length()-1) --- 227,234 ---- // normals ! facState->SetNormal(a, 0, csVector3(0, 1, 0)); ! facState->SetNormal(a, 1, csVector3(0, 1, 0)); ! facState->SetNormal(a, 2, csVector3(0, 1, 0)); ! facState->SetNormal(a, 3, csVector3(0, 1, 0)); if (a == keyFrames->Length()-1) Index: pseffectobjsound.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/common/effects/pseffectobjsound.cpp,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** pseffectobjsound.cpp 23 Feb 2005 20:39:22 -0000 1.8 --- pseffectobjsound.cpp 18 Mar 2005 14:02:50 -0000 1.9 *************** *** 61,65 **** { ! if (!psEffectObj::Load(node)) return false; --- 61,65 ---- { ! if (!psEffectObj::Load(node)) return false; *************** *** 78,82 **** name = attr->GetValue(); else if (attrName == "resource") ! soundName = attr->GetValue(); } --- 78,82 ---- name = attr->GetValue(); else if (attrName == "resource") ! soundName = attr->GetValue(); } *************** *** 114,125 **** effectID += nextUniqueID++; ! sndSource = sndHandle->CreateSource(SOUND3D_DISABLE); if (!sndSource) { Error2("Could not create %s effect obj sound source.\n", name.GetData()); ! return false; } sndSource->SetVolume(1); sndSource->SetPosition(csVector3(0,0,0)); isAlive = false; --- 114,129 ---- effectID += nextUniqueID++; ! sndSource = sndHandle->CreateSource(SOUND3D_ABSOLUTE); if (!sndSource) { Error2("Could not create %s effect obj sound source.\n", name.GetData()); ! return false; } sndSource->SetVolume(1); sndSource->SetPosition(csVector3(0,0,0)); + + sndSource->SetMinimumDistance(sqrt(minDistSquared)); + sndSource->SetMaximumDistance(sqrt(maxDistSquared)); + isAlive = false; *************** *** 130,135 **** bool psEffectObjSound::AttachToAnchor(psEffectAnchor * anchor) { ! if ( anchor && anchor->GetMesh() ) ! anchorMesh = anchor->GetMesh(); return true; } --- 134,139 ---- bool psEffectObjSound::AttachToAnchor(psEffectAnchor * anchor) { ! if ( anchor && anchor->GetMesh() ) ! anchorMesh = anchor->GetMesh(); return true; } *************** *** 156,165 **** float volScale = 0.0f; if (distSquared < maxDistSquared) ! { ! if (distSquared <= minDistSquared) ! volScale = 1.0f; ! else ! volScale = (maxDistSquared - distSquared) / (maxDistSquared - minDistSquared); ! } sndSource->SetPosition(pos); sndSource->SetVolume(volScale); --- 160,164 ---- float volScale = 0.0f; if (distSquared < maxDistSquared) ! volScale = 1.0f; sndSource->SetPosition(pos); sndSource->SetVolume(volScale); *************** *** 173,184 **** // position ! csVector3 v1 = csVector3(keyFrames->Get(currKeyFrame)->actions[psEffectObjKeyFrame::KA_POS_X], ! keyFrames->Get(currKeyFrame)->actions[psEffectObjKeyFrame::KA_POS_Y], ! keyFrames->Get(currKeyFrame)->actions[psEffectObjKeyFrame::KA_POS_Z]); ! csVector3 v2 = csVector3(keyFrames->Get(nextKeyFrame)->actions[psEffectObjKeyFrame::KA_POS_X], ! keyFrames->Get(nextKeyFrame)->actions[psEffectObjKeyFrame::KA_POS_Y], ! keyFrames->Get(nextKeyFrame)->actions[psEffectObjKeyFrame::KA_POS_Z]); ! csVector3 objOffset = lerpVec(v1, v2, ! keyFrames->Get(currKeyFrame)->time, keyFrames->Get(nextKeyFrame)->time, life); csVector3 pos = anchorMesh->GetMovable()->GetPosition() + objOffset; --- 172,183 ---- // position ! csVector3 v1 = csVector3(keyFrames->Get(currKeyFrame)->actions[psEffectObjKeyFrame::KA_POS_X], ! keyFrames->Get(currKeyFrame)->actions[psEffectObjKeyFrame::KA_POS_Y], ! keyFrames->Get(currKeyFrame)->actions[psEffectObjKeyFrame::KA_POS_Z]); ! csVector3 v2 = csVector3(keyFrames->Get(nextKeyFrame)->actions[psEffectObjKeyFrame::KA_POS_X], ! keyFrames->Get(nextKeyFrame)->actions[psEffectObjKeyFrame::KA_POS_Y], ! keyFrames->Get(nextKeyFrame)->actions[psEffectObjKeyFrame::KA_POS_Z]); ! csVector3 objOffset = lerpVec(v1, v2, ! keyFrames->Get(currKeyFrame)->time, keyFrames->Get(nextKeyFrame)->time, life); csVector3 pos = anchorMesh->GetMovable()->GetPosition() + objOffset; *************** *** 193,202 **** float volScale = 0.0f; if (distSquared < maxDistSquared) ! { ! if (distSquared <= minDistSquared) ! volScale = 1.0f; ! else ! volScale = (maxDistSquared - distSquared) / (maxDistSquared - minDistSquared); ! } sndSource->SetVolume(lerpVol * volScale); --- 192,196 ---- float volScale = 0.0f; if (distSquared < maxDistSquared) ! volScale = 1.0f; sndSource->SetVolume(lerpVol * volScale); *************** *** 226,230 **** newObj->sndHandle = sndHandle; newObj->soundmanager = soundmanager; ! newObj->sndSource = sndSource; return newObj; --- 220,224 ---- newObj->sndHandle = sndHandle; newObj->soundmanager = soundmanager; ! newObj->sndSource = sndSource; return newObj; *************** *** 233,248 **** bool psEffectObjSound::PostSetup() { ! soundmanager = CS_QUERY_REGISTRY(psCSSetup::object_reg, iSoundManager); if ( soundmanager ) { ! if ( !soundmanager->Setup() ) ! return false; } ! else ! { ! return false; ! } ! sndHandle = soundmanager->GetSoundResource(soundName); if (!sndHandle) { --- 227,242 ---- bool psEffectObjSound::PostSetup() { ! soundmanager = CS_QUERY_REGISTRY(psCSSetup::object_reg, iSoundManager); if ( soundmanager ) { ! if ( !soundmanager->Setup() ) ! return false; } ! else ! { ! return false; ! } ! sndHandle = soundmanager->GetSoundResource(soundName); if (!sndHandle) { Index: pseffectobjspire.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/common/effects/pseffectobjspire.cpp,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** pseffectobjspire.cpp 16 Feb 2005 02:43:25 -0000 1.13 --- pseffectobjspire.cpp 18 Mar 2005 14:02:50 -0000 1.14 *************** *** 102,109 **** objUp = up; csReversibleTransform rt; ! rt.LookAt(up, csVector3(0,2,1)); matUp = rt.GetT2O(); matBase = matUp; ! // common flags mesh->GetFlags().Set(CS_ENTITY_NOHITBEAM); --- 102,109 ---- objUp = up; csReversibleTransform rt; ! rt.LookAt(csVector3(up.x, up.z, up.y), csVector3(0,2,1)); matUp = rt.GetT2O(); matBase = matUp; ! // common flags mesh->GetFlags().Set(CS_ENTITY_NOHITBEAM); *************** *** 231,236 **** float sinCurr = (float)sin(currAng); ! csVector3 polyTopPos1 = csVector3(cosCurr, sinCurr, 0) * topScale + csVector3(0, 0, height); ! csVector3 polyPos1 = csVector3(cosCurr, sinCurr, 0); // add the vertex data --- 231,236 ---- float sinCurr = (float)sin(currAng); ! csVector3 polyTopPos1 = csVector3(cosCurr, 0, sinCurr) * topScale + csVector3(0, height, 0); ! csVector3 polyPos1 = csVector3(cosCurr, 0, sinCurr); // add the vertex data *************** *** 258,265 **** float sinCurr = (float)sin(currAng); ! csVector3 polyPos1 = csVector3(cosCurr, sinCurr, 0); ! csVector3 polyTopPos1 = csVector3(cosCurr, sinCurr, 0) * topScale + csVector3(0, 0, height); ! csVector3 polyPos2 = -csVector3(cosCurr, sinCurr, 0); ! csVector3 polyTopPos2 = -csVector3(cosCurr, sinCurr, 0) * topScale + csVector3(0, 0, height); // add the vertex data --- 258,265 ---- float sinCurr = (float)sin(currAng); ! csVector3 polyPos1 = csVector3(cosCurr, 0, sinCurr); ! csVector3 polyTopPos1 = csVector3(cosCurr, 0, sinCurr) * topScale + csVector3(0, height, 0); ! csVector3 polyPos2 = -csVector3(cosCurr, 0, sinCurr); ! csVector3 polyTopPos2 = -csVector3(cosCurr, 0, sinCurr) * topScale + csVector3(0, height, 0); // add the vertex data *************** *** 276,283 **** // normals ! facState->SetNormal(a, b*4, csVector3(cosCurr, sinCurr, 0)); ! facState->SetNormal(a, b*4+1, csVector3(-cosCurr, -sinCurr, 0)); ! facState->SetNormal(a, b*4+2, csVector3(-cosCurr, -sinCurr, 0)); ! facState->SetNormal(a, b*4+3, csVector3(cosCurr, sinCurr, 0)); } break; --- 276,283 ---- // normals ! facState->SetNormal(a, b*4, csVector3(cosCurr, 0, sinCurr)); ! facState->SetNormal(a, b*4+1, csVector3(-cosCurr, 0, -sinCurr)); ! facState->SetNormal(a, b*4+2, csVector3(-cosCurr, 0, -sinCurr)); ! facState->SetNormal(a, b*4+3, csVector3(cosCurr, 0, sinCurr)); } break; *************** *** 298,305 **** float sinMid = (float)sin(midAng); ! csVector3 polyTopPos1 = csVector3(cosCurr, sinCurr, 0) * topScale + csVector3(0, 0, height); ! csVector3 polyPos1 = csVector3(cosCurr, sinCurr, 0); ! csVector3 polyTopPos2 = csVector3(cosMid, sinMid, 0) * topScale * 0.5f + csVector3(0, 0, height); ! csVector3 polyPos2 = csVector3(cosMid, sinMid, 0) * 0.5f; // add the vertex data --- 298,305 ---- float sinMid = (float)sin(midAng); ! csVector3 polyTopPos1 = csVector3(cosCurr, 0, sinCurr) * topScale + csVector3(0, height, 0); ! csVector3 polyPos1 = csVector3(cosCurr, 0, sinCurr); ! csVector3 polyTopPos2 = csVector3(cosMid, 0, sinMid) * topScale * 0.5f + csVector3(0, height, 0); ! csVector3 polyPos2 = csVector3(cosMid, 0, sinMid) * 0.5f; // add the vertex data *************** *** 351,363 **** for (int b=0; b<segments; ++b) { ! csVector3 polyPos1 = csVector3(-1 /2.0f, -1 /2.0f, 0); ! csVector3 polyTopPos1 = csVector3(-topScale /2.0f, -topScale /2.0f, 0) + csVector3(0, 0, height); ! csVector3 polyPos2 = csVector3( 1 /2.0f, 1 /2.0f, 0); ! csVector3 polyTopPos2 = csVector3( topScale /2.0f, topScale /2.0f, 0) + csVector3(0, 0, height); ! polyPos1 += basePoint + csVector3(0, 0, padding*b); ! polyTopPos1 += basePoint + csVector3(0, 0, padding*b); ! polyPos2 += basePoint + csVector3(0, 0, padding*b); ! polyTopPos2 += basePoint + csVector3(0, 0, padding*b); // add the vertex data --- 351,363 ---- for (int b=0; b<segments; ++b) { ! csVector3 polyPos1 = csVector3(-1 /2.0f, 0, -1 /2.0f); ! csVector3 polyTopPos1 = csVector3(-topScale /2.0f, 0, -topScale /2.0f) + csVector3(0, height, 0); ! csVector3 polyPos2 = csVector3( 1 /2.0f, 0, 1 /2.0f); ! csVector3 polyTopPos2 = csVector3( topScale /2.0f, 0, topScale /2.0f) + csVector3(0, height, 0); ! polyPos1 += basePoint + csVector3(0, padding*b, 0); ! polyTopPos1 += basePoint + csVector3(0, padding*b, 0); ! polyPos2 += basePoint + csVector3(0, padding*b, 0); ! polyTopPos2 += basePoint + csVector3(0, padding*b, 0); // add the vertex data *************** *** 374,381 **** // normals ! facState->SetNormal(a, b*4, csVector3(0, 0, -1)); ! facState->SetNormal(a, b*4+1, csVector3(0, 0, -1)); ! facState->SetNormal(a, b*4+2, csVector3(0, 0, -1)); ! facState->SetNormal(a, b*4+3, csVector3(0, 0, -1)); } break; --- 374,381 ---- // normals ! facState->SetNormal(a, b*4, csVector3(0, -1, 0)); ! facState->SetNormal(a, b*4+1, csVector3(0, -1, 0)); ! facState->SetNormal(a, b*4+2, csVector3(0, -1, 0)); ! facState->SetNormal(a, b*4+3, csVector3(0, -1, 0)); } break; |