void AnimBlendLinearMove::setFrameAndPhase(float dt, float alpha, int prevPoseIndex, int nextPoseIndex, float* prevDeltaTimeOut, float* nextDeltaTimeOut, Triggers& triggersOut) { const float FRAMES_PER_SECOND = 30.0f; auto prevClipNode = std::dynamic_pointer_cast<AnimClip>(_children[prevPoseIndex]); assert(prevClipNode); auto nextClipNode = std::dynamic_pointer_cast<AnimClip>(_children[nextPoseIndex]); assert(nextClipNode); float v0 = _characteristicSpeeds[prevPoseIndex]; float n0 = (prevClipNode->getEndFrame() - prevClipNode->getStartFrame()) + 1.0f; float v1 = _characteristicSpeeds[nextPoseIndex]; float n1 = (nextClipNode->getEndFrame() - nextClipNode->getStartFrame()) + 1.0f; // rate of change in phase space, necessary to achive desired speed. float omega = (_desiredSpeed * FRAMES_PER_SECOND) / ((1.0f - alpha) * v0 * n0 + alpha * v1 * n1); float f0 = prevClipNode->getStartFrame() + _phase * n0; prevClipNode->setCurrentFrame(f0); float f1 = nextClipNode->getStartFrame() + _phase * n1; nextClipNode->setCurrentFrame(f1); // integrate phase forward in time. _phase += omega * dt; // detect loop trigger events if (_phase >= 1.0f) { triggersOut.push_back(_id + "Loop"); _phase = glm::fract(_phase); } *prevDeltaTimeOut = omega * dt * (n0 / FRAMES_PER_SECOND); *nextDeltaTimeOut = omega * dt * (n1 / FRAMES_PER_SECOND); }
void PointsFileSystem::navigateToFirstFrame() { int current_frame = getDisplayFirstFrame()->getFrame(); if (current_frame == getStartFrame()) return; int start_frame = getStartFrame(); hideAndShowPointCloud(current_frame, start_frame); return; }
void AnimBlendLinearMove::setCurrentFrameInternal(float frame) { assert(_children.size() > 0); auto clipNode = std::dynamic_pointer_cast<AnimClip>(_children.front()); assert(clipNode); const float NUM_FRAMES = (clipNode->getEndFrame() - clipNode->getStartFrame()) + 1.0f; _phase = fmodf(frame, NUM_FRAMES); }
//! updates the absolute position based on the relative and the parents position void CAnimatedMeshSceneNode::updateAbsolutePosition() { if ( 0 == Mesh || Mesh->getMeshType() != EAMT_MD3 ) { IAnimatedMeshSceneNode::updateAbsolutePosition(); return; } SMD3QuaterionTag parent; if ( Parent && Parent->getType () == ESNT_ANIMATED_MESH) { parent = ((IAnimatedMeshSceneNode*) Parent)->getAbsoluteTransformation ( MD3Special.Tagname ); } SMD3QuaterionTag relative( RelativeTranslation, RelativeRotation ); SMD3QuaterionTagList *taglist; taglist = ( (IAnimatedMeshMD3*) Mesh )->getTagList ( getFrameNr(),255,getStartFrame (),getEndFrame () ); if ( taglist ) { MD3Special.AbsoluteTagList.Container.set_used ( taglist->size () ); for ( u32 i = 0; i!= taglist->size (); ++i ) { MD3Special.AbsoluteTagList[i].position = parent.position + (*taglist)[i].position + relative.position; MD3Special.AbsoluteTagList[i].rotation = parent.rotation * (*taglist)[i].rotation * relative.rotation; } } }
void CAnimatedMeshSceneNode::useAnimationSet(u32 set_num) { if (m_animation_set.empty()) { setFrameLoop(getStartFrame(), getEndFrame()); return; } setFrameLoop(m_animation_set[set_num * 2], m_animation_set[set_num * 2 + 1]); }
bool GAFAnimation::gotoAndPlay(const char * frameLabel) { int f = getStartFrame(frameLabel); if (-1 == f) { return false; } return gotoAndPlay(f); }
void VisualOdometry::confirmTrials() { // empty check if (trials.empty()) return; // triangulate landmarks // prepare points cv::Mat pts1(2, trials.size(), cv::DataType<float>::type), pts2(2, trials.size(), cv::DataType<float>::type); int col = 0; for (auto it = trials.begin(); it != trials.end(); it++) { cv::KeyPoint k1, k2; it->firstPointPair(k1, k2); pts1.at<float>(0, col) = k1.pt.x; pts1.at<float>(1, col) = k1.pt.y; pts2.at<float>(0, col) = k2.pt.x; pts2.at<float>(1, col) = k2.pt.y; col++; } cv::Mat pts3D; triangulate(pts1, pts2, pts3D); // convert to world coordinate int sframe = trials.back().getStartFrame(); cv::Mat posR, posT; graph.getPose(sframe, posR, posT); cv::Mat posRT = fullRT(posR, posT); pts3D = posRT * pts3D; int colcount = 0; for (auto it = trials.begin(); it != trials.end(); it++) { // add location to landmark data structure cv::Point3f p = cv::Point3f(pts3D.at<float>(0, colcount), pts3D.at<float>(1, colcount), pts3D.at<float>(2, colcount)); it->setLocation(p); colcount++; // add initial value of land mark to factor graph data structure graph.addLandMark(landmarkID, p); // move from trail to true landmarks landmarks[landmarkID] = *it; // add factors int curframe = it->getStartFrame(); for (int i = 0; i < it->getTraceSize(); i++) { cv::KeyPoint p1, p2; it->getPointPair(i, p1, p2); graph.addStereo(curframe, landmarkID, p1.pt, p2.pt); curframe++; } landmarkID++; } trials.clear(); }
void Model::toXml(QTextStream &stream, QString indent, QString extraAttributes) const { stream << indent; stream << QString("<model id=\"%1\" name=\"%2\" sampleRate=\"%3\" start=\"%4\" end=\"%5\" %6/>\n") .arg(getObjectExportId(this)) .arg(encodeEntities(objectName())) .arg(getSampleRate()) .arg(getStartFrame()) .arg(getEndFrame()) .arg(extraAttributes); }
void PointsFileSystem::navigateToPreviousFrame() { int current_frame = getDisplayFirstFrame()->getFrame(); if (current_frame == getStartFrame()) return; int prev_frame = current_frame - 1; hideAndShowPointCloud(current_frame, prev_frame); return; }
bool GAFObject::gotoAndPlay(const std::string& frameLabel) { uint32_t f = getStartFrame(frameLabel); if (IDNONE == f) { uint32_t frameNumber = atoi(frameLabel.c_str()); if (frameNumber == 0) { return false; } return gotoAndPlay(frameNumber - 1); } return gotoAndPlay(f); }
bool GAFAnimation::playSequence(const char * name, bool looped, bool _resume, AnimSetSequenceHint hint) { if (!m_asset) { return false; } if (!name) { return false; } int s = getStartFrame(name); int e = getEndFrame(name); if (-1 == s || -1 == e) { return false; } m_currentSequenceStart = s; m_currentSequenceEnd = e; if (_currentFrameIndex < m_currentSequenceStart || _currentFrameIndex >m_currentSequenceEnd) { _currentFrameIndex = m_currentSequenceStart; } else { if (hint == ASSH_RESTART) { _currentFrameIndex = m_currentSequenceStart; } else { // new hints may appear } } setLooped(looped); if (_resume) { resumeAnimation(); } else { stop(); } return true; }
bool GAFObject::playSequence(const std::string& name, bool looped, bool resume /*= true*/) { if (!m_asset || !m_timeline) { return false; } if (name.empty()) { return false; } uint32_t s = getStartFrame(name); uint32_t e = getEndFrame(name); if (IDNONE == s || IDNONE == e) { return false; } m_currentSequenceStart = s; m_currentSequenceEnd = e; m_currentFrame = m_isReversed ? (e - 1) : (s); setLooped(looped, false); if (resume) { resumeAnimation(); } else { stop(); } return true; }
//! renders the node. void CAnimatedMeshSceneNode::render() { video::IVideoDriver* driver = SceneManager->getVideoDriver(); if (!Mesh || !driver) return; bool isTransparentPass = SceneManager->getSceneNodeRenderPass() == scene::ESNRP_TRANSPARENT; ++PassCount; s32 frame = getFrameNr(); scene::IMesh* m = Mesh->getMesh(frame, 255, StartFrame, EndFrame); if ( 0 == m ) { #ifdef _DEBUG os::Printer::log("Animated Mesh returned no mesh to render.", Mesh->getDebugName(), ELL_WARNING); #endif } driver->setTransform(video::ETS_WORLD, AbsoluteTransformation); u32 i,g; // update all dummy transformation nodes if (!JointChildSceneNodes.empty() && Mesh && (Mesh->getMeshType() == EAMT_MS3D || Mesh->getMeshType() == EAMT_X || Mesh->getMeshType() == EAMT_B3D )) { IAnimatedMeshMS3D* amm = (IAnimatedMeshMS3D*)Mesh; core::matrix4* m; for ( i=0; i< JointChildSceneNodes.size(); ++i) if (JointChildSceneNodes[i]) { m = amm->getMatrixOfJoint(i, frame); if (m) JointChildSceneNodes[i]->getRelativeTransformationMatrix() = *m; } } if (Shadow && PassCount==1) Shadow->setMeshToRenderFrom(m); // for debug purposes only: u32 renderMeshes = 1; video::SMaterial mat; if (DebugDataVisible && PassCount==1) { // overwrite half transparency if ( DebugDataVisible & scene::EDS_HALF_TRANSPARENCY ) { for ( g=0; g<m->getMeshBufferCount(); ++g) { mat = Materials[g]; mat.MaterialType = video::EMT_TRANSPARENT_ADD_COLOR; driver->setMaterial(mat); driver->drawMeshBuffer ( m->getMeshBuffer ( g ) ); } renderMeshes = 0; } } // render original meshes if ( renderMeshes ) { for ( i=0; i<m->getMeshBufferCount(); ++i) { video::IMaterialRenderer* rnd = driver->getMaterialRenderer(Materials[i].MaterialType); bool transparent = (rnd && rnd->isTransparent()); // only render transparent buffer if this is the transparent render pass // and solid only in solid pass if (transparent == isTransparentPass) { scene::IMeshBuffer* mb = m->getMeshBuffer(i); driver->setMaterial(Materials[i]); driver->drawMeshBuffer(mb); } } } // for debug purposes only: if (DebugDataVisible && PassCount==1) { mat.Lighting = false; driver->setMaterial(mat); // show bounding box if ( DebugDataVisible & scene::EDS_BBOX_BUFFERS ) { for ( g=0; g< m->getMeshBufferCount(); ++g) { driver->draw3DBox( m->getMeshBuffer(g)->getBoundingBox(), video::SColor(0,190,128,128) ); } } if ( DebugDataVisible & scene::EDS_BBOX ) driver->draw3DBox(Box, video::SColor(0,255,255,255)); // show skeleton if ( DebugDataVisible & scene::EDS_SKELETON ) { if (Mesh->getMeshType() == EAMT_X) { // draw skeleton const core::array<core::vector3df>* ds = ((IAnimatedMeshX*)Mesh)->getDrawableSkeleton(frame); for ( g=0; g < ds->size(); g +=2 ) driver->draw3DLine((*ds)[g], (*ds)[g+1], video::SColor(0,51,66,255)); } // show tag for quake3 models if (Mesh->getMeshType() == EAMT_MD3 ) { IAnimatedMesh * arrow = SceneManager->addArrowMesh ( "__tag_show", 4, 8, 5.f, 4.f, 0.5f, 1.f, 0xFF0000FF, 0xFF000088 ); if ( 0 == arrow ) { arrow = SceneManager->getMesh ( "__tag_show" ); } IMesh *arrowMesh = arrow->getMesh ( 0 ); video::SMaterial material; material.Lighting = false; driver->setMaterial(material); core::matrix4 m; SMD3QuaterionTagList *taglist = ((IAnimatedMeshMD3*)Mesh)->getTagList ( getFrameNr(), 255, getStartFrame (), getEndFrame () ); if ( taglist ) { for ( u32 g = 0; g != taglist->size(); ++g ) { (*taglist)[g].setto ( m ); driver->setTransform(video::ETS_WORLD, m ); for ( u32 a = 0; a != arrowMesh->getMeshBufferCount(); ++a ) driver->drawMeshBuffer ( arrowMesh->getMeshBuffer ( a ) ); } } } } // show normals if ( DebugDataVisible & scene::EDS_NORMALS ) { IAnimatedMesh * arrow = SceneManager->addArrowMesh ( "__debugnormal", 4, 8, 1.f, 0.6f, 0.05f, 0.3f, 0xFFECEC00, 0xFF999900 ); if ( 0 == arrow ) { arrow = SceneManager->getMesh ( "__debugnormal" ); } IMesh *mesh = arrow->getMesh ( 0 ); // find a good scaling factor core::matrix4 m2; // draw normals for ( g=0; g<m->getMeshBufferCount(); ++g) { scene::IMeshBuffer* mb = m->getMeshBuffer(g); const u32 vSize = mb->getVertexPitch(); const video::S3DVertex* v = ( const video::S3DVertex*)mb->getVertices(); for ( i = 0; i != mb->getVertexCount(); ++i ) { AlignToUpVector ( m2, v->Normal ); AbsoluteTransformation.transformVect ( m2.pointer(), v->Pos ); driver->setTransform(video::ETS_WORLD, m2 ); for ( u32 a = 0; a != mesh->getMeshBufferCount(); ++a ) driver->drawMeshBuffer ( mesh->getMeshBuffer ( a ) ); v = (const video::S3DVertex*) ( (u8*) v + vSize ); } } driver->setTransform(video::ETS_WORLD, AbsoluteTransformation); } // show mesh if ( DebugDataVisible & scene::EDS_MESH_WIRE_OVERLAY ) { mat.Lighting = false; mat.Wireframe = true; driver->setMaterial(mat); for ( g=0; g<m->getMeshBufferCount(); ++g) { driver->drawMeshBuffer ( m->getMeshBuffer ( g ) ); } } } }