⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 moviedata.cpp

📁 最新osg包
💻 CPP
字号:
/* *  MovieData.cpp *  lala * *  Created by Stephan Huber on Wed Mar 10 2004. *  Copyright (c) 2004 __MyCompanyName__. All rights reserved. * */#include <osg/GL>#include <osg/Endian>#include <osgDB/FileNameUtils>#include "MovieData.h"#include "QTUtils.h"    MovieData::MovieData() : _pointer(NULL), _movie(NULL), _gw(NULL), _fError(false), _isLooping(false){}MovieData::~MovieData(){      if (_pointer) free(_pointer);    if (_gw) DisposeGWorld(_gw);    if (_movie) {        CloseMovieFile(_resref);        DisposeMovie(_movie);    }}               void MovieData::load(osg::Image* image, std::string afilename, float startTime){    Rect bounds;    std::string filename = afilename;    if (!osgDB::isFileNameNativeStyle(filename))         filename = osgDB::convertFileNameToNativeStyle(filename);    osg::notify(osg::INFO) << "MovieData :: opening movie '" << filename << "'" << std::endl;        OSStatus err = MakeMovieFromPath(filename.c_str(), &_movie, _resref);    if (err !=0) {        _fError = true;        osg::notify(osg::FATAL) << " MovieData :: MakeMovieFromPath failed with err " << err << std::endl;        return;    }    GetMovieBox(_movie, &bounds);    _checkMovieError("Can't get movie box\n");        OffsetRect(&bounds, -bounds.left, -bounds.top);    SetMovieBox(_movie, &bounds);    _checkMovieError("Can't set movie box\n");    _movieWidth = bounds.right;    _movieHeight = bounds.bottom;        _timescale = (float)GetMovieTimeScale(_movie);    _initImage(image);    if (!_fError) _initGWorldStuff(image);            if (!_fError) {            if ( startTime == 0.0f)            GoToBeginningOfMovie(_movie);        else {            TimeValue t = (TimeValue) (startTime*_timescale);            SetMovieTimeValue(_movie,t);        }                    UpdateMovie(_movie);        SetMovieRate(_movie,0);        SetMovieActive(_movie, true);        UpdateMovie(_movie);        MoviesTask(_movie,0);    }}// ---------------------------------------------------------------------------// _intImage// create image for storing// ---------------------------------------------------------------------------void MovieData::_initImage(osg::Image* image){    void* buffer;        _textureWidth = ((_movieWidth + 7) >> 3) << 3;    _textureHeight = _movieHeight;        // some magic alignment...     _pointer = (char*)malloc(4 * _textureWidth * _textureHeight + 32);    if (_pointer == NULL) {        osg::notify(osg::FATAL) << "MovieData: " << "Can't allocate texture buffer" << std::endl;        _fError= true;    }    buffer = (void*)(((unsigned long)(_pointer + 31) >> 5) << 5);    GLenum internalFormat = (osg::getCpuByteOrder()==osg::BigEndian)?                            GL_UNSIGNED_INT_8_8_8_8_REV :                            GL_UNSIGNED_INT_8_8_8_8;    image->setImage(_textureWidth,_textureHeight,1,                   (GLint) GL_RGBA8,                   (GLenum)GL_BGRA_EXT,                   internalFormat,                   (unsigned char*) buffer,osg::Image::NO_DELETE,4);}// ---------------------------------------------------------------------------// _initGWorldStuff// init gworld-stuff, so quicktime can play the movie into the gWorld.// ---------------------------------------------------------------------------void MovieData::_initGWorldStuff(osg::Image * image)  {    Rect textureBounds;    OSStatus err;    GDHandle        origDevice;    CGrafPtr        origPort;    PixMapHandle pixmap = NULL;    textureBounds.left = 0;    textureBounds.top = 0;    textureBounds.right = image->s();    textureBounds.bottom = image->t();    err = QTNewGWorldFromPtr(&_gw, k32ARGBPixelFormat, &textureBounds, NULL, NULL, 0, image->data(), 4 * image->s());        if (err !=0 )        osg::notify(osg::FATAL) << "MovieData : Could not create gWorld" << std::endl;            GetGWorld (&origPort, &origDevice);    SetGWorld(_gw, NULL);                                         // set current graphics port to offscreen    SetMovieGWorld(_movie, (CGrafPtr)_gw, NULL);        _checkMovieError("SetMovieGWorld failed");    pixmap = GetGWorldPixMap (_gw);    if (pixmap)    {        if (!LockPixels (pixmap))                                        // lock offscreen pixel map        {            osg::notify(osg::FATAL) << "Could not lock PixMap" << std::endl;            ExitToShell ();        }    }    else    {        osg::notify(osg::FATAL) << "Could not GetGWorldPixMap" << std::endl;        ExitToShell ();    }    SetGWorld(origPort, origDevice);}void MovieData::setMovieTime(float atime) {    float time = (atime > getMovieDuration()) ? getMovieDuration() : atime;        TimeValue t = (TimeValue) (time * _timescale);    SetMovieTimeValue(_movie,t);    _checkMovieError("setMovieTime failed");    UpdateMovie(_movie);    MoviesTask(_movie,0);            }void MovieData::setMovieRate(float rate) {     // osg::notify(osg::ALWAYS) << "new movierate: " << rate << " current: " << getMovieRate() << std::endl;    _movieRate = rate;    if ((rate != 0) && (_preRolled == false)) {        PrerollMovie(_movie, GetMovieTime(_movie,NULL), X2Fix(rate));        _checkMovieError("PrerollMovie failed");        _preRolled = true;    }        SetMovieRate(_movie, X2Fix(rate));     _checkMovieError("setMovieRate failed");    MoviesTask(_movie, 0);    _checkMovieError("MoviesTask failed");        UpdateMovie(_movie);    _checkMovieError("UpdateMovie failed");}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -