Example #1
0
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;
}
Example #3
0
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);
}
Example #7
0
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();
}
Example #8
0
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;
}
Example #10
0
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;
}
Example #12
0
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 ) );
            }
        }
    }
}