LipSync *ResourceLoader::loadLipSync(const char *filename) { Common::String fname = filename; fname.toLowercase(); LipSync *result; Block *b = getFileFromCache(fname.c_str()); if (!b) { b = getFileBlock(fname.c_str()); if (!b) return NULL; } result = new LipSync(filename, b->data(), b->len()); // Some lipsync files have no data if (result->isValid()) { putIntoCache(fname, b); _lipsyncs.push_back(result); } else { delete result; delete b; result = NULL; } return result; }
LipSyncPtr ResourceLoader::getLipSync(const char *fname) { for (Common::List<LipSync *>::const_iterator i = _lipsyncs.begin(); i != _lipsyncs.end(); ++i) { LipSync *l = *i; if (strcmp(fname, l->getFilename()) == 0) { return l; } } return loadLipSync(fname); }
LipSyncPtr ResourceLoader::getLipSync(const Common::String &fname) { Common::String filename = fname; filename.toLowercase(); for (Common::List<LipSync *>::const_iterator i = _lipsyncs.begin(); i != _lipsyncs.end(); ++i) { LipSync *l = *i; if (filename == l->getFilename()) { return l; } } return loadLipSync(fname); }
LipSync *ResourceLoader::loadLipSync(const Common::String &filename) { LipSync *result; Common::SeekableReadStream *stream; stream = openNewStreamFile(filename.c_str()); if(!stream) return NULL; result = new LipSync(filename, stream); // Some lipsync files have no data if (result->isValid()) _lipsyncs.push_back(result); else { delete result; result = NULL; } delete stream; return result; }
/* PMDObject::load: load model */ bool PMDObject::load(const char *fileName, const char *alias, btVector3 *offsetPos, btQuaternion *offsetRot, bool forcedPosition, PMDBone *assignBone, PMDObject *assignObject, BulletPhysics *bullet, SystemTexture *systex, LipSync *sysLipSync, bool useCartoonRendering, float cartoonEdgeWidth, btVector3 *light, float commentFrame) { int i; int len; char *buf; LipSync *lip; if (fileName == NULL || alias == NULL) return false; /* apply given parameters */ m_assignTo = assignObject; m_baseBone = assignBone; if (forcedPosition) { /* set offset by given parameters */ if (offsetPos) m_offsetPos = (*offsetPos); if (offsetRot) m_offsetRot = (*offsetRot); m_pmd.getRootBone()->setOffset(&m_offsetPos); m_pmd.getRootBone()->update(); } else { /* set offset by root bone */ m_pmd.getRootBone()->getOffset(&m_offsetPos); } /* copy absolute position flag */ for (i = 0; i < 3; i++) m_absPosFlag[i] = false; /* copy toon rendering flag */ m_useCartoonRendering = useCartoonRendering; /* copy flag for motion file drop or all motion */ if(assignBone || assignObject) m_allowMotionFileDrop = false; else m_allowMotionFileDrop = true; /* save position when position is fixed */ if (m_baseBone) m_origBasePos = m_baseBone->getTransform()->getOrigin(); /* set alpha frame */ m_alphaAppearFrame = PMDOBJECT_ALPHAFRAME; m_alphaDisappearFrame = 0.0; /* set comment frame */ m_displayCommentFrame = commentFrame; /* load model */ if (m_pmd.load(fileName, bullet, systex) == false) { clear(); return false; } /* set toon rendering flag */ m_pmd.setToonFlag(useCartoonRendering); /* set edge width */ m_pmd.setEdgeThin(cartoonEdgeWidth); /* load lip sync */ m_globalLipSync = sysLipSync; if(m_localLipSync != NULL) delete m_localLipSync; m_localLipSync = NULL; lip = new LipSync(); len = MMDAgent_strlen(fileName); if(len < 5) { delete lip; } else { buf = MMDAgent_strdup(fileName); buf[len - 4] = '.'; buf[len - 3] = 'l'; buf[len - 2] = 'i'; buf[len - 1] = 'p'; if(lip->load(buf) == true) { m_localLipSync = lip; } else delete lip; if(buf) free(buf); } /* set alias */ setAlias(alias); /* reset */ setLightForToon(light); m_moveSpeed = -1.0f; m_spinSpeed = -1.0f; /* set temporarily all body to Kinematic */ /* this is fixed at first simulation */ skipNextSimulation(); /* enable */ m_isEnable = true; return true; }