mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-06-24 03:11:39 +00:00
Remove the NIF loader and code to manually transform the vertices
This currently breaks just about everything. They should come back as it's all reimplemented, though.
This commit is contained in:
parent
9995dff943
commit
386ac56bda
13 changed files with 873 additions and 2615 deletions
|
@ -75,11 +75,8 @@ void OMW::Engine::executeLocalScripts()
|
||||||
localScripts.setIgnore (MWWorld::Ptr());
|
localScripts.setIgnore (MWWorld::Ptr());
|
||||||
}
|
}
|
||||||
|
|
||||||
void OMW::Engine::setAnimationVerbose(bool animverbose){
|
void OMW::Engine::setAnimationVerbose(bool animverbose)
|
||||||
if(animverbose){
|
{
|
||||||
NifOgre::NIFLoader::getSingletonPtr()->setOutputAnimFiles(true);
|
|
||||||
NifOgre::NIFLoader::getSingletonPtr()->setVerbosePath(mCfgMgr.getLogPath().string());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool OMW::Engine::frameRenderingQueued (const Ogre::FrameEvent& evt)
|
bool OMW::Engine::frameRenderingQueued (const Ogre::FrameEvent& evt)
|
||||||
|
|
|
@ -7,12 +7,12 @@
|
||||||
#include <OgreSubMesh.h>
|
#include <OgreSubMesh.h>
|
||||||
|
|
||||||
namespace MWRender {
|
namespace MWRender {
|
||||||
|
|
||||||
std::map<std::string, int> Animation::mUniqueIDs;
|
std::map<std::string, int> Animation::mUniqueIDs;
|
||||||
|
|
||||||
Animation::Animation(OEngine::Render::OgreRenderer& _rend)
|
Animation::Animation(OEngine::Render::OgreRenderer& _rend)
|
||||||
: insert(NULL)
|
: insert(NULL)
|
||||||
, mRend(_rend)
|
, mRend(_rend)
|
||||||
, vecRotPos()
|
|
||||||
, time(0.0f)
|
, time(0.0f)
|
||||||
, startTime(0.0f)
|
, startTime(0.0f)
|
||||||
, stopTime(0.0f)
|
, stopTime(0.0f)
|
||||||
|
@ -21,7 +21,6 @@ namespace MWRender{
|
||||||
, tindexI()
|
, tindexI()
|
||||||
, shapeNumber(0)
|
, shapeNumber(0)
|
||||||
, shapeIndexI()
|
, shapeIndexI()
|
||||||
, shapes(NULL)
|
|
||||||
, transformations(NULL)
|
, transformations(NULL)
|
||||||
, textmappings(NULL)
|
, textmappings(NULL)
|
||||||
, base(NULL)
|
, base(NULL)
|
||||||
|
@ -32,85 +31,72 @@ namespace MWRender{
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Animation::getUniqueID(std::string mesh){
|
void Animation::startScript(std::string groupname, int mode, int loops)
|
||||||
int counter;
|
{
|
||||||
std::string copy = mesh;
|
|
||||||
std::transform(copy.begin(), copy.end(), copy.begin(), ::tolower);
|
|
||||||
if(mUniqueIDs.find(copy) == mUniqueIDs.end()){
|
|
||||||
counter = mUniqueIDs[copy] = 0;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
mUniqueIDs[copy] = mUniqueIDs[copy] + 1;
|
|
||||||
counter = mUniqueIDs[copy];
|
|
||||||
}
|
|
||||||
|
|
||||||
std::stringstream out;
|
|
||||||
if(counter > 99 && counter < 1000)
|
|
||||||
out << "0";
|
|
||||||
else if(counter > 9)
|
|
||||||
out << "00";
|
|
||||||
else
|
|
||||||
out << "000";
|
|
||||||
out << counter;
|
|
||||||
return out.str();
|
|
||||||
}
|
|
||||||
void Animation::startScript(std::string groupname, int mode, int loops){
|
|
||||||
//If groupname is recognized set animate to true
|
//If groupname is recognized set animate to true
|
||||||
//Set the start time and stop time
|
//Set the start time and stop time
|
||||||
//How many times to loop
|
//How many times to loop
|
||||||
if(groupname == "all"){
|
if(groupname == "all")
|
||||||
|
{
|
||||||
animate = loops;
|
animate = loops;
|
||||||
time = startTime;
|
time = startTime;
|
||||||
}
|
}
|
||||||
else if(textmappings){
|
else if(textmappings)
|
||||||
|
{
|
||||||
std::string startName = groupname + ": loop start";
|
std::string startName = groupname + ": loop start";
|
||||||
std::string stopName = groupname + ": loop stop";
|
std::string stopName = groupname + ": loop stop";
|
||||||
|
|
||||||
bool first = false;
|
bool first = false;
|
||||||
|
|
||||||
if(loops > 1){
|
if(loops > 1)
|
||||||
|
{
|
||||||
startName = groupname + ": loop start";
|
startName = groupname + ": loop start";
|
||||||
stopName = groupname + ": loop stop";
|
stopName = groupname + ": loop stop";
|
||||||
|
|
||||||
for(std::map<std::string, float>::iterator iter = textmappings->begin(); iter != textmappings->end(); iter++){
|
for(std::map<std::string, float>::iterator iter = textmappings->begin(); iter != textmappings->end(); iter++)
|
||||||
|
{
|
||||||
std::string current = iter->first.substr(0, startName.size());
|
std::string current = iter->first.substr(0, startName.size());
|
||||||
std::transform(current.begin(), current.end(), current.begin(), ::tolower);
|
std::transform(current.begin(), current.end(), current.begin(), ::tolower);
|
||||||
std::string current2 = iter->first.substr(0, stopName.size());
|
std::string current2 = iter->first.substr(0, stopName.size());
|
||||||
std::transform(current2.begin(), current2.end(), current2.begin(), ::tolower);
|
std::transform(current2.begin(), current2.end(), current2.begin(), ::tolower);
|
||||||
|
|
||||||
if(current == startName){
|
if(current == startName)
|
||||||
|
{
|
||||||
startTime = iter->second;
|
startTime = iter->second;
|
||||||
animate = loops;
|
animate = loops;
|
||||||
time = startTime;
|
time = startTime;
|
||||||
first = true;
|
first = true;
|
||||||
}
|
}
|
||||||
if(current2 == stopName){
|
if(current2 == stopName)
|
||||||
|
{
|
||||||
stopTime = iter->second;
|
stopTime = iter->second;
|
||||||
if(first)
|
if(first)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!first){
|
|
||||||
|
if(!first)
|
||||||
|
{
|
||||||
startName = groupname + ": start";
|
startName = groupname + ": start";
|
||||||
stopName = groupname + ": stop";
|
stopName = groupname + ": stop";
|
||||||
|
|
||||||
for(std::map<std::string, float>::iterator iter = textmappings->begin(); iter != textmappings->end(); iter++){
|
for(std::map<std::string, float>::iterator iter = textmappings->begin(); iter != textmappings->end(); iter++)
|
||||||
|
{
|
||||||
std::string current = iter->first.substr(0, startName.size());
|
std::string current = iter->first.substr(0, startName.size());
|
||||||
std::transform(current.begin(), current.end(), current.begin(), ::tolower);
|
std::transform(current.begin(), current.end(), current.begin(), ::tolower);
|
||||||
std::string current2 = iter->first.substr(0, stopName.size());
|
std::string current2 = iter->first.substr(0, stopName.size());
|
||||||
std::transform(current2.begin(), current2.end(), current2.begin(), ::tolower);
|
std::transform(current2.begin(), current2.end(), current2.begin(), ::tolower);
|
||||||
|
|
||||||
if(current == startName){
|
if(current == startName)
|
||||||
|
{
|
||||||
startTime = iter->second;
|
startTime = iter->second;
|
||||||
animate = loops;
|
animate = loops;
|
||||||
time = startTime;
|
time = startTime;
|
||||||
first = true;
|
first = true;
|
||||||
}
|
}
|
||||||
if(current2 == stopName){
|
if(current2 == stopName)
|
||||||
|
{
|
||||||
stopTime = iter->second;
|
stopTime = iter->second;
|
||||||
if(first)
|
if(first)
|
||||||
break;
|
break;
|
||||||
|
@ -121,248 +107,20 @@ namespace MWRender{
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
void Animation::stopScript(){
|
|
||||||
|
|
||||||
|
void Animation::stopScript()
|
||||||
|
{
|
||||||
animate = 0;
|
animate = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Animation::handleShapes(std::vector<Nif::NiTriShapeCopy>* allshapes, Ogre::Entity* creaturemodel, Ogre::SkeletonInstance *skel){
|
|
||||||
shapeNumber = 0;
|
|
||||||
|
|
||||||
if (allshapes == NULL || creaturemodel == NULL || skel == NULL)
|
bool Animation::timeIndex(float time, const std::vector<float> ×, int &i, int &j, float &x)
|
||||||
{
|
{
|
||||||
return;
|
size_t count;
|
||||||
}
|
if((count=times.size()) == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
std::vector<Nif::NiTriShapeCopy>::iterator allshapesiter;
|
|
||||||
for(allshapesiter = allshapes->begin(); allshapesiter != allshapes->end(); allshapesiter++)
|
|
||||||
|
|
||||||
{
|
|
||||||
//std::map<unsigned short, PosAndRot> vecPosRot;
|
|
||||||
|
|
||||||
Nif::NiTriShapeCopy& copy = *allshapesiter;
|
|
||||||
std::vector<Ogre::Vector3>* allvertices = ©.vertices;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//std::set<unsigned int> vertices;
|
|
||||||
//std::set<unsigned int> normals;
|
|
||||||
//std::vector<Nif::NiSkinData::BoneInfoCopy> boneinfovector = copy.boneinfo;
|
|
||||||
std::map<int, std::vector<Nif::NiSkinData::IndividualWeight> >* verticesToChange = ©.vertsToWeights;
|
|
||||||
|
|
||||||
//std::cout << "Name " << copy.sname << "\n";
|
|
||||||
Ogre::HardwareVertexBufferSharedPtr vbuf = creaturemodel->getMesh()->getSubMesh(copy.sname)->vertexData->vertexBufferBinding->getBuffer(0);
|
|
||||||
Ogre::Real* pReal = static_cast<Ogre::Real*>(vbuf->lock(Ogre::HardwareBuffer::HBL_NORMAL));
|
|
||||||
|
|
||||||
|
|
||||||
std::vector<Ogre::Vector3> initialVertices = copy.morph.getInitialVertices();
|
|
||||||
//Each shape has multiple indices
|
|
||||||
if(initialVertices.size() )
|
|
||||||
{
|
|
||||||
|
|
||||||
if(copy.vertices.size() == initialVertices.size())
|
|
||||||
{
|
|
||||||
//Create if it doesn't already exist
|
|
||||||
if(shapeIndexI.size() == static_cast<std::size_t> (shapeNumber))
|
|
||||||
{
|
|
||||||
std::vector<int> vec;
|
|
||||||
shapeIndexI.push_back(vec);
|
|
||||||
}
|
|
||||||
if(time >= copy.morph.getStartTime() && time <= copy.morph.getStopTime()){
|
|
||||||
float x;
|
|
||||||
for (unsigned int i = 0; i < copy.morph.getAdditionalVertices().size(); i++){
|
|
||||||
int j = 0;
|
|
||||||
if(shapeIndexI[shapeNumber].size() <= i)
|
|
||||||
shapeIndexI[shapeNumber].push_back(0);
|
|
||||||
|
|
||||||
|
|
||||||
if(timeIndex(time,copy.morph.getRelevantTimes()[i],(shapeIndexI[shapeNumber])[i], j, x)){
|
|
||||||
int indexI = (shapeIndexI[shapeNumber])[i];
|
|
||||||
std::vector<Ogre::Vector3> relevantData = (copy.morph.getRelevantData()[i]);
|
|
||||||
float v1 = relevantData[indexI].x;
|
|
||||||
float v2 = relevantData[j].x;
|
|
||||||
float t = v1 + (v2 - v1) * x;
|
|
||||||
if ( t < 0 ) t = 0;
|
|
||||||
if ( t > 1 ) t = 1;
|
|
||||||
if( t != 0 && initialVertices.size() == copy.morph.getAdditionalVertices()[i].size())
|
|
||||||
{
|
|
||||||
for (unsigned int v = 0; v < initialVertices.size(); v++){
|
|
||||||
initialVertices[v] += ((copy.morph.getAdditionalVertices()[i])[v]) * t;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
allvertices = &initialVertices;
|
|
||||||
}
|
|
||||||
shapeNumber++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if(verticesToChange->size() > 0){
|
|
||||||
|
|
||||||
for(std::map<int, std::vector<Nif::NiSkinData::IndividualWeight> >::iterator iter = verticesToChange->begin();
|
|
||||||
iter != verticesToChange->end(); iter++)
|
|
||||||
{
|
|
||||||
std::vector<Nif::NiSkinData::IndividualWeight> inds = iter->second;
|
|
||||||
int verIndex = iter->first;
|
|
||||||
Ogre::Vector3 currentVertex = (*allvertices)[verIndex];
|
|
||||||
Nif::NiSkinData::BoneInfoCopy* boneinfocopy = &(allshapesiter->boneinfo[inds[0].boneinfocopyindex]);
|
|
||||||
Ogre::Bone *bonePtr = 0;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Ogre::Vector3 vecPos;
|
|
||||||
Ogre::Quaternion vecRot;
|
|
||||||
std::map<Nif::NiSkinData::BoneInfoCopy*, PosAndRot>::iterator result = vecRotPos.find(boneinfocopy);
|
|
||||||
|
|
||||||
if(result == vecRotPos.end()){
|
|
||||||
bonePtr = skel->getBone(boneinfocopy->bonename);
|
|
||||||
|
|
||||||
vecPos = bonePtr->_getDerivedPosition() + bonePtr->_getDerivedOrientation() * boneinfocopy->trafo.trans;
|
|
||||||
vecRot = bonePtr->_getDerivedOrientation() * boneinfocopy->trafo.rotation;
|
|
||||||
|
|
||||||
|
|
||||||
PosAndRot both;
|
|
||||||
both.vecPos = vecPos;
|
|
||||||
both.vecRot = vecRot;
|
|
||||||
vecRotPos[boneinfocopy] = both;
|
|
||||||
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
PosAndRot both = result->second;
|
|
||||||
vecPos = both.vecPos;
|
|
||||||
vecRot = both.vecRot;
|
|
||||||
}
|
|
||||||
|
|
||||||
Ogre::Vector3 absVertPos = (vecPos + vecRot * currentVertex) * inds[0].weight;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for(std::size_t i = 1; i < inds.size(); i++){
|
|
||||||
boneinfocopy = &(allshapesiter->boneinfo[inds[i].boneinfocopyindex]);
|
|
||||||
result = vecRotPos.find(boneinfocopy);
|
|
||||||
|
|
||||||
|
|
||||||
if(result == vecRotPos.end()){
|
|
||||||
bonePtr = skel->getBone(boneinfocopy->bonename);
|
|
||||||
vecPos = bonePtr->_getDerivedPosition() + bonePtr->_getDerivedOrientation() * boneinfocopy->trafo.trans;
|
|
||||||
vecRot = bonePtr->_getDerivedOrientation() * boneinfocopy->trafo.rotation;
|
|
||||||
|
|
||||||
PosAndRot both;
|
|
||||||
both.vecPos = vecPos;
|
|
||||||
both.vecRot = vecRot;
|
|
||||||
vecRotPos[boneinfocopy] = both;
|
|
||||||
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
PosAndRot both = result->second;
|
|
||||||
vecPos = both.vecPos;
|
|
||||||
vecRot = both.vecRot;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
absVertPos += (vecPos + vecRot * currentVertex) * inds[i].weight;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
Ogre::Real* addr = (pReal + 3 * verIndex);
|
|
||||||
*addr = absVertPos.x;
|
|
||||||
*(addr+1) = absVertPos.y;
|
|
||||||
*(addr+2) = absVertPos.z;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//Ogre::Bone *bonePtr = creaturemodel->getSkeleton()->getBone(copy.bonename);
|
|
||||||
Ogre::Quaternion shaperot = copy.trafo.rotation;
|
|
||||||
Ogre::Vector3 shapetrans = copy.trafo.trans;
|
|
||||||
float shapescale = copy.trafo.scale;
|
|
||||||
std::vector<std::string> boneSequence = copy.boneSequence;
|
|
||||||
|
|
||||||
Ogre::Vector3 transmult;
|
|
||||||
Ogre::Quaternion rotmult;
|
|
||||||
float scale;
|
|
||||||
if(boneSequence.size() > 0){
|
|
||||||
std::vector<std::string>::iterator boneSequenceIter = boneSequence.begin();
|
|
||||||
if(skel->hasBone(*boneSequenceIter)){
|
|
||||||
Ogre::Bone *bonePtr = skel->getBone(*boneSequenceIter);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
transmult = bonePtr->getPosition();
|
|
||||||
rotmult = bonePtr->getOrientation();
|
|
||||||
scale = bonePtr->getScale().x;
|
|
||||||
boneSequenceIter++;
|
|
||||||
|
|
||||||
for(; boneSequenceIter != boneSequence.end(); boneSequenceIter++)
|
|
||||||
{
|
|
||||||
if(skel->hasBone(*boneSequenceIter)){
|
|
||||||
Ogre::Bone *bonePtr = skel->getBone(*boneSequenceIter);
|
|
||||||
// Computes C = B + AxC*scale
|
|
||||||
transmult = transmult + rotmult * bonePtr->getPosition();
|
|
||||||
rotmult = rotmult * bonePtr->getOrientation();
|
|
||||||
scale = scale * bonePtr->getScale().x;
|
|
||||||
}
|
|
||||||
//std::cout << "Bone:" << *boneSequenceIter << " ";
|
|
||||||
}
|
|
||||||
transmult = transmult + rotmult * shapetrans;
|
|
||||||
rotmult = rotmult * shaperot;
|
|
||||||
scale = shapescale * scale;
|
|
||||||
|
|
||||||
//std::cout << "Position: " << transmult << "Rotation: " << rotmult << "\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
transmult = shapetrans;
|
|
||||||
rotmult = shaperot;
|
|
||||||
scale = shapescale;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Computes C = B + AxC*scale
|
|
||||||
// final_vector = old_vector + old_rotation*new_vector*old_scale/
|
|
||||||
|
|
||||||
for(unsigned int i = 0; i < allvertices->size(); i++){
|
|
||||||
Ogre::Vector3 current = transmult + rotmult * (*allvertices)[i];
|
|
||||||
Ogre::Real* addr = pReal + i * 3;
|
|
||||||
*addr = current.x;
|
|
||||||
*(addr+1) = current.y;
|
|
||||||
*(addr + 2) = current.z;
|
|
||||||
|
|
||||||
}/*
|
|
||||||
for(int i = 0; i < allnormals.size(); i++){
|
|
||||||
Ogre::Vector3 current =rotmult * allnormals[i];
|
|
||||||
Ogre::Real* addr = pRealNormal + i * 3;
|
|
||||||
*addr = current.x;
|
|
||||||
*(addr+1) = current.y;
|
|
||||||
*(addr + 2) = current.z;
|
|
||||||
|
|
||||||
}*/
|
|
||||||
|
|
||||||
}
|
|
||||||
vbuf->unlock();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
bool Animation::timeIndex( float time, const std::vector<float> & times, int & i, int & j, float & x ){
|
|
||||||
int count;
|
|
||||||
if ( (count = times.size()) > 0 )
|
|
||||||
{
|
|
||||||
if(time <= times[0])
|
if(time <= times[0])
|
||||||
{
|
{
|
||||||
i = j = 0;
|
i = j = 0;
|
||||||
|
@ -376,7 +134,7 @@ namespace MWRender{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( i < 0 || i >= count )
|
if(i < 0 || (size_t)i >= count)
|
||||||
i = 0;
|
i = 0;
|
||||||
|
|
||||||
float tI = times[i];
|
float tI = times[i];
|
||||||
|
@ -392,7 +150,8 @@ namespace MWRender{
|
||||||
x = (time-tI) / (tJ-tI);
|
x = (time-tI) / (tJ-tI);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if ( time < tI )
|
|
||||||
|
if(time < tI)
|
||||||
{
|
{
|
||||||
j = i - 1;
|
j = i - 1;
|
||||||
float tJ;
|
float tJ;
|
||||||
|
@ -404,24 +163,16 @@ namespace MWRender{
|
||||||
x = (time-tI) / (tJ-tI);
|
x = (time-tI) / (tJ-tI);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
j = i;
|
j = i;
|
||||||
x = 0.0;
|
x = 0.0;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void Animation::handleAnimationTransforms(){
|
|
||||||
|
|
||||||
|
|
||||||
|
void Animation::handleAnimationTransforms()
|
||||||
|
{
|
||||||
Ogre::SkeletonInstance* skel = base->getSkeleton();
|
Ogre::SkeletonInstance* skel = base->getSkeleton();
|
||||||
|
|
||||||
|
|
||||||
Ogre::Bone* b = skel->getRootBone();
|
Ogre::Bone* b = skel->getRootBone();
|
||||||
b->setOrientation(Ogre::Real(.3),Ogre::Real(.3),Ogre::Real(.3), Ogre::Real(.3)); //This is a trick
|
b->setOrientation(Ogre::Real(.3),Ogre::Real(.3),Ogre::Real(.3), Ogre::Real(.3)); //This is a trick
|
||||||
|
|
||||||
|
@ -432,13 +183,12 @@ namespace MWRender{
|
||||||
//base->_updateAnimation();
|
//base->_updateAnimation();
|
||||||
//base->_notifyMoved();
|
//base->_notifyMoved();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
std::vector<Nif::NiKeyframeData>::iterator iter;
|
std::vector<Nif::NiKeyframeData>::iterator iter;
|
||||||
int slot = 0;
|
int slot = 0;
|
||||||
if(transformations){
|
if(transformations)
|
||||||
for(iter = transformations->begin(); iter != transformations->end(); iter++){
|
{
|
||||||
|
for(iter = transformations->begin(); iter != transformations->end(); iter++)
|
||||||
|
{
|
||||||
if(time < iter->getStartTime() || time < startTime || time > iter->getStopTime())
|
if(time < iter->getStartTime() || time < startTime || time > iter->getStopTime())
|
||||||
{
|
{
|
||||||
slot++;
|
slot++;
|
||||||
|
@ -449,50 +199,38 @@ namespace MWRender{
|
||||||
float x2;
|
float x2;
|
||||||
|
|
||||||
const std::vector<Ogre::Quaternion> &quats = iter->getQuat();
|
const std::vector<Ogre::Quaternion> &quats = iter->getQuat();
|
||||||
|
|
||||||
const std::vector<float> &ttime = iter->gettTime();
|
const std::vector<float> &ttime = iter->gettTime();
|
||||||
|
|
||||||
|
|
||||||
const std::vector<float> &rtime = iter->getrTime();
|
const std::vector<float> &rtime = iter->getrTime();
|
||||||
int rindexJ = rindexI[slot];
|
|
||||||
|
|
||||||
timeIndex(time, rtime, rindexI[slot], rindexJ, x2);
|
|
||||||
int tindexJ = tindexI[slot];
|
|
||||||
|
|
||||||
|
|
||||||
const std::vector<Ogre::Vector3> &translist1 = iter->getTranslist1();
|
const std::vector<Ogre::Vector3> &translist1 = iter->getTranslist1();
|
||||||
|
|
||||||
|
int rindexJ = rindexI[slot];
|
||||||
|
timeIndex(time, rtime, rindexI[slot], rindexJ, x2);
|
||||||
|
|
||||||
|
int tindexJ = tindexI[slot];
|
||||||
timeIndex(time, ttime, tindexI[slot], tindexJ, x);
|
timeIndex(time, ttime, tindexI[slot], tindexJ, x);
|
||||||
|
|
||||||
Ogre::Vector3 t;
|
Ogre::Vector3 t;
|
||||||
Ogre::Quaternion r;
|
Ogre::Quaternion r;
|
||||||
|
|
||||||
bool bTrans = translist1.size() > 0;
|
bool bTrans = translist1.size() > 0;
|
||||||
|
|
||||||
|
|
||||||
bool bQuats = quats.size() > 0;
|
bool bQuats = quats.size() > 0;
|
||||||
|
if(skel->hasBone(iter->getBonename()))
|
||||||
if(skel->hasBone(iter->getBonename())){
|
{
|
||||||
Ogre::Bone* bone = skel->getBone(iter->getBonename());
|
Ogre::Bone* bone = skel->getBone(iter->getBonename());
|
||||||
if(bTrans){
|
if(bTrans)
|
||||||
|
{
|
||||||
Ogre::Vector3 v1 = translist1[tindexI[slot]];
|
Ogre::Vector3 v1 = translist1[tindexI[slot]];
|
||||||
Ogre::Vector3 v2 = translist1[tindexJ];
|
Ogre::Vector3 v2 = translist1[tindexJ];
|
||||||
t = (v1 + (v2 - v1) * x);
|
t = (v1 + (v2 - v1) * x);
|
||||||
bone->setPosition(t);
|
bone->setPosition(t);
|
||||||
|
|
||||||
}
|
}
|
||||||
if(bQuats){
|
if(bQuats)
|
||||||
|
{
|
||||||
r = Ogre::Quaternion::Slerp(x2, quats[rindexI[slot]], quats[rindexJ], true);
|
r = Ogre::Quaternion::Slerp(x2, quats[rindexI[slot]], quats[rindexJ], true);
|
||||||
bone->setOrientation(r);
|
bone->setOrientation(r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
slot++;
|
slot++;
|
||||||
}
|
}
|
||||||
skel->_updateTransforms();
|
skel->_updateTransforms();
|
||||||
|
|
|
@ -20,17 +20,11 @@ struct PosAndRot{
|
||||||
};
|
};
|
||||||
|
|
||||||
class Animation {
|
class Animation {
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Ogre::SceneNode* insert;
|
Ogre::SceneNode* insert;
|
||||||
OEngine::Render::OgreRenderer &mRend;
|
OEngine::Render::OgreRenderer &mRend;
|
||||||
std::map<Nif::NiSkinData::BoneInfoCopy*, PosAndRot> vecRotPos;
|
|
||||||
static std::map<std::string, int> mUniqueIDs;
|
static std::map<std::string, int> mUniqueIDs;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
float time;
|
float time;
|
||||||
float startTime;
|
float startTime;
|
||||||
float stopTime;
|
float stopTime;
|
||||||
|
@ -44,18 +38,11 @@ class Animation{
|
||||||
int shapeNumber;
|
int shapeNumber;
|
||||||
std::vector<std::vector<int> > shapeIndexI;
|
std::vector<std::vector<int> > shapeIndexI;
|
||||||
|
|
||||||
//Ogre::SkeletonInstance* skel;
|
|
||||||
std::vector<Nif::NiTriShapeCopy>* shapes; //All the NiTriShapeData for a creature
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
std::vector<Nif::NiKeyframeData>* transformations;
|
std::vector<Nif::NiKeyframeData>* transformations;
|
||||||
std::map<std::string,float>* textmappings;
|
std::map<std::string,float>* textmappings;
|
||||||
Ogre::Entity* base;
|
Ogre::Entity* base;
|
||||||
void handleShapes(std::vector<Nif::NiTriShapeCopy>* allshapes, Ogre::Entity* creaturemodel, Ogre::SkeletonInstance *skel);
|
|
||||||
void handleAnimationTransforms();
|
void handleAnimationTransforms();
|
||||||
bool timeIndex( float time, const std::vector<float> & times, int & i, int & j, float & x );
|
bool timeIndex( float time, const std::vector<float> & times, int & i, int & j, float & x );
|
||||||
std::string getUniqueID(std::string mesh);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Animation(OEngine::Render::OgreRenderer& _rend);
|
Animation(OEngine::Render::OgreRenderer& _rend);
|
||||||
|
@ -65,7 +52,7 @@ class Animation{
|
||||||
|
|
||||||
|
|
||||||
virtual ~Animation();
|
virtual ~Animation();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -12,20 +12,22 @@ using namespace Ogre;
|
||||||
using namespace NifOgre;
|
using namespace NifOgre;
|
||||||
namespace MWRender{
|
namespace MWRender{
|
||||||
|
|
||||||
CreatureAnimation::~CreatureAnimation(){
|
CreatureAnimation::~CreatureAnimation()
|
||||||
|
{
|
||||||
}
|
}
|
||||||
CreatureAnimation::CreatureAnimation(const MWWorld::Ptr& ptr, OEngine::Render::OgreRenderer& _rend): Animation(_rend){
|
|
||||||
|
CreatureAnimation::CreatureAnimation(const MWWorld::Ptr& ptr, OEngine::Render::OgreRenderer& _rend): Animation(_rend)
|
||||||
|
{
|
||||||
insert = ptr.getRefData().getBaseNode();
|
insert = ptr.getRefData().getBaseNode();
|
||||||
MWWorld::LiveCellRef<ESM::Creature> *ref =
|
MWWorld::LiveCellRef<ESM::Creature> *ref = ptr.get<ESM::Creature>();
|
||||||
ptr.get<ESM::Creature>();
|
|
||||||
|
|
||||||
assert (ref->base != NULL);
|
assert (ref->base != NULL);
|
||||||
if(!ref->base->model.empty()){
|
if(!ref->base->model.empty())
|
||||||
const std::string &mesh = "meshes\\" + ref->base->model;
|
{
|
||||||
std::string meshNumbered = mesh + getUniqueID(mesh) + ">|";
|
std::string mesh = "meshes\\" + ref->base->model;
|
||||||
NifOgre::NIFLoader::load(meshNumbered);
|
|
||||||
base = mRend.getScene()->createEntity(meshNumbered);
|
NifOgre::NIFLoader::load(mesh);
|
||||||
|
base = mRend.getScene()->createEntity(mesh);
|
||||||
base->setVisibilityFlags(RV_Actors);
|
base->setVisibilityFlags(RV_Actors);
|
||||||
|
|
||||||
bool transparent = false;
|
bool transparent = false;
|
||||||
|
@ -48,33 +50,22 @@ CreatureAnimation::CreatureAnimation(const MWWorld::Ptr& ptr, OEngine::Render::O
|
||||||
}
|
}
|
||||||
base->setRenderQueueGroup(transparent ? RQG_Alpha : RQG_Main);
|
base->setRenderQueueGroup(transparent ? RQG_Alpha : RQG_Main);
|
||||||
|
|
||||||
std::string meshZero = mesh + "0000>|";
|
|
||||||
|
|
||||||
if((transformations = (NIFLoader::getSingletonPtr())->getAnim(meshZero))){
|
|
||||||
|
|
||||||
for(std::size_t init = 0; init < transformations->size(); init++){
|
|
||||||
rindexI.push_back(0);
|
|
||||||
tindexI.push_back(0);
|
|
||||||
}
|
|
||||||
stopTime = transformations->begin()->getStopTime();
|
|
||||||
startTime = transformations->begin()->getStartTime();
|
|
||||||
shapes = (NIFLoader::getSingletonPtr())->getShapes(meshZero);
|
|
||||||
}
|
|
||||||
textmappings = NIFLoader::getSingletonPtr()->getTextIndices(meshZero);
|
|
||||||
insert->attachObject(base);
|
insert->attachObject(base);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CreatureAnimation::runAnimation(float timepassed){
|
void CreatureAnimation::runAnimation(float timepassed)
|
||||||
vecRotPos.clear();
|
{
|
||||||
if(animate > 0){
|
if(animate > 0)
|
||||||
|
{
|
||||||
//Add the amount of time passed to time
|
//Add the amount of time passed to time
|
||||||
|
|
||||||
//Handle the animation transforms dependent on time
|
//Handle the animation transforms dependent on time
|
||||||
|
|
||||||
//Handle the shapes dependent on animation transforms
|
//Handle the shapes dependent on animation transforms
|
||||||
time += timepassed;
|
time += timepassed;
|
||||||
if(time >= stopTime){
|
if(time >= stopTime)
|
||||||
|
{
|
||||||
animate--;
|
animate--;
|
||||||
//std::cout << "Stopping the animation\n";
|
//std::cout << "Stopping the animation\n";
|
||||||
if(animate == 0)
|
if(animate == 0)
|
||||||
|
@ -84,8 +75,7 @@ void CreatureAnimation::runAnimation(float timepassed){
|
||||||
}
|
}
|
||||||
|
|
||||||
handleAnimationTransforms();
|
handleAnimationTransforms();
|
||||||
handleShapes(shapes, base, base->getSkeleton());
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -13,13 +13,16 @@
|
||||||
|
|
||||||
using namespace Ogre;
|
using namespace Ogre;
|
||||||
using namespace NifOgre;
|
using namespace NifOgre;
|
||||||
namespace MWRender{
|
|
||||||
NpcAnimation::~NpcAnimation(){
|
|
||||||
|
|
||||||
|
namespace MWRender{
|
||||||
|
|
||||||
|
NpcAnimation::~NpcAnimation()
|
||||||
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NpcAnimation::NpcAnimation(const MWWorld::Ptr& ptr, OEngine::Render::OgreRenderer& _rend, MWWorld::InventoryStore& _inv): Animation(_rend), mStateID(-1), inv(_inv), timeToChange(0),
|
NpcAnimation::NpcAnimation(const MWWorld::Ptr& ptr, OEngine::Render::OgreRenderer& _rend, MWWorld::InventoryStore& _inv)
|
||||||
|
: Animation(_rend), mStateID(-1), inv(_inv), timeToChange(0),
|
||||||
robe(inv.end()), helmet(inv.end()), shirt(inv.end()),
|
robe(inv.end()), helmet(inv.end()), shirt(inv.end()),
|
||||||
cuirass(inv.end()), greaves(inv.end()),
|
cuirass(inv.end()), greaves(inv.end()),
|
||||||
leftpauldron(inv.end()), rightpauldron(inv.end()),
|
leftpauldron(inv.end()), rightpauldron(inv.end()),
|
||||||
|
@ -45,80 +48,41 @@ NpcAnimation::NpcAnimation(const MWWorld::Ptr& ptr, OEngine::Render::OgreRendere
|
||||||
lfoot(0),
|
lfoot(0),
|
||||||
rfoot(0)
|
rfoot(0)
|
||||||
{
|
{
|
||||||
MWWorld::LiveCellRef<ESM::NPC> *ref =
|
MWWorld::LiveCellRef<ESM::NPC> *ref = ptr.get<ESM::NPC>();
|
||||||
ptr.get<ESM::NPC>();
|
|
||||||
Ogre::Entity* blank = 0;
|
for (int init = 0; init < 27; init++)
|
||||||
std::vector<Nif::NiTriShapeCopy>* blankshape = 0;
|
{
|
||||||
zero = std::make_pair(blank, blankshape);
|
|
||||||
chest = std::make_pair(blank, blankshape);
|
|
||||||
tail = std::make_pair(blank, blankshape);
|
|
||||||
lFreeFoot = std::make_pair(blank, blankshape);
|
|
||||||
rFreeFoot = std::make_pair(blank, blankshape);
|
|
||||||
rhand = std::make_pair(blank, blankshape);
|
|
||||||
lhand = std::make_pair(blank, blankshape);
|
|
||||||
skirt = std::make_pair(blank, blankshape);
|
|
||||||
for (int init = 0; init < 27; init++){
|
|
||||||
partslots[init] = -1; //each slot is empty
|
partslots[init] = -1; //each slot is empty
|
||||||
partpriorities[init] = 0;
|
partpriorities[init] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ESMS::ESMStore &store = MWBase::Environment::get().getWorld()->getStore();
|
||||||
//Part selection on last character of the file string
|
const ESM::Race *race = store.races.find(ref->base->race);
|
||||||
// " Tri Chest
|
|
||||||
// * Tri Tail
|
|
||||||
// : Tri Left Foot
|
|
||||||
// < Tri Right Foot
|
|
||||||
// > Tri Left Hand
|
|
||||||
// ? Tri Right Hand
|
|
||||||
// | Normal
|
|
||||||
|
|
||||||
//Mirroring Parts on second to last character
|
|
||||||
//suffix == '*'
|
|
||||||
// vector = Ogre::Vector3(-1,1,1);
|
|
||||||
// suffix == '?'
|
|
||||||
// vector = Ogre::Vector3(1,-1,1);
|
|
||||||
// suffix == '<'
|
|
||||||
// vector = Ogre::Vector3(1,1,-1);
|
|
||||||
|
|
||||||
|
|
||||||
std::string hairID = ref->base->hair;
|
std::string hairID = ref->base->hair;
|
||||||
std::string headID = ref->base->head;
|
std::string headID = ref->base->head;
|
||||||
headModel = "meshes\\" +
|
headModel = "meshes\\" + store.bodyParts.find(headID)->model;
|
||||||
MWBase::Environment::get().getWorld()->getStore().bodyParts.find(headID)->model;
|
hairModel = "meshes\\" + store.bodyParts.find(hairID)->model;
|
||||||
|
|
||||||
hairModel = "meshes\\" +
|
|
||||||
MWBase::Environment::get().getWorld()->getStore().bodyParts.find(hairID)->model;
|
|
||||||
npcName = ref->base->name;
|
npcName = ref->base->name;
|
||||||
|
|
||||||
//ESMStore::Races r =
|
isFemale = !!(ref->base->flags&ESM::NPC::Female);
|
||||||
const ESM::Race* race = MWBase::Environment::get().getWorld()->getStore().races.find(ref->base->race);
|
isBeast = !!(race->data.flags&ESM::Race::Beast);
|
||||||
|
|
||||||
|
bodyRaceID = "b_n_"+race->name;
|
||||||
bodyRaceID = headID.substr(0, headID.find_last_of("head_") - 4);
|
|
||||||
char secondtolast = bodyRaceID.at(bodyRaceID.length() - 2);
|
|
||||||
isFemale = tolower(secondtolast) == 'f';
|
|
||||||
std::transform(bodyRaceID.begin(), bodyRaceID.end(), bodyRaceID.begin(), ::tolower);
|
std::transform(bodyRaceID.begin(), bodyRaceID.end(), bodyRaceID.begin(), ::tolower);
|
||||||
isBeast = bodyRaceID == "b_n_khajiit_m_" || bodyRaceID == "b_n_khajiit_f_" || bodyRaceID == "b_n_argonian_m_" || bodyRaceID == "b_n_argonian_f_";
|
|
||||||
|
|
||||||
/*std::cout << "Race: " << ref->base->race ;
|
/*std::cout << "Race: " << ref->base->race ;
|
||||||
if(female){
|
if(female)
|
||||||
std::cout << " Sex: Female" << " Height: " << race->data.height.female << "\n";
|
std::cout << " Sex: Female" << " Height: " << race->data.height.female << "\n";
|
||||||
}
|
else
|
||||||
else{
|
|
||||||
std::cout << " Sex: Male" << " Height: " << race->data.height.male << "\n";
|
std::cout << " Sex: Male" << " Height: " << race->data.height.male << "\n";
|
||||||
}*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
std::string smodel = "meshes\\base_anim.nif";
|
|
||||||
if(isBeast)
|
|
||||||
smodel = "meshes\\base_animkna.nif";
|
|
||||||
|
|
||||||
insert = ptr.getRefData().getBaseNode();
|
insert = ptr.getRefData().getBaseNode();
|
||||||
assert(insert);
|
assert(insert);
|
||||||
|
|
||||||
|
std::string smodel = (!isBeast ? "meshes\\base_anim.nif" : "meshes\\base_animkna.nif");
|
||||||
NifOgre::NIFLoader::load(smodel);
|
NifOgre::NIFLoader::load(smodel);
|
||||||
|
|
||||||
base = mRend.getScene()->createEntity(smodel);
|
base = mRend.getScene()->createEntity(smodel);
|
||||||
|
|
||||||
base->setVisibilityFlags(RV_Actors);
|
base->setVisibilityFlags(RV_Actors);
|
||||||
|
@ -134,122 +98,105 @@ NpcAnimation::NpcAnimation(const MWWorld::Ptr& ptr, OEngine::Render::OgreRendere
|
||||||
while (passIt.hasMoreElements())
|
while (passIt.hasMoreElements())
|
||||||
{
|
{
|
||||||
Ogre::Pass* pass = passIt.getNext();
|
Ogre::Pass* pass = passIt.getNext();
|
||||||
|
|
||||||
if (pass->getDepthWriteEnabled() == false)
|
if (pass->getDepthWriteEnabled() == false)
|
||||||
transparent = true;
|
transparent = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
base->setRenderQueueGroup(transparent ? RQG_Alpha : RQG_Main);
|
base->setRenderQueueGroup(transparent ? RQG_Alpha : RQG_Main);
|
||||||
|
|
||||||
|
|
||||||
base->setSkipAnimationStateUpdate(true); //Magical line of code, this makes the bones
|
base->setSkipAnimationStateUpdate(true); //Magical line of code, this makes the bones
|
||||||
//stay in the same place when we skipanim, or open a gui window
|
//stay in the same place when we skipanim, or open a gui window
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if((transformations = (NIFLoader::getSingletonPtr())->getAnim(smodel))){
|
|
||||||
|
|
||||||
for(unsigned int init = 0; init < transformations->size(); init++){
|
|
||||||
rindexI.push_back(0);
|
|
||||||
tindexI.push_back(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
stopTime = transformations->begin()->getStopTime();
|
|
||||||
startTime = transformations->begin()->getStartTime();
|
|
||||||
}
|
|
||||||
textmappings = NIFLoader::getSingletonPtr()->getTextIndices(smodel);
|
|
||||||
insert->attachObject(base);
|
insert->attachObject(base);
|
||||||
|
|
||||||
|
|
||||||
if(isFemale)
|
if(isFemale)
|
||||||
insert->scale(race->data.height.female, race->data.height.female, race->data.height.female);
|
insert->scale(race->data.height.female, race->data.height.female, race->data.height.female);
|
||||||
else
|
else
|
||||||
insert->scale(race->data.height.male, race->data.height.male, race->data.height.male);
|
insert->scale(race->data.height.male, race->data.height.male, race->data.height.male);
|
||||||
updateParts();
|
|
||||||
|
|
||||||
|
updateParts();
|
||||||
}
|
}
|
||||||
|
|
||||||
void NpcAnimation::updateParts(){
|
void NpcAnimation::updateParts()
|
||||||
|
{
|
||||||
bool apparelChanged = false;
|
bool apparelChanged = false;
|
||||||
|
|
||||||
|
|
||||||
//inv.getSlot(MWWorld::InventoryStore::Slot_Robe);
|
//inv.getSlot(MWWorld::InventoryStore::Slot_Robe);
|
||||||
if(robe != inv.getSlot(MWWorld::InventoryStore::Slot_Robe)){
|
if(robe != inv.getSlot(MWWorld::InventoryStore::Slot_Robe))
|
||||||
|
{
|
||||||
// A robe was added or removed
|
// A robe was added or removed
|
||||||
removePartGroup(MWWorld::InventoryStore::Slot_Robe);
|
|
||||||
robe = inv.getSlot(MWWorld::InventoryStore::Slot_Robe);
|
robe = inv.getSlot(MWWorld::InventoryStore::Slot_Robe);
|
||||||
|
removePartGroup(MWWorld::InventoryStore::Slot_Robe);
|
||||||
apparelChanged = true;
|
apparelChanged = true;
|
||||||
}
|
}
|
||||||
if(skirtiter != inv.getSlot(MWWorld::InventoryStore::Slot_Skirt)){
|
if(skirtiter != inv.getSlot(MWWorld::InventoryStore::Slot_Skirt))
|
||||||
//A robe was added or removed
|
{
|
||||||
removePartGroup(MWWorld::InventoryStore::Slot_Skirt);
|
|
||||||
skirtiter = inv.getSlot(MWWorld::InventoryStore::Slot_Skirt);
|
skirtiter = inv.getSlot(MWWorld::InventoryStore::Slot_Skirt);
|
||||||
|
removePartGroup(MWWorld::InventoryStore::Slot_Skirt);
|
||||||
apparelChanged = true;
|
apparelChanged = true;
|
||||||
}
|
}
|
||||||
if(helmet != inv.getSlot(MWWorld::InventoryStore::Slot_Helmet)){
|
if(helmet != inv.getSlot(MWWorld::InventoryStore::Slot_Helmet))
|
||||||
apparelChanged = true;
|
{
|
||||||
helmet = inv.getSlot(MWWorld::InventoryStore::Slot_Helmet);
|
helmet = inv.getSlot(MWWorld::InventoryStore::Slot_Helmet);
|
||||||
removePartGroup(MWWorld::InventoryStore::Slot_Helmet);
|
removePartGroup(MWWorld::InventoryStore::Slot_Helmet);
|
||||||
|
apparelChanged = true;
|
||||||
}
|
}
|
||||||
if(cuirass != inv.getSlot(MWWorld::InventoryStore::Slot_Cuirass)){
|
if(cuirass != inv.getSlot(MWWorld::InventoryStore::Slot_Cuirass))
|
||||||
|
{
|
||||||
cuirass = inv.getSlot(MWWorld::InventoryStore::Slot_Cuirass);
|
cuirass = inv.getSlot(MWWorld::InventoryStore::Slot_Cuirass);
|
||||||
removePartGroup(MWWorld::InventoryStore::Slot_Cuirass);
|
removePartGroup(MWWorld::InventoryStore::Slot_Cuirass);
|
||||||
apparelChanged = true;
|
apparelChanged = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
if(greaves != inv.getSlot(MWWorld::InventoryStore::Slot_Greaves)){
|
if(greaves != inv.getSlot(MWWorld::InventoryStore::Slot_Greaves))
|
||||||
|
{
|
||||||
greaves = inv.getSlot(MWWorld::InventoryStore::Slot_Greaves);
|
greaves = inv.getSlot(MWWorld::InventoryStore::Slot_Greaves);
|
||||||
removePartGroup(MWWorld::InventoryStore::Slot_Greaves);
|
removePartGroup(MWWorld::InventoryStore::Slot_Greaves);
|
||||||
apparelChanged = true;
|
apparelChanged = true;
|
||||||
}
|
}
|
||||||
if(leftpauldron != inv.getSlot(MWWorld::InventoryStore::Slot_LeftPauldron)){
|
if(leftpauldron != inv.getSlot(MWWorld::InventoryStore::Slot_LeftPauldron))
|
||||||
|
{
|
||||||
leftpauldron = inv.getSlot(MWWorld::InventoryStore::Slot_LeftPauldron);
|
leftpauldron = inv.getSlot(MWWorld::InventoryStore::Slot_LeftPauldron);
|
||||||
removePartGroup(MWWorld::InventoryStore::Slot_LeftPauldron);
|
removePartGroup(MWWorld::InventoryStore::Slot_LeftPauldron);
|
||||||
apparelChanged = true;
|
apparelChanged = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
if(rightpauldron != inv.getSlot(MWWorld::InventoryStore::Slot_RightPauldron)){
|
if(rightpauldron != inv.getSlot(MWWorld::InventoryStore::Slot_RightPauldron))
|
||||||
|
{
|
||||||
rightpauldron = inv.getSlot(MWWorld::InventoryStore::Slot_RightPauldron);
|
rightpauldron = inv.getSlot(MWWorld::InventoryStore::Slot_RightPauldron);
|
||||||
removePartGroup(MWWorld::InventoryStore::Slot_RightPauldron);
|
removePartGroup(MWWorld::InventoryStore::Slot_RightPauldron);
|
||||||
apparelChanged = true;
|
apparelChanged = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
if(!isBeast && boots != inv.getSlot(MWWorld::InventoryStore::Slot_Boots)){
|
if(!isBeast && boots != inv.getSlot(MWWorld::InventoryStore::Slot_Boots))
|
||||||
|
{
|
||||||
boots = inv.getSlot(MWWorld::InventoryStore::Slot_Boots);
|
boots = inv.getSlot(MWWorld::InventoryStore::Slot_Boots);
|
||||||
removePartGroup(MWWorld::InventoryStore::Slot_Boots);
|
removePartGroup(MWWorld::InventoryStore::Slot_Boots);
|
||||||
apparelChanged = true;
|
apparelChanged = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
if(leftglove != inv.getSlot(MWWorld::InventoryStore::Slot_LeftGauntlet)){
|
if(leftglove != inv.getSlot(MWWorld::InventoryStore::Slot_LeftGauntlet))
|
||||||
|
{
|
||||||
leftglove = inv.getSlot(MWWorld::InventoryStore::Slot_LeftGauntlet);
|
leftglove = inv.getSlot(MWWorld::InventoryStore::Slot_LeftGauntlet);
|
||||||
removePartGroup(MWWorld::InventoryStore::Slot_LeftGauntlet);
|
removePartGroup(MWWorld::InventoryStore::Slot_LeftGauntlet);
|
||||||
apparelChanged = true;
|
apparelChanged = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
if(rightglove != inv.getSlot(MWWorld::InventoryStore::Slot_RightGauntlet)){
|
if(rightglove != inv.getSlot(MWWorld::InventoryStore::Slot_RightGauntlet))
|
||||||
|
{
|
||||||
rightglove = inv.getSlot(MWWorld::InventoryStore::Slot_RightGauntlet);
|
rightglove = inv.getSlot(MWWorld::InventoryStore::Slot_RightGauntlet);
|
||||||
removePartGroup(MWWorld::InventoryStore::Slot_RightGauntlet);
|
removePartGroup(MWWorld::InventoryStore::Slot_RightGauntlet);
|
||||||
apparelChanged = true;
|
apparelChanged = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
if(shirt != inv.getSlot(MWWorld::InventoryStore::Slot_Shirt)){
|
if(shirt != inv.getSlot(MWWorld::InventoryStore::Slot_Shirt))
|
||||||
|
{
|
||||||
shirt = inv.getSlot(MWWorld::InventoryStore::Slot_Shirt);
|
shirt = inv.getSlot(MWWorld::InventoryStore::Slot_Shirt);
|
||||||
removePartGroup(MWWorld::InventoryStore::Slot_Shirt);
|
removePartGroup(MWWorld::InventoryStore::Slot_Shirt);
|
||||||
apparelChanged = true;
|
apparelChanged = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
if(pants != inv.getSlot(MWWorld::InventoryStore::Slot_Pants)){
|
if(pants != inv.getSlot(MWWorld::InventoryStore::Slot_Pants))
|
||||||
|
{
|
||||||
pants = inv.getSlot(MWWorld::InventoryStore::Slot_Pants);
|
pants = inv.getSlot(MWWorld::InventoryStore::Slot_Pants);
|
||||||
removePartGroup(MWWorld::InventoryStore::Slot_Pants);
|
removePartGroup(MWWorld::InventoryStore::Slot_Pants);
|
||||||
apparelChanged = true;
|
apparelChanged = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(apparelChanged){
|
if(apparelChanged)
|
||||||
|
{
|
||||||
if(robe != inv.end())
|
if(robe != inv.end())
|
||||||
{
|
{
|
||||||
MWWorld::Ptr ptr = *robe;
|
MWWorld::Ptr ptr = *robe;
|
||||||
|
@ -282,40 +229,42 @@ void NpcAnimation::updateParts(){
|
||||||
reserveIndividualPart(ESM::PRT_LLeg, MWWorld::InventoryStore::Slot_Skirt, 4);
|
reserveIndividualPart(ESM::PRT_LLeg, MWWorld::InventoryStore::Slot_Skirt, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(helmet != inv.end()){
|
if(helmet != inv.end())
|
||||||
|
{
|
||||||
removeIndividualPart(ESM::PRT_Hair);
|
removeIndividualPart(ESM::PRT_Hair);
|
||||||
const ESM::Armor *armor = (helmet->get<ESM::Armor>())->base;
|
const ESM::Armor *armor = (helmet->get<ESM::Armor>())->base;
|
||||||
std::vector<ESM::PartReference> parts = armor->parts.parts;
|
std::vector<ESM::PartReference> parts = armor->parts.parts;
|
||||||
addPartGroup(MWWorld::InventoryStore::Slot_Helmet, 3, parts);
|
addPartGroup(MWWorld::InventoryStore::Slot_Helmet, 3, parts);
|
||||||
|
|
||||||
}
|
}
|
||||||
if(cuirass != inv.end()){
|
if(cuirass != inv.end())
|
||||||
|
{
|
||||||
const ESM::Armor *armor = (cuirass->get<ESM::Armor>())->base;
|
const ESM::Armor *armor = (cuirass->get<ESM::Armor>())->base;
|
||||||
std::vector<ESM::PartReference> parts = armor->parts.parts;
|
std::vector<ESM::PartReference> parts = armor->parts.parts;
|
||||||
addPartGroup(MWWorld::InventoryStore::Slot_Cuirass, 3, parts);
|
addPartGroup(MWWorld::InventoryStore::Slot_Cuirass, 3, parts);
|
||||||
|
|
||||||
}
|
}
|
||||||
if(greaves != inv.end()){
|
if(greaves != inv.end())
|
||||||
|
{
|
||||||
const ESM::Armor *armor = (greaves->get<ESM::Armor>())->base;
|
const ESM::Armor *armor = (greaves->get<ESM::Armor>())->base;
|
||||||
std::vector<ESM::PartReference> parts = armor->parts.parts;
|
std::vector<ESM::PartReference> parts = armor->parts.parts;
|
||||||
addPartGroup(MWWorld::InventoryStore::Slot_Greaves, 3, parts);
|
addPartGroup(MWWorld::InventoryStore::Slot_Greaves, 3, parts);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(leftpauldron != inv.end()){
|
if(leftpauldron != inv.end())
|
||||||
|
{
|
||||||
const ESM::Armor *armor = (leftpauldron->get<ESM::Armor>())->base;
|
const ESM::Armor *armor = (leftpauldron->get<ESM::Armor>())->base;
|
||||||
std::vector<ESM::PartReference> parts = armor->parts.parts;
|
std::vector<ESM::PartReference> parts = armor->parts.parts;
|
||||||
addPartGroup(MWWorld::InventoryStore::Slot_LeftPauldron, 3, parts);
|
addPartGroup(MWWorld::InventoryStore::Slot_LeftPauldron, 3, parts);
|
||||||
|
|
||||||
}
|
}
|
||||||
if(rightpauldron != inv.end()){
|
if(rightpauldron != inv.end())
|
||||||
|
{
|
||||||
const ESM::Armor *armor = (rightpauldron->get<ESM::Armor>())->base;
|
const ESM::Armor *armor = (rightpauldron->get<ESM::Armor>())->base;
|
||||||
std::vector<ESM::PartReference> parts = armor->parts.parts;
|
std::vector<ESM::PartReference> parts = armor->parts.parts;
|
||||||
addPartGroup(MWWorld::InventoryStore::Slot_RightPauldron, 3, parts);
|
addPartGroup(MWWorld::InventoryStore::Slot_RightPauldron, 3, parts);
|
||||||
|
|
||||||
}
|
}
|
||||||
if(!isBeast && boots != inv.end()){
|
if(!isBeast && boots != inv.end())
|
||||||
if(boots->getTypeName() == typeid(ESM::Clothing).name()){
|
{
|
||||||
|
if(boots->getTypeName() == typeid(ESM::Clothing).name())
|
||||||
|
{
|
||||||
const ESM::Clothing *clothes = (boots->get<ESM::Clothing>())->base;
|
const ESM::Clothing *clothes = (boots->get<ESM::Clothing>())->base;
|
||||||
std::vector<ESM::PartReference> parts = clothes->parts.parts;
|
std::vector<ESM::PartReference> parts = clothes->parts.parts;
|
||||||
addPartGroup(MWWorld::InventoryStore::Slot_Boots, 2, parts);
|
addPartGroup(MWWorld::InventoryStore::Slot_Boots, 2, parts);
|
||||||
|
@ -326,10 +275,11 @@ void NpcAnimation::updateParts(){
|
||||||
std::vector<ESM::PartReference> parts = armor->parts.parts;
|
std::vector<ESM::PartReference> parts = armor->parts.parts;
|
||||||
addPartGroup(MWWorld::InventoryStore::Slot_Boots, 3, parts);
|
addPartGroup(MWWorld::InventoryStore::Slot_Boots, 3, parts);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
if(leftglove != inv.end()){
|
if(leftglove != inv.end())
|
||||||
if(leftglove->getTypeName() == typeid(ESM::Clothing).name()){
|
{
|
||||||
|
if(leftglove->getTypeName() == typeid(ESM::Clothing).name())
|
||||||
|
{
|
||||||
const ESM::Clothing *clothes = (leftglove->get<ESM::Clothing>())->base;
|
const ESM::Clothing *clothes = (leftglove->get<ESM::Clothing>())->base;
|
||||||
std::vector<ESM::PartReference> parts = clothes->parts.parts;
|
std::vector<ESM::PartReference> parts = clothes->parts.parts;
|
||||||
addPartGroup(MWWorld::InventoryStore::Slot_LeftGauntlet, 2, parts);
|
addPartGroup(MWWorld::InventoryStore::Slot_LeftGauntlet, 2, parts);
|
||||||
|
@ -340,10 +290,11 @@ void NpcAnimation::updateParts(){
|
||||||
std::vector<ESM::PartReference> parts = armor->parts.parts;
|
std::vector<ESM::PartReference> parts = armor->parts.parts;
|
||||||
addPartGroup(MWWorld::InventoryStore::Slot_LeftGauntlet, 3, parts);
|
addPartGroup(MWWorld::InventoryStore::Slot_LeftGauntlet, 3, parts);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
if(rightglove != inv.end()){
|
if(rightglove != inv.end())
|
||||||
if(rightglove->getTypeName() == typeid(ESM::Clothing).name()){
|
{
|
||||||
|
if(rightglove->getTypeName() == typeid(ESM::Clothing).name())
|
||||||
|
{
|
||||||
const ESM::Clothing *clothes = (rightglove->get<ESM::Clothing>())->base;
|
const ESM::Clothing *clothes = (rightglove->get<ESM::Clothing>())->base;
|
||||||
std::vector<ESM::PartReference> parts = clothes->parts.parts;
|
std::vector<ESM::PartReference> parts = clothes->parts.parts;
|
||||||
addPartGroup(MWWorld::InventoryStore::Slot_RightGauntlet, 2, parts);
|
addPartGroup(MWWorld::InventoryStore::Slot_RightGauntlet, 2, parts);
|
||||||
|
@ -357,149 +308,80 @@ void NpcAnimation::updateParts(){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(shirt != inv.end()){
|
if(shirt != inv.end())
|
||||||
|
{
|
||||||
const ESM::Clothing *clothes = (shirt->get<ESM::Clothing>())->base;
|
const ESM::Clothing *clothes = (shirt->get<ESM::Clothing>())->base;
|
||||||
std::vector<ESM::PartReference> parts = clothes->parts.parts;
|
std::vector<ESM::PartReference> parts = clothes->parts.parts;
|
||||||
addPartGroup(MWWorld::InventoryStore::Slot_Shirt, 2, parts);
|
addPartGroup(MWWorld::InventoryStore::Slot_Shirt, 2, parts);
|
||||||
}
|
}
|
||||||
if(pants != inv.end()){
|
if(pants != inv.end())
|
||||||
|
{
|
||||||
const ESM::Clothing *clothes = (pants->get<ESM::Clothing>())->base;
|
const ESM::Clothing *clothes = (pants->get<ESM::Clothing>())->base;
|
||||||
std::vector<ESM::PartReference> parts = clothes->parts.parts;
|
std::vector<ESM::PartReference> parts = clothes->parts.parts;
|
||||||
addPartGroup(MWWorld::InventoryStore::Slot_Pants, 2, parts);
|
addPartGroup(MWWorld::InventoryStore::Slot_Pants, 2, parts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(partpriorities[ESM::PRT_Head] < 1){
|
if(partpriorities[ESM::PRT_Head] < 1)
|
||||||
addOrReplaceIndividualPart(ESM::PRT_Head, -1,1, headModel);
|
addOrReplaceIndividualPart(ESM::PRT_Head, -1,1, headModel);
|
||||||
}
|
if(partpriorities[ESM::PRT_Hair] < 1 && partpriorities[ESM::PRT_Head] <= 1)
|
||||||
if(partpriorities[ESM::PRT_Hair] < 1 && partpriorities[ESM::PRT_Head] <= 1){
|
|
||||||
addOrReplaceIndividualPart(ESM::PRT_Hair, -1,1, hairModel);
|
addOrReplaceIndividualPart(ESM::PRT_Hair, -1,1, hairModel);
|
||||||
|
|
||||||
|
static const struct {
|
||||||
|
ESM::PartReferenceType type;
|
||||||
|
const char name[2][12];
|
||||||
|
} PartTypeList[] = {
|
||||||
|
{ ESM::PRT_Neck, { "neck", "" } },
|
||||||
|
{ ESM::PRT_Cuirass, { "chest", "" } },
|
||||||
|
{ ESM::PRT_Groin, { "groin", "" } },
|
||||||
|
{ ESM::PRT_RHand, { "hand", "hands" } },
|
||||||
|
{ ESM::PRT_LHand, { "hand", "hands" } },
|
||||||
|
{ ESM::PRT_RWrist, { "wrist", "" } },
|
||||||
|
{ ESM::PRT_LWrist, { "wrist", "" } },
|
||||||
|
{ ESM::PRT_RForearm, { "forearm", "" } },
|
||||||
|
{ ESM::PRT_LForearm, { "forearm", "" } },
|
||||||
|
{ ESM::PRT_RUpperarm, { "upper arm", "" } },
|
||||||
|
{ ESM::PRT_LUpperarm, { "upper arm", "" } },
|
||||||
|
{ ESM::PRT_RFoot, { "foot", "feet" } },
|
||||||
|
{ ESM::PRT_LFoot, { "foot", "feet" } },
|
||||||
|
{ ESM::PRT_RAnkle, { "ankle", "" } },
|
||||||
|
{ ESM::PRT_LAnkle, { "ankle", "" } },
|
||||||
|
{ ESM::PRT_RKnee, { "knee", "" } },
|
||||||
|
{ ESM::PRT_LKnee, { "knee", "" } },
|
||||||
|
{ ESM::PRT_RLeg, { "upper leg", "" } },
|
||||||
|
{ ESM::PRT_LLeg, { "upper leg", "" } },
|
||||||
|
{ ESM::PRT_Tail, { "tail", "" } }
|
||||||
|
};
|
||||||
|
|
||||||
|
const ESMS::ESMStore &store = MWBase::Environment::get().getWorld()->getStore();
|
||||||
|
for(size_t i = 0;i < sizeof(PartTypeList)/sizeof(PartTypeList[0]);i++)
|
||||||
|
{
|
||||||
|
if(partpriorities[PartTypeList[i].type] < 1)
|
||||||
|
{
|
||||||
|
const ESM::BodyPart *part = NULL;
|
||||||
|
bool tryfemale = isFemale;
|
||||||
|
int ni = 0;
|
||||||
|
do {
|
||||||
|
part = store.bodyParts.search(bodyRaceID+(tryfemale?"_f_":"_m_")+PartTypeList[i].name[ni]);
|
||||||
|
if(part) break;
|
||||||
|
|
||||||
|
ni ^= 1;
|
||||||
|
if(ni == 0)
|
||||||
|
{
|
||||||
|
if(!tryfemale)
|
||||||
|
break;
|
||||||
|
tryfemale = false;
|
||||||
|
}
|
||||||
|
} while(1);
|
||||||
|
|
||||||
|
if(part)
|
||||||
|
addOrReplaceIndividualPart(PartTypeList[i].type, -1,1, "meshes\\"+part->model);
|
||||||
}
|
}
|
||||||
if(partpriorities[ESM::PRT_Neck] < 1){
|
|
||||||
const ESM::BodyPart *neckPart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search (bodyRaceID + "neck");
|
|
||||||
if(neckPart)
|
|
||||||
addOrReplaceIndividualPart(ESM::PRT_Neck, -1,1,"meshes\\" + neckPart->model);
|
|
||||||
}
|
}
|
||||||
if(partpriorities[ESM::PRT_Cuirass] < 1){
|
|
||||||
const ESM::BodyPart *chestPart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search (bodyRaceID + "chest");
|
|
||||||
if(chestPart)
|
|
||||||
addOrReplaceIndividualPart(ESM::PRT_Cuirass, -1,1,"meshes\\" + chestPart->model);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(partpriorities[ESM::PRT_Groin] < 1){
|
Ogre::Entity* NpcAnimation::insertBoundedPart(const std::string &mesh, const std::string &bonename)
|
||||||
const ESM::BodyPart *groinPart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search (bodyRaceID + "groin");
|
{
|
||||||
if(groinPart)
|
|
||||||
addOrReplaceIndividualPart(ESM::PRT_Groin, -1,1,"meshes\\" + groinPart->model);
|
|
||||||
}
|
|
||||||
if(partpriorities[ESM::PRT_RHand] < 1){
|
|
||||||
const ESM::BodyPart *handPart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search (bodyRaceID + "hand");
|
|
||||||
if(!handPart)
|
|
||||||
handPart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search (bodyRaceID + "hands");
|
|
||||||
if(handPart)
|
|
||||||
addOrReplaceIndividualPart(ESM::PRT_RHand, -1,1,"meshes\\" + handPart->model);
|
|
||||||
}
|
|
||||||
if(partpriorities[ESM::PRT_LHand] < 1){
|
|
||||||
const ESM::BodyPart *handPart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search (bodyRaceID + "hand");
|
|
||||||
if(!handPart)
|
|
||||||
handPart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search (bodyRaceID + "hands");
|
|
||||||
if(handPart)
|
|
||||||
addOrReplaceIndividualPart(ESM::PRT_LHand, -1,1,"meshes\\" + handPart->model);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(partpriorities[ESM::PRT_RWrist] < 1){
|
|
||||||
const ESM::BodyPart *wristPart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search (bodyRaceID + "wrist");
|
|
||||||
if(wristPart)
|
|
||||||
addOrReplaceIndividualPart(ESM::PRT_RWrist, -1,1,"meshes\\" + wristPart->model);
|
|
||||||
}
|
|
||||||
if(partpriorities[ESM::PRT_LWrist] < 1){
|
|
||||||
const ESM::BodyPart *wristPart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search (bodyRaceID + "wrist");
|
|
||||||
if(wristPart)
|
|
||||||
addOrReplaceIndividualPart(ESM::PRT_LWrist, -1,1,"meshes\\" + wristPart->model);
|
|
||||||
}
|
|
||||||
if(partpriorities[ESM::PRT_RForearm] < 1){
|
|
||||||
const ESM::BodyPart *forearmPart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search (bodyRaceID + "forearm");
|
|
||||||
if(bodyRaceID == "b_n_argonian_f_")
|
|
||||||
forearmPart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search ("b_n_argonian_m_forearm");
|
|
||||||
if(forearmPart)
|
|
||||||
addOrReplaceIndividualPart(ESM::PRT_RForearm, -1,1,"meshes\\" + forearmPart->model);
|
|
||||||
}
|
|
||||||
if(partpriorities[ESM::PRT_LForearm] < 1){
|
|
||||||
const ESM::BodyPart *forearmPart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search (bodyRaceID + "forearm");
|
|
||||||
if(bodyRaceID == "b_n_argonian_f_")
|
|
||||||
forearmPart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search ("b_n_argonian_m_forearm");
|
|
||||||
if(forearmPart)
|
|
||||||
addOrReplaceIndividualPart(ESM::PRT_LForearm, -1,1,"meshes\\" + forearmPart->model);
|
|
||||||
}
|
|
||||||
if(partpriorities[ESM::PRT_RUpperarm] < 1){
|
|
||||||
const ESM::BodyPart *armPart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search (bodyRaceID + "upper arm");
|
|
||||||
if(armPart)
|
|
||||||
addOrReplaceIndividualPart(ESM::PRT_RUpperarm, -1,1,"meshes\\" + armPart->model);
|
|
||||||
}
|
|
||||||
if(partpriorities[ESM::PRT_LUpperarm] < 1){
|
|
||||||
const ESM::BodyPart *armPart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search (bodyRaceID + "upper arm");
|
|
||||||
if(armPart)
|
|
||||||
addOrReplaceIndividualPart(ESM::PRT_LUpperarm, -1,1,"meshes\\" + armPart->model);
|
|
||||||
}
|
|
||||||
if(partpriorities[ESM::PRT_RFoot] < 1){
|
|
||||||
const ESM::BodyPart *footPart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search (bodyRaceID + "foot");
|
|
||||||
if(isBeast && !footPart)
|
|
||||||
footPart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search (bodyRaceID + "feet");
|
|
||||||
if(footPart)
|
|
||||||
addOrReplaceIndividualPart(ESM::PRT_RFoot, -1,1,"meshes\\" + footPart->model);
|
|
||||||
}
|
|
||||||
if(partpriorities[ESM::PRT_LFoot] < 1){
|
|
||||||
const ESM::BodyPart *footPart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search (bodyRaceID + "foot");
|
|
||||||
if(isBeast && !footPart)
|
|
||||||
footPart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search (bodyRaceID + "feet");
|
|
||||||
if(footPart)
|
|
||||||
addOrReplaceIndividualPart(ESM::PRT_LFoot, -1,1,"meshes\\" + footPart->model);
|
|
||||||
}
|
|
||||||
if(partpriorities[ESM::PRT_RAnkle] < 1){
|
|
||||||
const ESM::BodyPart *anklePart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search (bodyRaceID + "ankle");
|
|
||||||
if(anklePart)
|
|
||||||
addOrReplaceIndividualPart(ESM::PRT_RAnkle, -1,1,"meshes\\" + anklePart->model);
|
|
||||||
}
|
|
||||||
if(partpriorities[ESM::PRT_LAnkle] < 1){
|
|
||||||
const ESM::BodyPart *anklePart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search (bodyRaceID + "ankle");
|
|
||||||
if(anklePart)
|
|
||||||
addOrReplaceIndividualPart(ESM::PRT_LAnkle, -1,1,"meshes\\" + anklePart->model);
|
|
||||||
}
|
|
||||||
if(partpriorities[ESM::PRT_RKnee] < 1){
|
|
||||||
const ESM::BodyPart *kneePart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search (bodyRaceID + "knee");
|
|
||||||
if(kneePart)
|
|
||||||
addOrReplaceIndividualPart(ESM::PRT_RKnee, -1,1,"meshes\\" + kneePart->model);
|
|
||||||
}
|
|
||||||
if(partpriorities[ESM::PRT_LKnee] < 1){
|
|
||||||
const ESM::BodyPart *kneePart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search (bodyRaceID + "knee");
|
|
||||||
if(kneePart)
|
|
||||||
addOrReplaceIndividualPart(ESM::PRT_LKnee, -1,1,"meshes\\" + kneePart->model);
|
|
||||||
}
|
|
||||||
if(partpriorities[ESM::PRT_RLeg] < 1){
|
|
||||||
const ESM::BodyPart *legPart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search (bodyRaceID + "upper leg");
|
|
||||||
if(legPart)
|
|
||||||
addOrReplaceIndividualPart(ESM::PRT_RLeg, -1,1,"meshes\\" + legPart->model);
|
|
||||||
}
|
|
||||||
if(partpriorities[ESM::PRT_LLeg] < 1){
|
|
||||||
const ESM::BodyPart *legPart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search (bodyRaceID + "upper leg");
|
|
||||||
if(legPart)
|
|
||||||
addOrReplaceIndividualPart(ESM::PRT_LLeg, -1,1,"meshes\\" + legPart->model);
|
|
||||||
}
|
|
||||||
if(partpriorities[ESM::PRT_Tail] < 1){
|
|
||||||
const ESM::BodyPart *tailPart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search (bodyRaceID + "tail");
|
|
||||||
if(tailPart)
|
|
||||||
addOrReplaceIndividualPart(ESM::PRT_Tail, -1,1,"meshes\\" + tailPart->model);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
Ogre::Entity* NpcAnimation::insertBoundedPart(const std::string &mesh, std::string bonename){
|
|
||||||
|
|
||||||
NIFLoader::load(mesh);
|
NIFLoader::load(mesh);
|
||||||
Ogre::Entity* part = mRend.getScene()->createEntity(mesh);
|
Ogre::Entity* part = mRend.getScene()->createEntity(mesh);
|
||||||
|
@ -508,60 +390,12 @@ Ogre::Entity* NpcAnimation::insertBoundedPart(const std::string &mesh, std::stri
|
||||||
base->attachObjectToBone(bonename, part);
|
base->attachObjectToBone(bonename, part);
|
||||||
return part;
|
return part;
|
||||||
}
|
}
|
||||||
void NpcAnimation::insertFootPart(int type, const std::string &mesh){
|
|
||||||
std::string meshAndSuffix = mesh;
|
|
||||||
if(type == ESM::PRT_LFoot)
|
|
||||||
meshAndSuffix += "*|";
|
|
||||||
NIFLoader::load(meshAndSuffix);
|
|
||||||
Ogre::Entity* part = mRend.getScene()->createEntity(meshAndSuffix);
|
|
||||||
std::vector<Nif::NiTriShapeCopy>* shape = ((NIFLoader::getSingletonPtr())->getShapes(meshAndSuffix));
|
|
||||||
if(shape == 0){
|
|
||||||
if(type == ESM::PRT_LFoot){
|
|
||||||
base->attachObjectToBone("Left Foot", part);
|
|
||||||
lfoot = part;
|
|
||||||
}
|
|
||||||
else if (type == ESM::PRT_RFoot){
|
|
||||||
base->attachObjectToBone("Right Foot", part);
|
|
||||||
rfoot = part;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
if(type == ESM::PRT_LFoot)
|
|
||||||
lFreeFoot = insertFreePart(mesh, "::");
|
|
||||||
else if (type == ESM::PRT_RFoot)
|
|
||||||
rFreeFoot = insertFreePart(mesh, ":<");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
std::pair<Ogre::Entity*, std::vector<Nif::NiTriShapeCopy>*> NpcAnimation::insertFreePart(const std::string &mesh, const std::string& suffix){
|
|
||||||
|
|
||||||
std::string meshNumbered = mesh + getUniqueID(mesh + suffix) + suffix;
|
|
||||||
NIFLoader::load(meshNumbered);
|
|
||||||
|
|
||||||
Ogre::Entity* part = mRend.getScene()->createEntity(meshNumbered);
|
|
||||||
part->setVisibilityFlags(RV_Actors);
|
|
||||||
|
|
||||||
insert->attachObject(part);
|
|
||||||
|
|
||||||
std::vector<Nif::NiTriShapeCopy>* shape = ((NIFLoader::getSingletonPtr())->getShapes(mesh + "0000" + suffix));
|
|
||||||
if(shape){
|
|
||||||
handleShapes(shape, part, base->getSkeleton());
|
|
||||||
}
|
|
||||||
std::pair<Ogre::Entity*, std::vector<Nif::NiTriShapeCopy>*> pair = std::make_pair(part, shape);
|
|
||||||
return pair;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void NpcAnimation::runAnimation(float timepassed){
|
|
||||||
|
|
||||||
if(timeToChange > .2){
|
|
||||||
|
|
||||||
|
void NpcAnimation::runAnimation(float timepassed)
|
||||||
|
{
|
||||||
|
if(timeToChange > .2)
|
||||||
|
{
|
||||||
timeToChange = 0;
|
timeToChange = 0;
|
||||||
|
|
||||||
updateParts();
|
updateParts();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -572,12 +406,12 @@ void NpcAnimation::runAnimation(float timepassed){
|
||||||
//2. Handle the animation transforms dependent on time
|
//2. Handle the animation transforms dependent on time
|
||||||
|
|
||||||
//3. Handle the shapes dependent on animation transforms
|
//3. Handle the shapes dependent on animation transforms
|
||||||
if(animate > 0){
|
if(animate > 0)
|
||||||
|
{
|
||||||
time += timepassed;
|
time += timepassed;
|
||||||
|
if(time > stopTime)
|
||||||
if(time > stopTime){
|
{
|
||||||
animate--;
|
animate--;
|
||||||
|
|
||||||
if(animate == 0)
|
if(animate == 0)
|
||||||
time = stopTime;
|
time = stopTime;
|
||||||
else
|
else
|
||||||
|
@ -585,180 +419,151 @@ void NpcAnimation::runAnimation(float timepassed){
|
||||||
}
|
}
|
||||||
|
|
||||||
handleAnimationTransforms();
|
handleAnimationTransforms();
|
||||||
|
|
||||||
|
|
||||||
vecRotPos.clear();
|
|
||||||
|
|
||||||
|
|
||||||
if(lFreeFoot.first)
|
|
||||||
handleShapes(lFreeFoot.second, lFreeFoot.first, base->getSkeleton());
|
|
||||||
if(rFreeFoot.first)
|
|
||||||
handleShapes(rFreeFoot.second, rFreeFoot.first, base->getSkeleton());
|
|
||||||
|
|
||||||
if(chest.first)
|
|
||||||
handleShapes(chest.second, chest.first, base->getSkeleton());
|
|
||||||
if(tail.first)
|
|
||||||
handleShapes(tail.second, tail.first, base->getSkeleton());
|
|
||||||
if(skirt.first){
|
|
||||||
handleShapes(skirt.second, skirt.first, base->getSkeleton());
|
|
||||||
}
|
|
||||||
if(lhand.first)
|
|
||||||
handleShapes(lhand.second, lhand.first, base->getSkeleton());
|
|
||||||
if(rhand.first)
|
|
||||||
handleShapes(rhand.second, rhand.first, base->getSkeleton());
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void NpcAnimation::removeIndividualPart(int type){
|
void NpcAnimation::removeIndividualPart(int type)
|
||||||
|
{
|
||||||
partpriorities[type] = 0;
|
partpriorities[type] = 0;
|
||||||
partslots[type] = -1;
|
partslots[type] = -1;
|
||||||
|
|
||||||
if(type == ESM::PRT_Head && head){ //0
|
if(type == ESM::PRT_Head && head) //0
|
||||||
|
{
|
||||||
base->detachObjectFromBone(head);
|
base->detachObjectFromBone(head);
|
||||||
head = 0;
|
head = 0;
|
||||||
}
|
}
|
||||||
else if(type == ESM::PRT_Hair && hair){//1
|
else if(type == ESM::PRT_Hair && hair) //1
|
||||||
|
{
|
||||||
base->detachObjectFromBone(hair);
|
base->detachObjectFromBone(hair);
|
||||||
hair = 0;
|
hair = 0;
|
||||||
}
|
}
|
||||||
else if(type == ESM::PRT_Neck && neck){//2
|
else if(type == ESM::PRT_Neck && neck) //2
|
||||||
|
{
|
||||||
base->detachObjectFromBone(neck);
|
base->detachObjectFromBone(neck);
|
||||||
neck = 0;
|
neck = 0;
|
||||||
}
|
}
|
||||||
else if(type == ESM::PRT_Cuirass && chest.first){//3
|
else if(type == ESM::PRT_Groin && groin)//4
|
||||||
insert->detachObject(chest.first);
|
{
|
||||||
chest = zero;
|
|
||||||
}
|
|
||||||
else if(type == ESM::PRT_Groin && groin){//4
|
|
||||||
base->detachObjectFromBone(groin);
|
base->detachObjectFromBone(groin);
|
||||||
groin = 0;
|
groin = 0;
|
||||||
}
|
}
|
||||||
else if(type == ESM::PRT_Skirt && skirt.first){//5
|
else if(type == ESM::PRT_RWrist && rWrist)//8
|
||||||
insert->detachObject(skirt.first);
|
{
|
||||||
skirt = zero;
|
|
||||||
}
|
|
||||||
else if(type == ESM::PRT_RHand && rhand.first){//6
|
|
||||||
insert->detachObject(rhand.first);
|
|
||||||
rhand = zero;
|
|
||||||
}
|
|
||||||
else if(type == ESM::PRT_LHand && lhand.first){//7
|
|
||||||
insert->detachObject(lhand.first);
|
|
||||||
lhand = zero;
|
|
||||||
}
|
|
||||||
else if(type == ESM::PRT_RWrist && rWrist){//8
|
|
||||||
base->detachObjectFromBone(rWrist);
|
base->detachObjectFromBone(rWrist);
|
||||||
rWrist = 0;
|
rWrist = 0;
|
||||||
}
|
}
|
||||||
else if(type == ESM::PRT_LWrist && lWrist){//9
|
else if(type == ESM::PRT_LWrist && lWrist) //9
|
||||||
|
{
|
||||||
base->detachObjectFromBone(lWrist);
|
base->detachObjectFromBone(lWrist);
|
||||||
lWrist = 0;
|
lWrist = 0;
|
||||||
}
|
}
|
||||||
else if(type == ESM::PRT_Shield){//10
|
else if(type == ESM::PRT_Shield) //10
|
||||||
|
{
|
||||||
}
|
}
|
||||||
else if(type == ESM::PRT_RForearm && rForearm){//11
|
else if(type == ESM::PRT_RForearm && rForearm) //11
|
||||||
|
{
|
||||||
base->detachObjectFromBone(rForearm);
|
base->detachObjectFromBone(rForearm);
|
||||||
rForearm = 0;
|
rForearm = 0;
|
||||||
}
|
}
|
||||||
else if(type == ESM::PRT_LForearm && lForearm){//12
|
else if(type == ESM::PRT_LForearm && lForearm) //12
|
||||||
|
{
|
||||||
base->detachObjectFromBone(lForearm);
|
base->detachObjectFromBone(lForearm);
|
||||||
lForearm = 0;
|
lForearm = 0;
|
||||||
}
|
}
|
||||||
else if(type == ESM::PRT_RUpperarm && rupperArm){//13
|
else if(type == ESM::PRT_RUpperarm && rupperArm) //13
|
||||||
|
{
|
||||||
base->detachObjectFromBone(rupperArm);
|
base->detachObjectFromBone(rupperArm);
|
||||||
rupperArm = 0;
|
rupperArm = 0;
|
||||||
}
|
}
|
||||||
else if(type == ESM::PRT_LUpperarm && lupperArm){//14
|
else if(type == ESM::PRT_LUpperarm && lupperArm) //14
|
||||||
|
{
|
||||||
base->detachObjectFromBone(lupperArm);
|
base->detachObjectFromBone(lupperArm);
|
||||||
lupperArm = 0;
|
lupperArm = 0;
|
||||||
}
|
}
|
||||||
else if(type == ESM::PRT_RFoot){ //15
|
else if(type == ESM::PRT_RFoot && rfoot) //15
|
||||||
if(rfoot){
|
{
|
||||||
base->detachObjectFromBone(rfoot);
|
base->detachObjectFromBone(rfoot);
|
||||||
rfoot = 0;
|
rfoot = 0;
|
||||||
}
|
}
|
||||||
else if(rFreeFoot.first){
|
else if(type == ESM::PRT_LFoot && lfoot) //16
|
||||||
insert->detachObject(rFreeFoot.first);
|
{
|
||||||
rFreeFoot = zero;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(type == ESM::PRT_LFoot){ //16
|
|
||||||
if(lfoot){
|
|
||||||
base->detachObjectFromBone(lfoot);
|
base->detachObjectFromBone(lfoot);
|
||||||
lfoot = 0;
|
lfoot = 0;
|
||||||
}
|
}
|
||||||
else if(lFreeFoot.first){
|
else if(type == ESM::PRT_RAnkle && rAnkle) //17
|
||||||
insert->detachObject(lFreeFoot.first);
|
{
|
||||||
lFreeFoot = zero;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(type == ESM::PRT_RAnkle && rAnkle){ //17
|
|
||||||
base->detachObjectFromBone(rAnkle);
|
base->detachObjectFromBone(rAnkle);
|
||||||
rAnkle = 0;
|
rAnkle = 0;
|
||||||
}
|
}
|
||||||
else if(type == ESM::PRT_LAnkle && lAnkle){ //18
|
else if(type == ESM::PRT_LAnkle && lAnkle) //18
|
||||||
|
{
|
||||||
base->detachObjectFromBone(lAnkle);
|
base->detachObjectFromBone(lAnkle);
|
||||||
lAnkle = 0;
|
lAnkle = 0;
|
||||||
}
|
}
|
||||||
else if(type == ESM::PRT_RKnee && rKnee){ //19
|
else if(type == ESM::PRT_RKnee && rKnee) //19
|
||||||
|
{
|
||||||
base->detachObjectFromBone(rKnee);
|
base->detachObjectFromBone(rKnee);
|
||||||
rKnee = 0;
|
rKnee = 0;
|
||||||
}
|
}
|
||||||
else if(type == ESM::PRT_LKnee && lKnee){ //20
|
else if(type == ESM::PRT_LKnee && lKnee) //20
|
||||||
|
{
|
||||||
base->detachObjectFromBone(lKnee);
|
base->detachObjectFromBone(lKnee);
|
||||||
lKnee = 0;
|
lKnee = 0;
|
||||||
}
|
}
|
||||||
else if(type == ESM::PRT_RLeg && rUpperLeg){ //21
|
else if(type == ESM::PRT_RLeg && rUpperLeg) //21
|
||||||
|
{
|
||||||
base->detachObjectFromBone(rUpperLeg);
|
base->detachObjectFromBone(rUpperLeg);
|
||||||
rUpperLeg = 0;
|
rUpperLeg = 0;
|
||||||
}
|
}
|
||||||
else if(type == ESM::PRT_LLeg && lUpperLeg){ //22
|
else if(type == ESM::PRT_LLeg && lUpperLeg) //22
|
||||||
|
{
|
||||||
base->detachObjectFromBone(lUpperLeg);
|
base->detachObjectFromBone(lUpperLeg);
|
||||||
lUpperLeg = 0;
|
lUpperLeg = 0;
|
||||||
}
|
}
|
||||||
else if(type == ESM::PRT_RPauldron && rclavicle){ //23
|
else if(type == ESM::PRT_RPauldron && rclavicle) //23
|
||||||
|
{
|
||||||
base->detachObjectFromBone(rclavicle);
|
base->detachObjectFromBone(rclavicle);
|
||||||
rclavicle = 0;
|
rclavicle = 0;
|
||||||
}
|
}
|
||||||
else if(type == ESM::PRT_LPauldron && lclavicle){ //24
|
else if(type == ESM::PRT_LPauldron && lclavicle) //24
|
||||||
|
{
|
||||||
base->detachObjectFromBone(lclavicle);
|
base->detachObjectFromBone(lclavicle);
|
||||||
lclavicle = 0;
|
lclavicle = 0;
|
||||||
}
|
}
|
||||||
else if(type == ESM::PRT_Weapon){ //25
|
else if(type == ESM::PRT_Weapon) //25
|
||||||
|
{
|
||||||
}
|
}
|
||||||
else if(type == ESM::PRT_Tail && tail.first){ //26
|
|
||||||
insert->detachObject(tail.first);
|
|
||||||
tail = zero;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NpcAnimation::reserveIndividualPart(int type, int group, int priority)
|
||||||
|
{
|
||||||
|
if(priority > partpriorities[type])
|
||||||
}
|
{
|
||||||
|
|
||||||
void NpcAnimation::reserveIndividualPart(int type, int group, int priority){
|
|
||||||
if(priority > partpriorities[type]){
|
|
||||||
removeIndividualPart(type);
|
removeIndividualPart(type);
|
||||||
partpriorities[type] = priority;
|
partpriorities[type] = priority;
|
||||||
partslots[type] = group;
|
partslots[type] = group;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void NpcAnimation::removePartGroup(int group){
|
void NpcAnimation::removePartGroup(int group)
|
||||||
for(int i = 0; i < 27; i++){
|
{
|
||||||
if(partslots[i] == group){
|
for(int i = 0; i < 27; i++)
|
||||||
|
{
|
||||||
|
if(partslots[i] == group)
|
||||||
removeIndividualPart(i);
|
removeIndividualPart(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
bool NpcAnimation::addOrReplaceIndividualPart(int type, int group, int priority, const std::string &mesh){
|
bool NpcAnimation::addOrReplaceIndividualPart(int type, int group, int priority, const std::string &mesh)
|
||||||
if(priority > partpriorities[type]){
|
{
|
||||||
|
if(priority <= partpriorities[type])
|
||||||
|
return false;
|
||||||
|
|
||||||
removeIndividualPart(type);
|
removeIndividualPart(type);
|
||||||
partslots[type] = group;
|
partslots[type] = group;
|
||||||
partpriorities[type] = priority;
|
partpriorities[type] = priority;
|
||||||
switch(type){
|
switch(type)
|
||||||
|
{
|
||||||
case ESM::PRT_Head: //0
|
case ESM::PRT_Head: //0
|
||||||
head = insertBoundedPart(mesh, "Head");
|
head = insertBoundedPart(mesh, "Head");
|
||||||
break;
|
break;
|
||||||
|
@ -769,25 +574,21 @@ void NpcAnimation::removeIndividualPart(int type){
|
||||||
neck = insertBoundedPart(mesh, "Neck");
|
neck = insertBoundedPart(mesh, "Neck");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_Cuirass: //3
|
case ESM::PRT_Cuirass: //3
|
||||||
chest = insertFreePart(mesh, ":\"");
|
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_Groin: //4
|
case ESM::PRT_Groin: //4
|
||||||
groin = insertBoundedPart(mesh, "Groin");
|
groin = insertBoundedPart(mesh, "Groin");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_Skirt: //5
|
case ESM::PRT_Skirt: //5
|
||||||
skirt = insertFreePart(mesh, ":|");
|
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_RHand: //6
|
case ESM::PRT_RHand: //6
|
||||||
rhand = insertFreePart(mesh, ":?");
|
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_LHand: //7
|
case ESM::PRT_LHand: //7
|
||||||
lhand = insertFreePart(mesh, ":>");
|
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_RWrist: //8
|
case ESM::PRT_RWrist: //8
|
||||||
rWrist = insertBoundedPart(mesh, "Right Wrist");
|
rWrist = insertBoundedPart(mesh, "Right Wrist");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_LWrist: //9
|
case ESM::PRT_LWrist: //9
|
||||||
lWrist = insertBoundedPart(mesh + "*|", "Left Wrist");
|
lWrist = insertBoundedPart(mesh, "Left Wrist");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_Shield: //10
|
case ESM::PRT_Shield: //10
|
||||||
break;
|
break;
|
||||||
|
@ -795,74 +596,69 @@ void NpcAnimation::removeIndividualPart(int type){
|
||||||
rForearm = insertBoundedPart(mesh, "Right Forearm");
|
rForearm = insertBoundedPart(mesh, "Right Forearm");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_LForearm: //12
|
case ESM::PRT_LForearm: //12
|
||||||
lForearm = insertBoundedPart(mesh + "*|", "Left Forearm");
|
lForearm = insertBoundedPart(mesh, "Left Forearm");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_RUpperarm: //13
|
case ESM::PRT_RUpperarm: //13
|
||||||
rupperArm = insertBoundedPart(mesh, "Right Upper Arm");
|
rupperArm = insertBoundedPart(mesh, "Right Upper Arm");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_LUpperarm: //14
|
case ESM::PRT_LUpperarm: //14
|
||||||
lupperArm = insertBoundedPart(mesh + "*|", "Left Upper Arm");
|
lupperArm = insertBoundedPart(mesh, "Left Upper Arm");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_RFoot: //15
|
case ESM::PRT_RFoot: //15
|
||||||
insertFootPart(type, mesh);
|
lupperArm = insertBoundedPart(mesh, "Right Foot");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_LFoot: //16
|
case ESM::PRT_LFoot: //16
|
||||||
insertFootPart(type, mesh);
|
lupperArm = insertBoundedPart(mesh, "Left Foot");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_RAnkle: //17
|
case ESM::PRT_RAnkle: //17
|
||||||
rAnkle = insertBoundedPart(mesh, "Right Ankle");
|
rAnkle = insertBoundedPart(mesh, "Right Ankle");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_LAnkle: //18
|
case ESM::PRT_LAnkle: //18
|
||||||
lAnkle = insertBoundedPart(mesh + "*|", "Left Ankle");
|
lAnkle = insertBoundedPart(mesh, "Left Ankle");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_RKnee: //19
|
case ESM::PRT_RKnee: //19
|
||||||
rKnee = insertBoundedPart(mesh, "Right Knee");
|
rKnee = insertBoundedPart(mesh, "Right Knee");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_LKnee: //20
|
case ESM::PRT_LKnee: //20
|
||||||
lKnee = insertBoundedPart(mesh + "*|", "Left Knee");
|
lKnee = insertBoundedPart(mesh, "Left Knee");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_RLeg: //21
|
case ESM::PRT_RLeg: //21
|
||||||
rUpperLeg = insertBoundedPart(mesh, "Right Upper Leg");
|
rUpperLeg = insertBoundedPart(mesh, "Right Upper Leg");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_LLeg: //22
|
case ESM::PRT_LLeg: //22
|
||||||
lUpperLeg = insertBoundedPart(mesh + "*|", "Left Upper Leg");
|
lUpperLeg = insertBoundedPart(mesh, "Left Upper Leg");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_RPauldron: //23
|
case ESM::PRT_RPauldron: //23
|
||||||
rclavicle = insertBoundedPart(mesh , "Right Clavicle");
|
rclavicle = insertBoundedPart(mesh , "Right Clavicle");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_LPauldron: //24
|
case ESM::PRT_LPauldron: //24
|
||||||
lclavicle = insertBoundedPart(mesh + "*|", "Left Clavicle");
|
lclavicle = insertBoundedPart(mesh, "Left Clavicle");
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_Weapon: //25
|
case ESM::PRT_Weapon: //25
|
||||||
break;
|
break;
|
||||||
case ESM::PRT_Tail: //26
|
case ESM::PRT_Tail: //26
|
||||||
tail = insertFreePart(mesh, ":*");
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void NpcAnimation::addPartGroup(int group, int priority, std::vector<ESM::PartReference>& parts){
|
void NpcAnimation::addPartGroup(int group, int priority, std::vector<ESM::PartReference> &parts)
|
||||||
|
{
|
||||||
for(std::size_t i = 0; i < parts.size(); i++)
|
for(std::size_t i = 0; i < parts.size(); i++)
|
||||||
{
|
{
|
||||||
ESM::PartReference part = parts[i];
|
ESM::PartReference &part = parts[i];
|
||||||
|
|
||||||
const ESM::BodyPart *bodypart = 0;
|
const ESM::BodyPart *bodypart = 0;
|
||||||
|
|
||||||
if(isFemale)
|
if(isFemale)
|
||||||
bodypart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search(part.female);
|
bodypart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search(part.female);
|
||||||
if(!bodypart)
|
if(!bodypart)
|
||||||
bodypart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search(part.male);
|
bodypart = MWBase::Environment::get().getWorld()->getStore().bodyParts.search(part.male);
|
||||||
if(bodypart){
|
|
||||||
|
if(bodypart)
|
||||||
addOrReplaceIndividualPart(part.part, group,priority,"meshes\\" + bodypart->model);
|
addOrReplaceIndividualPart(part.part, group,priority,"meshes\\" + bodypart->model);
|
||||||
}
|
|
||||||
else
|
else
|
||||||
reserveIndividualPart(part.part, group, priority);
|
reserveIndividualPart(part.part, group, priority);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -22,20 +22,9 @@ class NpcAnimation: public Animation{
|
||||||
private:
|
private:
|
||||||
MWWorld::InventoryStore& inv;
|
MWWorld::InventoryStore& inv;
|
||||||
int mStateID;
|
int mStateID;
|
||||||
//Free Parts
|
|
||||||
std::pair<Ogre::Entity*, std::vector<Nif::NiTriShapeCopy>*> chest;
|
|
||||||
std::pair<Ogre::Entity*, std::vector<Nif::NiTriShapeCopy>*> skirt;
|
|
||||||
std::pair<Ogre::Entity*, std::vector<Nif::NiTriShapeCopy>*> lhand;
|
|
||||||
std::pair<Ogre::Entity*, std::vector<Nif::NiTriShapeCopy>*> rhand;
|
|
||||||
std::pair<Ogre::Entity*, std::vector<Nif::NiTriShapeCopy>*> tail;
|
|
||||||
std::pair<Ogre::Entity*, std::vector<Nif::NiTriShapeCopy>*> lFreeFoot;
|
|
||||||
std::pair<Ogre::Entity*, std::vector<Nif::NiTriShapeCopy>*> rFreeFoot;
|
|
||||||
|
|
||||||
int partslots[27]; //Each part slot is taken by clothing, armor, or is empty
|
int partslots[27]; //Each part slot is taken by clothing, armor, or is empty
|
||||||
int partpriorities[27];
|
int partpriorities[27];
|
||||||
std::pair<Ogre::Entity*, std::vector<Nif::NiTriShapeCopy>*> zero;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//Bounded Parts
|
//Bounded Parts
|
||||||
Ogre::Entity* lclavicle;
|
Ogre::Entity* lclavicle;
|
||||||
|
@ -83,9 +72,7 @@ private:
|
||||||
public:
|
public:
|
||||||
NpcAnimation(const MWWorld::Ptr& ptr, OEngine::Render::OgreRenderer& _rend, MWWorld::InventoryStore& _inv);
|
NpcAnimation(const MWWorld::Ptr& ptr, OEngine::Render::OgreRenderer& _rend, MWWorld::InventoryStore& _inv);
|
||||||
virtual ~NpcAnimation();
|
virtual ~NpcAnimation();
|
||||||
Ogre::Entity* insertBoundedPart(const std::string &mesh, std::string bonename);
|
Ogre::Entity* insertBoundedPart(const std::string &mesh, const std::string &bonename);
|
||||||
std::pair<Ogre::Entity*, std::vector<Nif::NiTriShapeCopy>*> insertFreePart(const std::string &mesh, const std::string& suffix);
|
|
||||||
void insertFootPart(int type, const std::string &mesh);
|
|
||||||
virtual void runAnimation(float timepassed);
|
virtual void runAnimation(float timepassed);
|
||||||
void updateParts();
|
void updateParts();
|
||||||
void removeIndividualPart(int type);
|
void removeIndividualPart(int type);
|
||||||
|
@ -94,8 +81,7 @@ private:
|
||||||
bool addOrReplaceIndividualPart(int type, int group, int priority, const std::string &mesh);
|
bool addOrReplaceIndividualPart(int type, int group, int priority, const std::string &mesh);
|
||||||
void removePartGroup(int group);
|
void removePartGroup(int group);
|
||||||
void addPartGroup(int group, int priority, std::vector<ESM::PartReference>& parts);
|
void addPartGroup(int group, int priority, std::vector<ESM::PartReference>& parts);
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -64,28 +64,13 @@ static bool fsstrict = false;
|
||||||
/// An OGRE Archive wrapping a BSAFile archive
|
/// An OGRE Archive wrapping a BSAFile archive
|
||||||
class DirArchive: public Ogre::FileSystemArchive
|
class DirArchive: public Ogre::FileSystemArchive
|
||||||
{
|
{
|
||||||
|
|
||||||
boost::filesystem::path currentdir;
|
boost::filesystem::path currentdir;
|
||||||
std::map<std::string, std::vector<std::string>, ciLessBoost> m;
|
std::map<std::string, std::vector<std::string>, ciLessBoost> m;
|
||||||
unsigned int cutoff;
|
unsigned int cutoff;
|
||||||
|
|
||||||
bool findFile(const String& filename, std::string& copy) const
|
bool findFile(const String& filename, std::string& copy) const
|
||||||
{
|
{
|
||||||
{
|
copy = filename;
|
||||||
String passed = filename;
|
|
||||||
if(filename.at(filename.length() - 2) == '>' || filename.at(filename.length() - 2) == ':')
|
|
||||||
passed = filename.substr(0, filename.length() - 6);
|
|
||||||
else if(filename.at(filename.length() - 2) == '"')
|
|
||||||
passed = filename.substr(0, filename.length() - 9);
|
|
||||||
else if(filename.at(filename.length() - 1) == '*' || filename.at(filename.length() - 1) == '?' || filename.at(filename.length() - 1) == '<'
|
|
||||||
|| filename.at(filename.length() - 1) == '"' || filename.at(filename.length() - 1) == '>' || filename.at(filename.length() - 1) == ':'
|
|
||||||
|| filename.at(filename.length() - 1) == '|')
|
|
||||||
passed = filename.substr(0, filename.length() - 2);
|
|
||||||
|
|
||||||
|
|
||||||
copy = passed;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::replace(copy.begin(), copy.end(), '\\', '/');
|
std::replace(copy.begin(), copy.end(), '\\', '/');
|
||||||
|
|
||||||
if(copy.at(0) == '/')
|
if(copy.at(0) == '/')
|
||||||
|
@ -225,46 +210,23 @@ public:
|
||||||
// OGRE's fault. You should NOT expect an open() command not to
|
// OGRE's fault. You should NOT expect an open() command not to
|
||||||
// have any side effects on the archive, and hence this function
|
// have any side effects on the archive, and hence this function
|
||||||
// should not have been declared const in the first place.
|
// should not have been declared const in the first place.
|
||||||
BSAFile *narc = (BSAFile*)&arc;
|
BSAFile *narc = const_cast<BSAFile*>(&arc);
|
||||||
|
|
||||||
String passed = filename;
|
|
||||||
if(filename.at(filename.length() - 2) == '>' || filename.at(filename.length() - 2) == ':')
|
|
||||||
passed = filename.substr(0, filename.length() - 6);
|
|
||||||
else if(filename.at(filename.length() - 2) == '"')
|
|
||||||
passed = filename.substr(0, filename.length() - 9);
|
|
||||||
else if(filename.at(filename.length() - 1) == '*' || filename.at(filename.length() - 1) == '?' || filename.at(filename.length() - 1) == '<'
|
|
||||||
|| filename.at(filename.length() - 1) == '"' || filename.at(filename.length() - 1) == '>' || filename.at(filename.length() - 1) == ':'
|
|
||||||
|| filename.at(filename.length() - 1) == '|')
|
|
||||||
passed = filename.substr(0, filename.length() - 2);
|
|
||||||
|
|
||||||
|
|
||||||
// Open the file
|
// Open the file
|
||||||
StreamPtr strm = narc->getFile(passed.c_str());
|
StreamPtr strm = narc->getFile(filename.c_str());
|
||||||
|
|
||||||
// Wrap it into an Ogre::DataStream.
|
// Wrap it into an Ogre::DataStream.
|
||||||
return DataStreamPtr(new Mangle2OgreStream(strm));
|
return DataStreamPtr(new Mangle2OgreStream(strm));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool exists(const String& filename) {
|
bool exists(const String& filename) {
|
||||||
return cexists(filename);
|
return arc.exists(filename.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if the file exists.
|
|
||||||
bool cexists(const String& filename) const {
|
bool cexists(const String& filename) const {
|
||||||
String passed = filename;
|
return arc.exists(filename.c_str());
|
||||||
if(filename.at(filename.length() - 2) == '>' || filename.at(filename.length() - 2) == ':')
|
|
||||||
passed = filename.substr(0, filename.length() - 6);
|
|
||||||
else if(filename.at(filename.length() - 2) == '"')
|
|
||||||
passed = filename.substr(0, filename.length() - 9);
|
|
||||||
else if(filename.at(filename.length() - 1) == '*' || filename.at(filename.length() - 1) == '?' || filename.at(filename.length() - 1) == '<'
|
|
||||||
|| filename.at(filename.length() - 1) == '"' || filename.at(filename.length() - 1) == '>' || filename.at(filename.length() - 1) == ':'
|
|
||||||
|| filename.at(filename.length() - 1) == '|')
|
|
||||||
passed = filename.substr(0, filename.length() - 2);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return arc.exists(passed.c_str());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
time_t getModifiedTime(const String&) { return 0; }
|
time_t getModifiedTime(const String&) { return 0; }
|
||||||
|
|
||||||
// This is never called as far as I can see.
|
// This is never called as far as I can see.
|
||||||
|
|
|
@ -326,12 +326,6 @@ public:
|
||||||
Ogre::Vector3 trans; // Translation
|
Ogre::Vector3 trans; // Translation
|
||||||
float scale; // Probably scale (always 1)
|
float scale; // Probably scale (always 1)
|
||||||
};
|
};
|
||||||
struct BoneTrafoCopy
|
|
||||||
{
|
|
||||||
Ogre::Quaternion rotation;
|
|
||||||
Ogre::Vector3 trans;
|
|
||||||
float scale;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct VertWeight
|
struct VertWeight
|
||||||
{
|
{
|
||||||
|
@ -339,26 +333,12 @@ public:
|
||||||
float weight;
|
float weight;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct BoneInfo
|
struct BoneInfo
|
||||||
{
|
{
|
||||||
BoneTrafo trafo;
|
BoneTrafo trafo;
|
||||||
Ogre::Vector4 unknown;
|
Ogre::Vector4 unknown;
|
||||||
std::vector<VertWeight> weights;
|
std::vector<VertWeight> weights;
|
||||||
};
|
};
|
||||||
struct BoneInfoCopy
|
|
||||||
{
|
|
||||||
std::string bonename;
|
|
||||||
unsigned short bonehandle;
|
|
||||||
BoneTrafoCopy trafo;
|
|
||||||
Ogre::Vector4 unknown;
|
|
||||||
//std::vector<VertWeight> weights;
|
|
||||||
};
|
|
||||||
struct IndividualWeight
|
|
||||||
{
|
|
||||||
float weight;
|
|
||||||
unsigned int boneinfocopyindex;
|
|
||||||
};
|
|
||||||
|
|
||||||
BoneTrafo trafo;
|
BoneTrafo trafo;
|
||||||
std::vector<BoneInfo> bones;
|
std::vector<BoneInfo> bones;
|
||||||
|
|
|
@ -110,20 +110,6 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct NiTriShapeCopy
|
|
||||||
{
|
|
||||||
std::string sname;
|
|
||||||
std::vector<std::string> boneSequence;
|
|
||||||
Nif::NiSkinData::BoneTrafoCopy trafo;
|
|
||||||
//Ogre::Quaternion initialBoneRotation;
|
|
||||||
//Ogre::Vector3 initialBoneTranslation;
|
|
||||||
std::vector<Ogre::Vector3> vertices;
|
|
||||||
std::vector<Ogre::Vector3> normals;
|
|
||||||
std::vector<Nif::NiSkinData::BoneInfoCopy> boneinfo;
|
|
||||||
std::map<int, std::vector<Nif::NiSkinData::IndividualWeight> > vertsToWeights;
|
|
||||||
Nif::NiMorphData morph;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct NiNode : Node
|
struct NiNode : Node
|
||||||
{
|
{
|
||||||
NodeList children;
|
NodeList children;
|
||||||
|
@ -184,28 +170,6 @@ struct NiTriShape : Node
|
||||||
data.post(nif);
|
data.post(nif);
|
||||||
skin.post(nif);
|
skin.post(nif);
|
||||||
}
|
}
|
||||||
|
|
||||||
NiTriShapeCopy clone()
|
|
||||||
{
|
|
||||||
NiTriShapeCopy copy;
|
|
||||||
copy.sname = name;
|
|
||||||
float *ptr = (float*)&data->vertices[0];
|
|
||||||
float *ptrNormals = (float*)&data->normals[0];
|
|
||||||
int numVerts = data->vertices.size() / 3;
|
|
||||||
for(int i = 0; i < numVerts; i++)
|
|
||||||
{
|
|
||||||
float *current = (float*) (ptr + i * 3);
|
|
||||||
copy.vertices.push_back(Ogre::Vector3(*current, *(current + 1), *(current + 2)));
|
|
||||||
|
|
||||||
if(ptrNormals)
|
|
||||||
{
|
|
||||||
float *currentNormals = (float*) (ptrNormals + i * 3);
|
|
||||||
copy.normals.push_back(Ogre::Vector3(*currentNormals, *(currentNormals + 1), *(currentNormals + 2)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return copy;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct NiCamera : Node
|
struct NiCamera : Node
|
||||||
|
|
|
@ -79,7 +79,7 @@ void ManualBulletShapeLoader::loadResource(Ogre::Resource *resource)
|
||||||
// of the early stages of development. Right now we WANT to catch
|
// of the early stages of development. Right now we WANT to catch
|
||||||
// every error as early and intrusively as possible, as it's most
|
// every error as early and intrusively as possible, as it's most
|
||||||
// likely a sign of incomplete code rather than faulty input.
|
// likely a sign of incomplete code rather than faulty input.
|
||||||
Nif::NIFFile nif(resourceName);
|
Nif::NIFFile nif(resourceName.substr(0, resourceName.length()-7));
|
||||||
if (nif.numRecords() < 1)
|
if (nif.numRecords() < 1)
|
||||||
{
|
{
|
||||||
warn("Found no records in NIF.");
|
warn("Found no records in NIF.");
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -67,12 +67,9 @@ namespace Nif
|
||||||
|
|
||||||
namespace NifOgre
|
namespace NifOgre
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
/** Manual resource loader for NIF meshes. This is the main class
|
/** Manual resource loader for NIF meshes. This is the main class
|
||||||
responsible for translating the internal NIF mesh structure into
|
responsible for translating the internal NIF mesh structure into
|
||||||
something Ogre can use. Later it will also handle the insertion of
|
something Ogre can use.
|
||||||
collision meshes into Bullet / OgreBullet.
|
|
||||||
|
|
||||||
You have to insert meshes manually into Ogre like this:
|
You have to insert meshes manually into Ogre like this:
|
||||||
|
|
||||||
|
@ -87,92 +84,17 @@ namespace NifOgre
|
||||||
class NIFLoader : Ogre::ManualResourceLoader
|
class NIFLoader : Ogre::ManualResourceLoader
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static int numberOfMeshes;
|
|
||||||
static NIFLoader& getSingleton();
|
|
||||||
static NIFLoader* getSingletonPtr();
|
|
||||||
|
|
||||||
virtual void loadResource(Ogre::Resource *resource);
|
virtual void loadResource(Ogre::Resource *resource);
|
||||||
|
|
||||||
static Ogre::MeshPtr load(const std::string &name,
|
static Ogre::MeshPtr load(const std::string &name,
|
||||||
const std::string &group="General");
|
const std::string &group="General");
|
||||||
//void insertMeshInsideBase(Ogre::Mesh* mesh);
|
|
||||||
std::vector<Nif::NiKeyframeData>* getAnim(std::string name);
|
|
||||||
std::vector<Nif::NiTriShapeCopy>* getShapes(std::string name);
|
|
||||||
std::map<std::string, float>* getTextIndices(std::string name);
|
|
||||||
|
|
||||||
|
|
||||||
void setOutputAnimFiles(bool output);
|
|
||||||
void setVerbosePath(std::string path);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
NIFLoader() {}
|
||||||
NIFLoader() : resourceName(""), resourceGroup("General"), flip(false), mNormaliseNormals(false),
|
|
||||||
mFlipVertexWinding(false), mOutputAnimFiles(false), inTheSkeletonTree(false) {}
|
|
||||||
NIFLoader(NIFLoader& n) {}
|
NIFLoader(NIFLoader& n) {}
|
||||||
|
|
||||||
void calculateTransform();
|
void warn(const std::string &msg);
|
||||||
|
void fail(const std::string &msg);
|
||||||
|
|
||||||
void warn(std::string msg);
|
|
||||||
void fail(std::string msg);
|
|
||||||
|
|
||||||
void handleNode( Nif::Node *node, int flags,
|
|
||||||
const Nif::Transformation *trafo, BoundsFinder &bounds, Ogre::Bone *parentBone, std::vector<std::string> boneSequence);
|
|
||||||
|
|
||||||
void handleNiTriShape(Nif::NiTriShape *shape, int flags, BoundsFinder &bounds, Nif::Transformation original, std::vector<std::string> boneSequence);
|
|
||||||
|
|
||||||
void createOgreSubMesh(Nif::NiTriShape *shape, const Ogre::String &material, std::list<Ogre::VertexBoneAssignment> &vertexBoneAssignments);
|
|
||||||
|
|
||||||
void createMaterial(const Ogre::String &name,
|
|
||||||
const Ogre::Vector3 &ambient,
|
|
||||||
const Ogre::Vector3 &diffuse,
|
|
||||||
const Ogre::Vector3 &specular,
|
|
||||||
const Ogre::Vector3 &emissive,
|
|
||||||
float glossiness, float alpha,
|
|
||||||
int alphaFlags, float alphaTest,
|
|
||||||
const Ogre::String &texName);
|
|
||||||
|
|
||||||
void findRealTexture(Ogre::String &texName);
|
|
||||||
|
|
||||||
Ogre::String getUniqueName(const Ogre::String &input);
|
|
||||||
|
|
||||||
//returns the skeleton name of this mesh
|
|
||||||
std::string getSkeletonName()
|
|
||||||
{
|
|
||||||
return resourceName + ".skel";
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string verbosePath;
|
|
||||||
std::string resourceName;
|
|
||||||
std::string resourceGroup;
|
|
||||||
Ogre::Matrix4 mTransform;
|
|
||||||
Ogre::AxisAlignedBox mBoundingBox;
|
|
||||||
bool flip;
|
|
||||||
bool mNormaliseNormals;
|
|
||||||
bool mFlipVertexWinding;
|
|
||||||
bool bNiTri;
|
|
||||||
bool mOutputAnimFiles;
|
|
||||||
std::multimap<std::string,std::string> MaterialMap;
|
|
||||||
|
|
||||||
// pointer to the ogre mesh which is currently build
|
|
||||||
Ogre::Mesh *mesh;
|
|
||||||
Ogre::SkeletonPtr mSkel;
|
|
||||||
Ogre::Vector3 vector;
|
|
||||||
std::vector<Nif::NiTriShapeCopy> shapes;
|
|
||||||
std::string name;
|
|
||||||
std::string triname;
|
|
||||||
std::vector<Nif::NiKeyframeData> allanim;
|
|
||||||
|
|
||||||
std::map<std::string,float> textmappings;
|
|
||||||
std::map<std::string,std::map<std::string,float>,ciLessBoost> alltextmappings;
|
|
||||||
std::map<std::string,std::vector<Nif::NiKeyframeData>,ciLessBoost> allanimmap;
|
|
||||||
std::map<std::string,std::vector<Nif::NiTriShapeCopy>,ciLessBoost> allshapesmap;
|
|
||||||
std::vector<Nif::NiKeyframeData> mAnim;
|
|
||||||
std::vector<Nif::NiTriShapeCopy> mS;
|
|
||||||
std::vector<Ogre::SubMesh*> needBoneAssignments;
|
|
||||||
bool inTheSkeletonTree;
|
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -336,7 +336,7 @@ namespace Physic
|
||||||
char uniqueID[8];
|
char uniqueID[8];
|
||||||
sprintf( uniqueID, "%07.3f", scale );
|
sprintf( uniqueID, "%07.3f", scale );
|
||||||
std::string sid = uniqueID;
|
std::string sid = uniqueID;
|
||||||
std::string outputstring = mesh + uniqueID + "\"|";
|
std::string outputstring = mesh + uniqueID;
|
||||||
//std::cout << "The string" << outputstring << "\n";
|
//std::cout << "The string" << outputstring << "\n";
|
||||||
|
|
||||||
//get the shape from the .nif
|
//get the shape from the .nif
|
||||||
|
|
Loading…
Reference in a new issue