diff --git a/panda/src/awesomium/WebBrowserTexture.cxx b/panda/src/awesomium/WebBrowserTexture.cxx new file mode 100644 index 0000000000..9b89c5b3eb --- /dev/null +++ b/panda/src/awesomium/WebBrowserTexture.cxx @@ -0,0 +1,233 @@ +// Filename: WebBrowserTexture.cxx +// Created by: bei yang (Mar 2010) +// +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) Carnegie Mellon University. All rights reserved. +// +// All use of this software is subject to the terms of the revised BSD +// license. You should have received a copy of this license along +// with this source code in a file named "LICENSE." +// +//////////////////////////////////////////////////////////////////// + +#include "config_awesomium.h" +#include "WebBrowserTexture.h" + +TypeHandle WebBrowserTexture::_type_handle; + +//////////////////////////////////////////////////////////////////// +// Function: WebBrowserTexture::WebBrowserTexture +// Access: Published +// Description: Copy constructor for web browser texture. The behavior +// of copying a webtexture is that will be the same +// as a standard texture copy. However, the content +// will remain the system until set_web_view is called. +//////////////////////////////////////////////////////////////////// +WebBrowserTexture::WebBrowserTexture(const WebBrowserTexture ©): +Texture(copy) +{ + //this kind of assumes that the previous texture + //was initialized properly + _aw_web_view = copy._aw_web_view; + _update_active = copy._update_active; + _flip_texture_active = copy._flip_texture_active; +} + +//////////////////////////////////////////////////////////////////// +// Function: WebBrowserTexture::WebBrowserTexture +// Access: Published +// Description: This initializes a web browser texture with the given +// AwWebView class. +//////////////////////////////////////////////////////////////////// +WebBrowserTexture::WebBrowserTexture(const string &name, AwWebView* aw_web_view): +Texture(name), +_update_active(true), +_flip_texture_active(false) +{ + set_web_view(aw_web_view); + set_minfilter(FT_linear); + set_magfilter(FT_linear); + +} + +//////////////////////////////////////////////////////////////////// +// Function: WebBrowserTexture::~WebBrowserTexture +// Access: Published +// Description: Standard destructor... doesn't do anything. All +// destructing happens in parent texture class. +//////////////////////////////////////////////////////////////////// +WebBrowserTexture::~WebBrowserTexture() +{ + //do nothing +} + + +//////////////////////////////////////////////////////////////////// +// Function: WebBrowserTexture::~WebBrowserTexture +// Access: Published +// Description: Standard destructor... doesn't do anything. All +// destructing happens in parent texture class. +//////////////////////////////////////////////////////////////////// +bool WebBrowserTexture::get_keep_ram_image() const { + return true; +} + +//////////////////////////////////////////////////////////////////// +// Function: WebBrowserTexture::reload_ram_image +// Access: Protected, Virtual +// Description: A WebBrowserTexture must always keep its ram image. +// This is essentially a sub. +//////////////////////////////////////////////////////////////////// +void WebBrowserTexture::do_reload_ram_image() { + // A MovieTexture should never dump its RAM image. + // Therefore, this is not needed. +} + +//////////////////////////////////////////////////////////////////// +// Function: WebBrowserTexture::has_cull_callback +// Access: Public, Virtual +// Description: Should be overridden by derived classes to return +// true if cull_callback() has been defined. Otherwise, +// returns false to indicate cull_callback() does not +// need to be called for this node during the cull +// traversal. +// +// This one returns true because it uses +// the cull traverser method to do the texture udpate. +//////////////////////////////////////////////////////////////////// +bool WebBrowserTexture::has_cull_callback() const { + return true; +} + +//////////////////////////////////////////////////////////////////// +// Function: WebBrowserTexture::set_web_view +// Access: Published +// Description: Sets the internal AwWebView of this texture. +// After calling this, the texture will automatically +// set it's width and height to match the AwWebView +// at the next time it is culled and rendered. +//////////////////////////////////////////////////////////////////// +void WebBrowserTexture::set_web_view(AwWebView* aw_web_view){ + _aw_web_view = aw_web_view; +} + + +//////////////////////////////////////////////////////////////////// +// Function: WebBrowserTexture::get_web_view +// Access: Published +// Description: Gets the current internal AwWebView of this texture. +//////////////////////////////////////////////////////////////////// +AwWebView* WebBrowserTexture::get_web_view() const{ + return _aw_web_view; +} + + +//////////////////////////////////////////////////////////////////// +// Function: WebBrowserTexture::set_update_active +// Access: Published +// Description: Gives the ability to toggle updating this texture +// or not. This can be disabled to improve performance +// so that only the one that needs to be active is +// active. +//////////////////////////////////////////////////////////////////// +void WebBrowserTexture::set_update_active(bool active_flag){ + _update_active = active_flag; +} + + +//////////////////////////////////////////////////////////////////// +// Function: WebBrowserTexture::get_update_active +// Access: Published +// Description: Gets whether or not this texture is updating +// itself every time it is rendered. +//////////////////////////////////////////////////////////////////// +bool WebBrowserTexture::get_update_active() const{ + return _update_active; +} + + +//////////////////////////////////////////////////////////////////// +// Function: WebBrowserTexture::set_flip_texture_active +// Access: Published +// Description: This toggles on/off automatic flipping of the +// of the texture at a source level. Awesomium renders +// things that are flipped vertically. This enables +// automatic flipping of that. +// +// Since it is doing byte manipulation, this can get +// rather slow. Turning this on should be avoided. +// Instead, flipping should be taken care of via UV +// coordinates or shaders. +//////////////////////////////////////////////////////////////////// +void WebBrowserTexture::set_flip_texture_active(bool active_flag){ + _flip_texture_active = active_flag; +} + +//////////////////////////////////////////////////////////////////// +// Function: WebBrowserTexture::get_flip_texture_active +// Access: Published +// Description: Returns whether automatic texture flipping is +// enabled. +//////////////////////////////////////////////////////////////////// +bool WebBrowserTexture::get_flip_texture_active() const { + return _flip_texture_active; +} + + +//////////////////////////////////////////////////////////////////// +// Function: WebBrowserTexture::cull_callback +// Access: Public, Virtual +// Description: This function will be called during the cull +// traversal to update the WebBrowserTexture. This +// method calls the render method of AwWebView but +// does not call the update method of AwWebCore. +//////////////////////////////////////////////////////////////////// +bool WebBrowserTexture::cull_callback(CullTraverser *trav, const CullTraverserData &data) const{ + //see if we are in a state where udpates can happen. else just return + if( !_update_active ) return true; + if( _aw_web_view == NULL ) return true; + + //do we even need to update? + if( !_aw_web_view->is_dirty() ) return true; + + //see if we're the same size, if not we need to make sure this texture + //matches the webview + if( _aw_web_view->get_width() != get_x_size() || _aw_web_view->get_height() != get_y_size() || get_texture_type() != TT_2d_texture){ + //these casts are so dirty especially when the method itself is + //labled as const. Really Texture::cull_callback should be not const + //first clean up + ((WebBrowserTexture*)this)->clear_ram_mipmap_images(); + ((WebBrowserTexture*)this)->clear_ram_image(); + //now set up the texture again + ((WebBrowserTexture*)this)->setup_2d_texture( _aw_web_view->get_width(), _aw_web_view->get_height(), T_unsigned_byte, F_rgba ); + //should be good to go at this point + } + + //get the pointer + PTA_uchar ram_image = ((WebBrowserTexture*)this)->modify_ram_image(); + unsigned char* cp_data = ram_image.p(); + //render it + _aw_web_view->render((void*)cp_data, get_x_size()*4, 4); + + if(_flip_texture_active){ + //flips the texture around... this is super slow. Really this should + //never be enabled. However beginners might find this useful + size_t width = get_x_size(); + size_t height = get_y_size(); + for(size_t i=0; i < height/2; i++){ + for(size_t j=0; j < width; j++){ + unsigned char tmp[4]; + size_t a_pos = j+width*i; + size_t b_pos = j + width*(height-i-1); + memcpy(tmp,&cp_data[4*a_pos], 4); //tmp = a + memcpy(&cp_data[4*a_pos], &cp_data[4*b_pos], 4); //a = b + memcpy(&cp_data[4*b_pos], tmp, 4); //b = tmp + } + } + } + //success + return true; +} \ No newline at end of file diff --git a/panda/src/awesomium/WebBrowserTexture.h b/panda/src/awesomium/WebBrowserTexture.h new file mode 100644 index 0000000000..61d2487cee --- /dev/null +++ b/panda/src/awesomium/WebBrowserTexture.h @@ -0,0 +1,81 @@ +// Filename: WebBrowserTexture.h +// Created by: Bei Yang (03Aug2010) +// +//////////////////////////////////////////////////////////////////// +// +// PANDA 3D SOFTWARE +// Copyright (c) Carnegie Mellon University. All rights reserved. +// +// All use of this software is subject to the terms of the revised BSD +// license. You should have received a copy of this license along +// with this source code in a file named "LICENSE." +// +//////////////////////////////////////////////////////////////////// + +#ifndef WebBrowserTexture_H +#define WebBrowserTexture_H + +#include "pandabase.h" +#include "texture.h" +#include "awWebView.h" + + +//////////////////////////////////////////////////////////////////// +// Class : WebBrowserTexture +// Description : A Wrapper class for Awesomium webview. This +// implements most of Awesomium's features and +// updates on the cull_traverser callback much +// much like a movie texture. +// +// The use of class means that you will have to +// follow Awesomium license agreement give below +// http://www.khrona.com/products/awesomium/licensing/ +//////////////////////////////////////////////////////////////////// +class EXPCL_PANDAAWESOMIUM WebBrowserTexture : public Texture { +protected: + AwWebView* _aw_web_view; + bool _update_active; + bool _flip_texture_active; + +//Constructors & Destructors ------------ +private: + WebBrowserTexture(const WebBrowserTexture ©); +PUBLISHED: + WebBrowserTexture(const string &name, AwWebView* aw_web_view = NULL); + virtual ~WebBrowserTexture(); + + +//methods -------------- +protected: + bool get_keep_ram_image() const; + void do_reload_ram_image(); +public: + virtual bool has_cull_callback() const; + virtual bool cull_callback(CullTraverser *trav, const CullTraverserData &data) const; +PUBLISHED: + void set_web_view(AwWebView* aw_web_view); + AwWebView* get_web_view() const; + void set_update_active(bool active_flag); + bool get_update_active() const; + void set_flip_texture_active(bool active_flag); + bool get_flip_texture_active() const; + +//Type handles ---------------- +public: + static TypeHandle get_class_type() { + return _type_handle; + } + static void init_type() { + Texture::init_type(); + register_type(_type_handle, "WebBrowserTexture", + Texture::get_class_type()); + } + virtual TypeHandle get_type() const { + return get_class_type(); + } + virtual TypeHandle force_init_type() {init_type(); return get_class_type();} + +private: + static TypeHandle _type_handle; +}; +#endif