diff --git a/panda/src/grutil/config_grutil.cxx b/panda/src/grutil/config_grutil.cxx index edd05e8c53..0964377788 100644 --- a/panda/src/grutil/config_grutil.cxx +++ b/panda/src/grutil/config_grutil.cxx @@ -76,7 +76,7 @@ init_libgrutil() { MovieTexture::init_type(); MovieTexture::register_with_read_factory(); TexturePool *ts = TexturePool::get_global_ptr(); - ts->register_texture_type(MovieTexture::make_texture, "dummyvideo"); + ts->register_texture_type(MovieTexture::make_texture, "inkblot dummyvideo"); #ifdef HAVE_OPENCV diff --git a/panda/src/grutil/movieTexture.cxx b/panda/src/grutil/movieTexture.cxx index e246590bff..bdba0f7ca6 100644 --- a/panda/src/grutil/movieTexture.cxx +++ b/panda/src/grutil/movieTexture.cxx @@ -30,7 +30,8 @@ TypeHandle MovieTexture::_type_handle; //////////////////////////////////////////////////////////////////// // Function: MovieTexture::Constructor // Access: Published -// Description: Sets up the texture to read frames from a camera +// Description: Creates a blank movie texture. Movies must be +// added using do_read_one or do_load_one. //////////////////////////////////////////////////////////////////// MovieTexture:: MovieTexture(const string &name) : @@ -38,6 +39,18 @@ MovieTexture(const string &name) : { } +//////////////////////////////////////////////////////////////////// +// Function: MovieTexture::Constructor +// Access: Published +// Description: Creates a texture playing the specified movie. +//////////////////////////////////////////////////////////////////// +MovieTexture:: +MovieTexture(PT(MovieVideo) video) : + Texture(video->get_name()) +{ + do_load_one(video, NULL, 0); +} + //////////////////////////////////////////////////////////////////// // Function: MovieTexture::CData::Constructor // Access: public @@ -81,9 +94,9 @@ MovieTexture:: MovieTexture(const MovieTexture ©) : Texture(copy) { - // Since 'get_video' can be a slow operation, - // I release the read lock before calling get_video. - + // Since 'make_copy' can be a slow operation, + // I release the read lock before calling make_copy. + pvector color; pvector alpha; { @@ -101,10 +114,10 @@ MovieTexture(const MovieTexture ©) : cdata->_pages.resize(color.size()); for (int i=0; i<(int)(color.size()); i++) { if (color[i]) { - cdata->_pages[i]._color = color[i]->get_source()->get_video(0.0); + cdata->_pages[i]._color = color[i]->make_copy(); } if (alpha[i]) { - cdata->_pages[i]._alpha = color[i]->get_source()->get_video(0.0); + cdata->_pages[i]._alpha = color[i]->make_copy(); } } } @@ -218,35 +231,26 @@ bool MovieTexture:: do_read_one(const Filename &fullpath, const Filename &alpha_fullpath, int z, int n, int primary_file_num_channels, int alpha_file_channel, bool header_only, BamCacheRecord *record) { + + nassertr(n == 0, false); + nassertr(z >= 0 && z < get_z_size(), false); + if (record != (BamCacheRecord *)NULL) { record->add_dependent_file(fullpath); } - nassertr(n == 0, false); - nassertr(z >= 0 && z < get_z_size(), false); - - PT(Movie) color; - PT(MovieVideo) color_video; - PT(Movie) alpha; - PT(MovieVideo) alpha_video; - - color = Movie::load(fullpath); + PT(MovieVideo) color; + PT(MovieVideo) alpha; + + color = MovieVideo::load(fullpath); if (color == 0) { return false; } - color_video = color->get_video(0.0); - if (color_video == 0) { - return false; - } if (!alpha_fullpath.empty()) { - alpha = Movie::load(alpha_fullpath); + alpha = MovieVideo::load(alpha_fullpath); if (alpha == 0) { return false; } - alpha_video = alpha->get_video(0.0); - if (alpha_video == 0) { - return false; - } } if (z == 0) { @@ -261,23 +265,32 @@ do_read_one(const Filename &fullpath, const Filename &alpha_fullpath, set_fullpath(fullpath); set_alpha_fullpath(alpha_fullpath); } - - _primary_file_num_channels = 4; + + _primary_file_num_channels = primary_file_num_channels; _alpha_file_channel = alpha_file_channel; + return do_load_one(color, alpha, z); + + set_loaded_from_image(); +} + +//////////////////////////////////////////////////////////////////// +// Function: MovieTexture::do_load_one +// Access: Protected, Virtual +// Description: Loads movie objects into the texture. +//////////////////////////////////////////////////////////////////// +bool MovieTexture:: +do_load_one(PT(MovieVideo) color, PT(MovieVideo) alpha, int z) { + { CDWriter cdata(_cycler); cdata->_pages.resize(z+1); - cdata->_pages[z]._color = color_video; - cdata->_pages[z]._alpha = alpha_video; + cdata->_pages[z]._color = color; + cdata->_pages[z]._alpha = alpha; cdata->_pages[z]._base_clock = ClockObject::get_global_clock()->get_frame_time(); recalculate_image_properties(cdata); } - // Fetch the first frame. We ignore the timestamp - // of the first frame, and assume it starts at zero. - - set_loaded_from_image(); return true; } @@ -347,20 +360,18 @@ cull_callback(CullTraverser *, const CullTraverserData &) const { MovieVideo *alpha = cdata->_pages[i]._alpha; if (color) { double offset = delta; - if (offset > color->next_start()) { - color->seek_ahead(offset); - color->fetch_into_texture((MovieTexture*)this, i); - } else if (offset < color->last_start()) { - color = color->get_source()->get_video(offset); + if ((offset < color->last_start()) || (offset >= color->next_start())) { + if (alpha) { + color->fetch_into_texture_rgb(offset, (MovieTexture*)this, i); + } else { + color->fetch_into_texture(offset, (MovieTexture*)this, i); + } } } if (alpha) { double offset = delta; - if (offset > alpha->next_start()) { - alpha->seek_ahead(offset); - alpha->fetch_into_texture_alpha((MovieTexture*)this, i, _alpha_file_channel); - } else if (offset < alpha->last_start()) { - alpha = alpha->get_source()->get_video(offset); + if ((offset < alpha->last_start()) || (offset >= alpha->next_start())) { + alpha->fetch_into_texture_alpha(offset, (MovieTexture*)this, i, _alpha_file_channel); } } } diff --git a/panda/src/grutil/movieTexture.h b/panda/src/grutil/movieTexture.h index 5cca51a816..495952dabc 100644 --- a/panda/src/grutil/movieTexture.h +++ b/panda/src/grutil/movieTexture.h @@ -20,9 +20,7 @@ #define MOVIETEXTURE_H #include "pandabase.h" -#include "movie.h" #include "movieVideo.h" -#include "movieAudio.h" //////////////////////////////////////////////////////////////////// // Class : MovieTexture @@ -32,6 +30,7 @@ class EXPCL_PANDA_GRUTIL MovieTexture : public Texture { PUBLISHED: MovieTexture(const string &name); + MovieTexture(PT(MovieVideo) video); protected: MovieTexture(const MovieTexture ©); PUBLISHED: @@ -56,6 +55,7 @@ protected: bool header_only, BamCacheRecord *record); virtual bool do_load_one(const PNMImage &pnmimage, const string &name, int z, int n); + bool do_load_one(PT(MovieVideo) color, PT(MovieVideo) alpha, int z); class VideoPage { public: diff --git a/panda/src/movies/Sources.pp b/panda/src/movies/Sources.pp index 39542e0bfa..7a1aef8893 100644 --- a/panda/src/movies/Sources.pp +++ b/panda/src/movies/Sources.pp @@ -11,7 +11,6 @@ #define COMBINED_SOURCES $[TARGET]_composite1.cxx #define SOURCES \ - movie.h movie.I \ movieAudio.h movieAudio.I \ movieVideo.h movieVideo.I \ inkblotVideo.h inkblotVideo.I \ @@ -28,7 +27,6 @@ config_movies.cxx #define INSTALL_HEADERS \ - movie.h movie.I \ movieAudio.h movieAudio.I \ movieVideo.h movieVideo.I \ inkblotVideo.h inkblotVideo.I \