diff --git a/panda/src/grutil/ffmpegTexture.cxx b/panda/src/grutil/ffmpegTexture.cxx index e0725843bd..afa4297b0a 100644 --- a/panda/src/grutil/ffmpegTexture.cxx +++ b/panda/src/grutil/ffmpegTexture.cxx @@ -46,6 +46,7 @@ FFMpegTexture(const FFMpegTexture ©) : VideoTexture(copy), _pages(copy._pages) { + nassertv(false); } //////////////////////////////////////////////////////////////////// @@ -59,8 +60,8 @@ FFMpegTexture:: } //////////////////////////////////////////////////////////////////// -// Function: FFMpegTexture::make_copy -// Access: Published, Virtual +// Function: FFMpegTexture::do_make_copy +// Access: Protected, Virtual // Description: Returns a new copy of the same Texture. This copy, // if applied to geometry, will be copied into texture // as a separate texture from the original, so it will @@ -72,10 +73,23 @@ FFMpegTexture:: // original. //////////////////////////////////////////////////////////////////// PT(Texture) FFMpegTexture:: -make_copy() { - return new FFMpegTexture(*this); +do_make_copy() { + PT(FFMpegTexture) tex = new FFMpegTexture(get_name()); + tex->do_assign(*this); + + return tex.p(); } +//////////////////////////////////////////////////////////////////// +// Function: FFMpegTexture::do_assign +// Access: Protected +// Description: Implements make_copy(). +//////////////////////////////////////////////////////////////////// +void FFMpegTexture:: +do_assign(const FFMpegTexture ©) { + VideoTexture::do_assign(copy); + _pages = copy._pages; +} //////////////////////////////////////////////////////////////////// // Function: FFMPegTexture::modify_page @@ -95,15 +109,15 @@ modify_page(int z) { } //////////////////////////////////////////////////////////////////// -// Function: FFmpegTexture::reconsider_video_properties +// Function: FFmpegTexture::do_reconsider_video_properties // Access: Private // Description: Resets the internal Texture properties when a new // video file is loaded. Returns true if the new image // is valid, false otherwise. //////////////////////////////////////////////////////////////////// bool FFMpegTexture:: -reconsider_video_properties(const FFMpegTexture::VideoStream &stream, - int num_components, int z) { +do_reconsider_video_properties(const FFMpegTexture::VideoStream &stream, + int num_components, int z) { double frame_rate = 0.0f; int num_frames = 0; if (!stream._codec_context) { @@ -146,8 +160,8 @@ reconsider_video_properties(const FFMpegTexture::VideoStream &stream, << y_size << " texels.\n"; } - if (!reconsider_image_properties(x_size, y_size, num_components, - T_unsigned_byte, z)) { + if (!do_reconsider_image_properties(x_size, y_size, num_components, + T_unsigned_byte, z)) { return false; } @@ -334,12 +348,12 @@ do_read_one(const Filename &fullpath, const Filename &alpha_fullpath, set_name(fullpath.get_basename_wo_extension()); } if (!has_filename()) { - set_filename(fullpath); - set_alpha_filename(alpha_fullpath); + _filename = fullpath; + _alpha_filename = alpha_fullpath; } - set_fullpath(fullpath); - set_alpha_fullpath(alpha_fullpath); + _fullpath = fullpath; + _alpha_fullpath = alpha_fullpath; } if (page._color._codec_context->pix_fmt==PIX_FMT_RGBA32) { // There had better not be an alpha interleave here. @@ -347,7 +361,7 @@ do_read_one(const Filename &fullpath, const Filename &alpha_fullpath, _primary_file_num_channels = 4; _alpha_file_channel = 0; - if (!reconsider_video_properties(page._color, 4, z)) { + if (!do_reconsider_video_properties(page._color, 4, z)) { page._color.clear(); return false; } @@ -357,18 +371,18 @@ do_read_one(const Filename &fullpath, const Filename &alpha_fullpath, _alpha_file_channel = alpha_file_channel; if (page._alpha.is_valid()) { - if (!reconsider_video_properties(page._color, 4, z)) { + if (!do_reconsider_video_properties(page._color, 4, z)) { page._color.clear(); page._alpha.clear(); return false; } - if (!reconsider_video_properties(page._alpha, 4, z)) { + if (!do_reconsider_video_properties(page._alpha, 4, z)) { page._color.clear(); page._alpha.clear(); return false; } } else { - if (!reconsider_video_properties(page._color, 3, z)) { + if (!do_reconsider_video_properties(page._color, 3, z)) { page._color.clear(); page._alpha.clear(); return false; diff --git a/panda/src/grutil/ffmpegTexture.h b/panda/src/grutil/ffmpegTexture.h index f35b4a2fe7..4476ad341c 100644 --- a/panda/src/grutil/ffmpegTexture.h +++ b/panda/src/grutil/ffmpegTexture.h @@ -38,12 +38,13 @@ protected: PUBLISHED: virtual ~FFMpegTexture(); - virtual PT(Texture) make_copy(); - public: static PT(Texture) make_texture(); protected: + virtual PT(Texture) do_make_copy(); + void do_assign(const FFMpegTexture ©); + virtual void update_frame(int frame); virtual bool do_read_one(const Filename &fullpath, const Filename &alpha_fullpath, int z, int n, int primary_file_num_channels, int alpha_file_channel, @@ -56,8 +57,8 @@ private: class VideoStream; VideoPage &modify_page(int z); - bool reconsider_video_properties(const VideoStream &stream, - int num_components, int z); + bool do_reconsider_video_properties(const VideoStream &stream, + int num_components, int z); void do_update(); class VideoStream { diff --git a/panda/src/grutil/movieTexture.cxx b/panda/src/grutil/movieTexture.cxx index f96f3a62c4..2fc31a263d 100644 --- a/panda/src/grutil/movieTexture.cxx +++ b/panda/src/grutil/movieTexture.cxx @@ -421,6 +421,8 @@ do_make_copy() { //////////////////////////////////////////////////////////////////// void MovieTexture:: do_assign(const MovieTexture ©) { + Texture::do_assign(copy); + // Since 'make_copy' can be a slow operation, // I release the read lock before calling make_copy. diff --git a/panda/src/grutil/openCVTexture.cxx b/panda/src/grutil/openCVTexture.cxx index 64e7c110d5..6dcccbd723 100644 --- a/panda/src/grutil/openCVTexture.cxx +++ b/panda/src/grutil/openCVTexture.cxx @@ -46,6 +46,7 @@ OpenCVTexture(const OpenCVTexture ©) : VideoTexture(copy), _pages(copy._pages) { + nassertv(false); } //////////////////////////////////////////////////////////////////// @@ -58,8 +59,8 @@ OpenCVTexture:: } //////////////////////////////////////////////////////////////////// -// Function: OpenCVTexture::make_copy -// Access: Published, Virtual +// Function: OpenCVTexture::do_make_copy +// Access: Protected, Virtual // Description: Returns a new copy of the same Texture. This copy, // if applied to geometry, will be copied into texture // as a separate texture from the original, so it will @@ -71,8 +72,22 @@ OpenCVTexture:: // original. //////////////////////////////////////////////////////////////////// PT(Texture) OpenCVTexture:: -make_copy() { - return new OpenCVTexture(*this); +do_make_copy() { + PT(OpenCVTexture) tex = new OpenCVTexture(get_name()); + tex->do_assign(*this); + + return tex.p(); +} + +//////////////////////////////////////////////////////////////////// +// Function: OpenCVTexture::do_assign +// Access: Protected +// Description: Implements make_copy(). +//////////////////////////////////////////////////////////////////// +void OpenCVTexture:: +do_assign(const OpenCVTexture ©) { + VideoTexture::do_assign(copy); + _pages = copy._pages; } //////////////////////////////////////////////////////////////////// @@ -85,7 +100,7 @@ make_copy() { //////////////////////////////////////////////////////////////////// bool OpenCVTexture:: from_camera(int camera_index, int z) { - if (!reconsider_z_size(z)) { + if (!do_reconsider_z_size(z)) { return false; } nassertr(z >= 0 && z < get_z_size(), false); @@ -96,7 +111,7 @@ from_camera(int camera_index, int z) { return false; } - if (!reconsider_video_properties(page._color, 3, z)) { + if (!do_reconsider_video_properties(page._color, 3, z)) { page._color.clear(); return false; } @@ -125,14 +140,14 @@ modify_page(int z) { } //////////////////////////////////////////////////////////////////// -// Function: OpenCVTexture::reconsider_video_properties +// Function: OpenCVTexture::do_reconsider_video_properties // Access: Private // Description: Resets the internal Texture properties when a new // video file is loaded. Returns true if the new image // is valid, false otherwise. //////////////////////////////////////////////////////////////////// bool OpenCVTexture:: -reconsider_video_properties(const OpenCVTexture::VideoStream &stream, +do_reconsider_video_properties(const OpenCVTexture::VideoStream &stream, int num_components, int z) { double frame_rate = 0.0f; int num_frames = 0; @@ -164,7 +179,7 @@ reconsider_video_properties(const OpenCVTexture::VideoStream &stream, << y_size << " texels.\n"; } - if (!reconsider_image_properties(x_size, y_size, num_components, + if (!do_reconsider_image_properties(x_size, y_size, num_components, T_unsigned_byte, z)) { return false; } @@ -334,7 +349,7 @@ do_read_one(const Filename &fullpath, const Filename &alpha_fullpath, if (alpha_fullpath.empty()) { // Only one RGB movie. - if (!reconsider_video_properties(page._color, 3, z)) { + if (!do_reconsider_video_properties(page._color, 3, z)) { page._color.clear(); return false; } @@ -343,13 +358,13 @@ do_read_one(const Filename &fullpath, const Filename &alpha_fullpath, // An RGB movie combined with an alpha movie. _alpha_file_channel = alpha_file_channel; - if (!reconsider_video_properties(page._color, 4, z)) { + if (!do_reconsider_video_properties(page._color, 4, z)) { page._color.clear(); page._alpha.clear(); return false; } - if (!reconsider_video_properties(page._alpha, 4, z)) { + if (!do_reconsider_video_properties(page._alpha, 4, z)) { page._color.clear(); page._alpha.clear(); return false; diff --git a/panda/src/grutil/openCVTexture.h b/panda/src/grutil/openCVTexture.h index a3292896a5..8bebe2d0e5 100644 --- a/panda/src/grutil/openCVTexture.h +++ b/panda/src/grutil/openCVTexture.h @@ -39,14 +39,15 @@ protected: PUBLISHED: virtual ~OpenCVTexture(); - virtual PT(Texture) make_copy(); - bool from_camera(int camera_index = -1, int z = 0); public: static PT(Texture) make_texture(); protected: + virtual PT(Texture) do_make_copy(); + void do_assign(const FFMpegTexture ©); + virtual void update_frame(int frame); virtual bool do_read_one(const Filename &fullpath, const Filename &alpha_fullpath, @@ -60,8 +61,8 @@ private: class VideoStream; VideoPage &modify_page(int z); - bool reconsider_video_properties(const VideoStream &stream, - int num_components, int z); + bool do_reconsider_video_properties(const VideoStream &stream, + int num_components, int z); void do_update(); class VideoStream {