瀏覽代碼

Working version checked in. TODO: Lots of documentation. Finish implementation of javascript callback methods.

Bei Yang 15 年之前
父節點
當前提交
fb9d65b149
共有 2 個文件被更改,包括 314 次插入0 次删除
  1. 233 0
      panda/src/awesomium/WebBrowserTexture.cxx
  2. 81 0
      panda/src/awesomium/WebBrowserTexture.h

+ 233 - 0
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 &copy):
+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;
+}

+ 81 - 0
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 &copy);
+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