Text archives Help
- From: bigler@sci.utah.edu
- To: manta@sci.utah.edu
- Subject: [MANTA] r1032 - in trunk: Engine/Display SwigInterface
- Date: Tue, 2 May 2006 14:16:42 -0600 (MDT)
Author: bigler
Date: Tue May 2 14:16:41 2006
New Revision: 1032
Added:
trunk/Engine/Display/PureOpenGLDisplay.cc
trunk/Engine/Display/PureOpenGLDisplay.h
Modified:
trunk/Engine/Display/CMakeLists.txt
trunk/Engine/Display/OpenGLDisplay.cc
trunk/Engine/Display/OpenGLDisplay.h
trunk/Engine/Display/SyncDisplay.h
trunk/SwigInterface/manta.i
trunk/SwigInterface/wxManta.py
Log:
Engine/Display/CMakeLists.txt
Added PureOpenGLDisplay.{h,cc}
Engine/Display/OpenGLDisplay.cc
Engine/Display/OpenGLDisplay.h
All the image rendering is now done using a pointer to a
PureOpenGLDisplay class. Framerate display code is still here,
since it uses X calls to setup the fonts and render them.
Engine/Display/PureOpenGLDisplay.cc
Engine/Display/PureOpenGLDisplay.h
New class that encapsulates all the OpenGL calls needed to render
the pixel data. This code was stolen from OpenGLDisplay. You need
to use this function with an externally supplied OpenGL context.
Engine/Display/SyncDisplay.h
Added getCurrentImage function that gets access to the current_image
member variable.
SwigInterface/manta.i
Added manta_SCIRun_Exception macro that catches generic
SCIRun::Exception classes.
Added PureOpenGLDisplay and NullDisplay to the interface.
SwigInterface/wxManta.py
Use the mantaGLCanvas/PureOpenGLDisplay combo to do the rendering.
Code that depends on X is avoided.
Add an extra doneRendering when exiting. Fixes a race condition
that block some worker threads from exiting.
Character events are now honored (as we use them with a wxGLCanvas
instead of a wx.Frame). Not recongnizing the handful of characters
I gave it, though.
Modified: trunk/Engine/Display/CMakeLists.txt
==============================================================================
--- trunk/Engine/Display/CMakeLists.txt (original)
+++ trunk/Engine/Display/CMakeLists.txt Tue May 2 14:16:41 2006
@@ -8,6 +8,8 @@
Display/NullDisplay.h
Display/OpenGLDisplay.cc
Display/OpenGLDisplay.h
+ Display/PureOpenGLDisplay.cc
+ Display/PureOpenGLDisplay.h
Display/SyncDisplay.cc
Display/SyncDisplay.h
)
Modified: trunk/Engine/Display/OpenGLDisplay.cc
==============================================================================
--- trunk/Engine/Display/OpenGLDisplay.cc (original)
+++ trunk/Engine/Display/OpenGLDisplay.cc Tue May 2 14:16:41 2006
@@ -1,68 +1,22 @@
-#include <Core/Thread/Thread.h>
-
#include <Engine/Display/OpenGLDisplay.h>
+#include <Engine/Display/PureOpenGLDisplay.h>
#include <Core/XUtils/XHelper.h>
#include <Core/Exceptions/IllegalArgument.h>
#include <Core/Util/Args.h>
#include <Image/NullImage.h>
-#include <Image/Pixel.h>
-#include <Image/SimpleImage.h>
#include <Interface/Context.h>
#include <Interface/XWindow.h>
+
#include <Core/Exceptions/IllegalValue.h>
#include <Core/Exceptions/InternalError.h>
+#include <Core/Thread/Thread.h>
#include <Core/Thread/Time.h>
-#include <Core/Util/NotFinished.h>
-#include <GL/glu.h>
+#include <GL/gl.h>
+#include <GL/glu.h>
#include <X11/Xutil.h>
-#ifdef __APPLE__
-// For some reason, apple has these extensions but doesn't have the proper
-// definitions when it is being used under X11. Define them here.
-#ifndef GL_EXT_texture_rectangle
-#define GL_EXT_texture_rectangle 1
-#define GL_TEXTURE_RECTANGLE_EXT 0x84F5
-#define GL_TEXTURE_BINDING_RECTANGLE_EXT 0x84F6
-#define GL_PROXY_TEXTURE_RECTANGLE_EXT 0x84F7
-#define GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT 0x84F8
-#endif
-#ifndef GL_APPLE_client_storage
-#define GL_APPLE_client_storage 1
-#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2
-#endif
-#ifndef GL_APPLE_texture_range
-#define GL_APPLE_texture_range 1
-#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7
-#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8
-#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC
-#define GL_TEXTURE_MINIMIZE_STORAGE_APPLE 0x85B6
-#define GL_STORAGE_PRIVATE_APPLE 0x85BD
-#define GL_STORAGE_CACHED_APPLE 0x85BE
-#define GL_STORAGE_SHARED_APPLE 0x85BF
-// Unfortunately, this isn't defined
-#define glTextureRangeAPPLE(x, y, z)
-#endif
-#endif /* __APPLE__ */
-
-// If these extensions are not availble, define these constants to something
so
-// that the code will still compile. It won't get executed due to logic in
-// the setup code
-#ifndef GL_EXT_texture_rectangle
-#define GL_EXT_texture_rectangle 0
-#define GL_TEXTURE_RECTANGLE_EXT 0
-#endif
-#ifndef GL_APPLE_client_storage
-#define GL_APPLE_client_storage 0
-#endif
-#ifndef GL_APPLE_texture_range
-#define GL_APPLE_texture_range 0
-#define GL_TEXTURE_STORAGE_HINT_APPLE 0
-#define GL_STORAGE_SHARED_APPLE 0
-#define glTextureRangeAPPLE(x, y, z)
-#endif
-
#include <sgi_stl_warnings_off.h>
#include <typeinfo>
#include <sgi_stl_warnings_on.h>
@@ -86,19 +40,19 @@
if(args[i] == "-parentWindow"){
long window;
if(!getLongArg(i, args, window))
- throw IllegalArgument("OpenGLDisplay -parentWindow", i, args);
+ throw IllegalArgument("OpenGLDisplay -parentWindow", i, args);
else
- parentWindow = static_cast<Window>(window);
+ parentWindow = static_cast<Window>(window);
} else if(args[i] == "-displayProc"){
if(!getIntArg(i, args, displayProc))
- throw IllegalArgument("OpenGLDisplay -displayProc", i, args);
+ throw IllegalArgument("OpenGLDisplay -displayProc", i, args);
if(displayProc < 0)
- throw IllegalValue<int>("Display processor should be >= 0",
displayProc);
+ throw IllegalValue<int>("Display processor should be >= 0",
displayProc);
} else if(args[i] == "-mode"){
if(!getStringArg(i, args, mode))
- throw IllegalArgument("OpenGLDisplay -mode", i, args);
+ throw IllegalArgument("OpenGLDisplay -mode", i, args);
if(mode != "image" && mode != "texture")
- throw IllegalValue<string>("Illegal dispay mode", mode);
+ throw IllegalValue<string>("Illegal dispay mode", mode);
} else if(args[i] == "-displayFrameRate"){
displayFrameRate = true;
} else if(args[i] == "-nodisplayFrameRate"){
@@ -135,13 +89,7 @@
dpy = 0;
// If this is zero then the value hasn't been used yet.
last_frame_time = 0;
- need_texids = true;
- int x = 0x12345678;
- char* p = (char*)&x;
- if(p[0] == 0x12)
- big_endian = true;
- else
- big_endian = false;
+ ogl = new PureOpenGLDisplay(mode);
}
OpenGLDisplay::~OpenGLDisplay()
@@ -277,9 +225,7 @@
throw InternalError("glXMakeCurrent failed!\n", __FILE__, __LINE__);
}
- glDisable(GL_DEPTH_TEST);
- glClearColor(.05, .1, .2, 0);
- glClear(GL_COLOR_BUFFER_BIT);
+ ogl->clearScreen(.05, .1, .2, 0);
glXSwapBuffers(dpy, win);
glFinish();
@@ -295,20 +241,8 @@
throw InternalError("getGLFont failed!\n", __FILE__, __LINE__);
}
- // Check for texturing extensions
- have_texturerectangle = false;
- if(GL_EXT_texture_rectangle && have_extension("GL_EXT_texture_rectangle")){
- have_texturerectangle = true;
- }
- have_clientstorage = false;
- if(GL_APPLE_client_storage && have_extension("GL_APPLE_client_storage")){
- have_clientstorage = true;
- }
- have_texturerange = false;
- if(GL_APPLE_texture_range && have_extension("GL_APPLE_texture_range")){
- have_texturerange = true;
- }
-
+ ogl->init();
+
if(!glXMakeCurrent(dpy, None, NULL)) {
XHelper::Xlock.unlock();
throw InternalError("glXMakeCurrent failed!\n", __FILE__, __LINE__);
@@ -318,7 +252,7 @@
}
void OpenGLDisplay::displayImage(const DisplayContext& context,
- const Image* image)
+ const Image* image)
{
if(context.proc != displayProc%context.numProcs)
return;
@@ -343,18 +277,10 @@
bool stereo;
int xres, yres;
image->getResolution(stereo, xres, yres);
- glViewport(0, 0, xres, yres);
- if(mode == "texture" && drawImage_texture(image)){
- // Drawn by texture...
- } else if(drawImage_pixels(image)){
- // Drawn by pixels...
- } else {
- throw InternalError("Unknown image type in OpenGLDisplay",
- __FILE__, __LINE__);
- }
- gl_print_error(__FILE__,__LINE__);
+ ogl->displayImage(image);
+ // Display the frame rate
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, xres, 0, yres);
@@ -374,161 +300,6 @@
}
}
-bool OpenGLDisplay::drawImage_pixels(const Image* image)
-{
- const SimpleImageBase* si = dynamic_cast<const SimpleImageBase*>(image);
- if(!si)
- return false;
- bool stereo;
- int xres, yres;
- image->getResolution(stereo, xres, yres);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluOrtho2D(0, xres, 0, yres);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glTranslatef(0.375, 0.375, 0.0);
- GLenum format;
- GLenum type;
- if(typeid(*image) == typeid(SimpleImage<RGBA8Pixel>)){
- format = GL_RGBA;
- type = GL_UNSIGNED_BYTE;
- } else if(typeid(*image) == typeid(SimpleImage<RGB8Pixel>)){
- format = GL_RGB;
- type = GL_UNSIGNED_BYTE;
- } else if(typeid(*image) == typeid(SimpleImage<ABGR8Pixel>)){
- format = GL_ABGR_EXT;
- type = GL_UNSIGNED_BYTE;
- } else if(typeid(*image) == typeid(SimpleImage<ARGB8Pixel>)){
- format = GL_BGRA;
- type = big_endian?GL_UNSIGNED_INT_8_8_8_8_REV : GL_UNSIGNED_INT_8_8_8_8;
- } else if(typeid(*image) == typeid(SimpleImage<RGBAfloatPixel>)){
- format = GL_RGBA;
- type = GL_FLOAT;
- } else if(typeid(*image) == typeid(SimpleImage<RGBfloatPixel>)){
- format = GL_RGB;
- type = GL_FLOAT;
- } else {
- return false;
- }
- if(stereo){
- glDrawBuffer(GL_BACK_LEFT);
- glRasterPos2i(0,0);
- glDrawPixels(xres, yres, format, type, si->getRawData(0));
- glDrawBuffer(GL_BACK_RIGHT);
- glRasterPos2i(0,0);
- glDrawPixels(xres, yres, format, type, si->getRawData(1));
- } else {
- glDrawBuffer(GL_BACK);
- glRasterPos2i(0,0);
- glDrawPixels(xres, yres, format, type, si->getRawData(0));
- }
- return true;
-}
-
-bool OpenGLDisplay::drawImage_texture(const Image* image)
-{
- if(!have_texturerectangle)
- return false;
- const SimpleImageBase* si = dynamic_cast<const SimpleImageBase*>(image);
- if(!si)
- return false;
-
- bool stereo;
- int xres, yres;
- image->getResolution(stereo, xres, yres);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluOrtho2D(0, 1, 0, 1);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
- glDisable(GL_TEXTURE_2D);
- glEnable(GL_TEXTURE_RECTANGLE_EXT);
-
- if(need_texids){
- // Free old textures if necessary...
- glGenTextures(2, texids);
- need_texids = false;
- }
-
- glBindTexture(GL_TEXTURE_RECTANGLE_EXT, texids[0]);
- glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, xres*yres*4, data);
- if(have_clientstorage)
- glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE);
- glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
- glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
-
- if(have_texturerange)
- glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_STORAGE_HINT_APPLE,
- GL_STORAGE_SHARED_APPLE);
- glTexParameteri (GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_S,
GL_CLAMP_TO_EDGE);
- glTexParameteri (GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_T,
GL_CLAMP_TO_EDGE);
- glTexParameteri (GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER,
GL_NEAREST);
- glTexParameteri (GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER,
GL_NEAREST);
- glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
-
- GLenum format;
- GLenum type;
- bool have_alpha = true;
- if(typeid(*image) == typeid(SimpleImage<RGBA8Pixel>)){
- format = GL_RGBA;
- type = big_endian? GL_UNSIGNED_INT_8_8_8_8 : GL_UNSIGNED_INT_8_8_8_8_REV;
- } else if(typeid(*image) == typeid(SimpleImage<RGB8Pixel>)){
- format = GL_RGB;
- type = GL_UNSIGNED_BYTE;
- have_alpha = false;
- } else if(typeid(*image) == typeid(SimpleImage<ABGR8Pixel>)){
- format = GL_RGBA;
- type = big_endian? GL_UNSIGNED_INT_8_8_8_8_REV : GL_UNSIGNED_INT_8_8_8_8;
- } else if(typeid(*image) == typeid(SimpleImage<ARGB8Pixel>)){
- format = GL_BGRA;
- type = big_endian? GL_UNSIGNED_INT_8_8_8_8_REV : GL_UNSIGNED_INT_8_8_8_8;
- } else {
- return false;
- }
-
- // Load textures
- glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, have_alpha? GL_RGBA : GL_RGB,
- xres, yres, 0, format, type,
- si->getRawData(0));
- if(stereo){
- glBindTexture(GL_TEXTURE_RECTANGLE_EXT, texids[0]);
- glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, have_alpha? GL_RGBA : GL_RGB,
- xres, yres, 0, format, type,
- si->getRawData(0));
- glBindTexture(GL_TEXTURE_RECTANGLE_EXT, texids[0]);
- }
-
- glDrawBuffer(stereo? GL_BACK_LEFT : GL_BACK);
- glBegin(GL_QUADS);
- glTexCoord2f(0, 0);
- glVertex2f(0, 0);
- glTexCoord2f(xres, 0);
- glVertex2f(1, 0);
- glTexCoord2f(xres, yres);
- glVertex2f(1, 1);
- glTexCoord2f(0, yres);
- glVertex2f(0, 1);
- glEnd();
- if(stereo){
- glDrawBuffer(GL_BACK_RIGHT);
- glBindTexture(GL_TEXTURE_RECTANGLE_EXT, texids[1]);
- glBegin(GL_QUADS);
- glTexCoord2f(0, 0);
- glVertex2f(0, 0);
- glTexCoord2f(xres, 0);
- glVertex2f(1, 0);
- glTexCoord2f(xres, yres);
- glVertex2f(1, 1);
- glTexCoord2f(0, yres);
- glVertex2f(0, 1);
- glEnd();
- }
- glDisable(GL_TEXTURE_RECTANGLE_EXT);
- return true;
-}
-
void OpenGLDisplay::display_frame_rate(double framerate)
{
// Display textual information on the screen:
@@ -558,18 +329,3 @@
<< gluErrorString(errcode) << std::endl;
}
-bool OpenGLDisplay::have_extension(const char* name)
-{
- char* extensions = (char*)glGetString(GL_EXTENSIONS);
- if(!extensions)
- return false;
-
- istringstream in(extensions);
- while(in){
- string exname;
- in >> exname;
- if(in && exname == name)
- return true;
- }
- return false;
-}
Modified: trunk/Engine/Display/OpenGLDisplay.h
==============================================================================
--- trunk/Engine/Display/OpenGLDisplay.h (original)
+++ trunk/Engine/Display/OpenGLDisplay.h Tue May 2 14:16:41 2006
@@ -5,6 +5,7 @@
#include <Interface/ImageDisplay.h>
#include <X11/Xlib.h>
#include <GL/glx.h>
+
#include <sgi_stl_warnings_off.h>
#include <string>
#include <iostream>
@@ -14,6 +15,8 @@
namespace Manta {
using namespace std;
class XWindow;
+ class PureOpenGLDisplay;
+
class OpenGLDisplay : public ImageDisplay {
public:
OpenGLDisplay(const vector<string>& args);
@@ -42,13 +45,7 @@
int displayProc;
string mode;
- bool need_texids;
- GLuint texids[2];
-
- bool have_texturerectangle;
- bool have_clientstorage;
- bool have_texturerange;
- bool big_endian;
+ PureOpenGLDisplay* ogl;
bool displayFrameRate;
@@ -60,10 +57,6 @@
void display_frame_rate(double framerate);
void gl_print_error(const char *file, int line);
- bool drawImage_texture(const Image* image);
- bool drawImage_pixels(const Image* image);
-
- bool have_extension(const char* name);
void setDefaults();
void setup();
Added: trunk/Engine/Display/PureOpenGLDisplay.cc
==============================================================================
--- (empty file)
+++ trunk/Engine/Display/PureOpenGLDisplay.cc Tue May 2 14:16:41 2006
@@ -0,0 +1,373 @@
+/*
+ For more information, please see:
http://software.sci.utah.edu
+
+ The MIT License
+
+ Copyright (c) 2005-2006
+ Scientific Computing and Imaging Institute, University of Utah
+
+ License for the specific language governing rights and limitations under
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the "Software"),
+ to deal in the Software without restriction, including without limitation
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ and/or sell copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
+*/
+
+#include <Engine/Display/PureOpenGLDisplay.h>
+#include <Image/NullImage.h>
+#include <Image/Pixel.h>
+#include <Image/SimpleImage.h>
+#include <Core/Util/Args.h>
+#include <Core/Exceptions/IllegalValue.h>
+#include <Core/Exceptions/InternalError.h>
+#include <Core/Exceptions/IllegalArgument.h>
+
+#include <GL/gl.h>
+#include <GL/glu.h>
+
+#include <sgi_stl_warnings_off.h>
+#include <iostream>
+#include <typeinfo>
+#include <sgi_stl_warnings_on.h>
+
+#ifdef __APPLE__
+// For some reason, apple has these extensions but doesn't have the proper
+// definitions when it is being used under X11. Define them here.
+#ifndef GL_EXT_texture_rectangle
+#define GL_EXT_texture_rectangle 1
+#define GL_TEXTURE_RECTANGLE_EXT 0x84F5
+#define GL_TEXTURE_BINDING_RECTANGLE_EXT 0x84F6
+#define GL_PROXY_TEXTURE_RECTANGLE_EXT 0x84F7
+#define GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT 0x84F8
+#endif
+#ifndef GL_APPLE_client_storage
+#define GL_APPLE_client_storage 1
+#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2
+#endif
+#ifndef GL_APPLE_texture_range
+#define GL_APPLE_texture_range 1
+#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7
+#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8
+#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC
+#define GL_TEXTURE_MINIMIZE_STORAGE_APPLE 0x85B6
+#define GL_STORAGE_PRIVATE_APPLE 0x85BD
+#define GL_STORAGE_CACHED_APPLE 0x85BE
+#define GL_STORAGE_SHARED_APPLE 0x85BF
+// Unfortunately, this isn't defined
+#define glTextureRangeAPPLE(x, y, z)
+#endif
+#endif /* __APPLE__ */
+
+// If these extensions are not availble, define these constants to something
so
+// that the code will still compile. It won't get executed due to logic in
+// the setup code
+#ifndef GL_EXT_texture_rectangle
+# define GL_EXT_texture_rectangle 0
+# define GL_TEXTURE_RECTANGLE_EXT 0
+#endif
+#ifndef GL_APPLE_client_storage
+# define GL_APPLE_client_storage 0
+#endif
+#ifndef GL_APPLE_texture_range
+# define GL_APPLE_texture_range 0
+# define GL_TEXTURE_STORAGE_HINT_APPLE 0
+# define GL_STORAGE_SHARED_APPLE 0
+# define glTextureRangeAPPLE(x, y, z)
+#endif
+
+
+using namespace Manta;
+using namespace SCIRun;
+using namespace std;
+
+PureOpenGLDisplay::PureOpenGLDisplay(const string& new_mode)
+{
+ setDefaults();
+ setMode(new_mode);
+ setup();
+}
+
+PureOpenGLDisplay::~PureOpenGLDisplay()
+{
+}
+
+void
+PureOpenGLDisplay::setDefaults()
+{
+ mode = "texture";
+}
+
+void
+PureOpenGLDisplay::setup()
+{
+ need_texids = true;
+ int x = 0x12345678;
+ char* p = (char*)&x;
+ if(p[0] == 0x12)
+ big_endian = true;
+ else
+ big_endian = false;
+}
+
+bool
+PureOpenGLDisplay::setMode(const string& new_mode)
+{
+ if (new_mode != "") {
+ if(mode != "image" && mode != "texture")
+ throw IllegalValue<string>("Illegal dispay mode", mode);
+ mode = new_mode;
+ }
+}
+
+void
+PureOpenGLDisplay::init()
+{
+ // Check for texturing extensions
+ have_texturerectangle = false;
+ if(GL_EXT_texture_rectangle && have_extension("GL_EXT_texture_rectangle")){
+ have_texturerectangle = true;
+ }
+ have_clientstorage = false;
+ if(GL_APPLE_client_storage && have_extension("GL_APPLE_client_storage")){
+ have_clientstorage = true;
+ }
+ have_texturerange = false;
+ if(GL_APPLE_texture_range && have_extension("GL_APPLE_texture_range")){
+ have_texturerange = true;
+ }
+
+ // We don't want depth to be taken into consideration
+ glDisable(GL_DEPTH_TEST);
+}
+
+void
+PureOpenGLDisplay::clearScreen(float r, float g, float b, float a)
+{
+ glClearColor(r, g, b, a);
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+void
+PureOpenGLDisplay::displayImage(const Image* image)
+{
+ // We will look at the typeid of the image to determine what kind it
+ // is and avoid extra dynamic_casts. We do that instead of using a
+ // virtual function in image to avoid having a zillion virtual functions
+ // in the Image interface. This assumes that there will be more display
+ // types that image types.
+ if(typeid(*image) == typeid(NullImage))
+ return;
+
+ bool stereo;
+ int xres, yres;
+ image->getResolution(stereo, xres, yres);
+ glViewport(0, 0, xres, yres);
+
+ if(mode == "texture" && drawImage_texture(image)){
+ // Drawn by texture...
+ } else if(drawImage_pixels(image)){
+ // Drawn by pixels...
+ } else {
+ throw InternalError("Unknown image type in OpenGLDisplay",
+ __FILE__, __LINE__);
+ }
+ gl_print_error(__FILE__,__LINE__);
+}
+
+bool
+PureOpenGLDisplay::drawImage_pixels(const Image* image)
+{
+ const SimpleImageBase* si = dynamic_cast<const SimpleImageBase*>(image);
+ if(!si)
+ return false;
+ bool stereo;
+ int xres, yres;
+ image->getResolution(stereo, xres, yres);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluOrtho2D(0, xres, 0, yres);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(0.375, 0.375, 0.0);
+ GLenum format;
+ GLenum type;
+ if(typeid(*image) == typeid(SimpleImage<RGBA8Pixel>)){
+ format = GL_RGBA;
+ type = GL_UNSIGNED_BYTE;
+ } else if(typeid(*image) == typeid(SimpleImage<RGB8Pixel>)){
+ format = GL_RGB;
+ type = GL_UNSIGNED_BYTE;
+ } else if(typeid(*image) == typeid(SimpleImage<ABGR8Pixel>)){
+ format = GL_ABGR_EXT;
+ type = GL_UNSIGNED_BYTE;
+ } else if(typeid(*image) == typeid(SimpleImage<ARGB8Pixel>)){
+ format = GL_BGRA;
+ type = big_endian?GL_UNSIGNED_INT_8_8_8_8_REV : GL_UNSIGNED_INT_8_8_8_8;
+ } else if(typeid(*image) == typeid(SimpleImage<RGBAfloatPixel>)){
+ format = GL_RGBA;
+ type = GL_FLOAT;
+ } else if(typeid(*image) == typeid(SimpleImage<RGBfloatPixel>)){
+ format = GL_RGB;
+ type = GL_FLOAT;
+ } else {
+ return false;
+ }
+ if(stereo){
+ glDrawBuffer(GL_BACK_LEFT);
+ glRasterPos2i(0,0);
+ glDrawPixels(xres, yres, format, type, si->getRawData(0));
+ glDrawBuffer(GL_BACK_RIGHT);
+ glRasterPos2i(0,0);
+ glDrawPixels(xres, yres, format, type, si->getRawData(1));
+ } else {
+ glDrawBuffer(GL_BACK);
+ glRasterPos2i(0,0);
+ glDrawPixels(xres, yres, format, type, si->getRawData(0));
+ }
+ return true;
+}
+
+bool
+PureOpenGLDisplay::drawImage_texture(const Image* image)
+{
+ if(!have_texturerectangle)
+ return false;
+ const SimpleImageBase* si = dynamic_cast<const SimpleImageBase*>(image);
+ if(!si)
+ return false;
+
+ bool stereo;
+ int xres, yres;
+ image->getResolution(stereo, xres, yres);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluOrtho2D(0, 1, 0, 1);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ glDisable(GL_TEXTURE_2D);
+ glEnable(GL_TEXTURE_RECTANGLE_EXT);
+
+ if(need_texids){
+ // Free old textures if necessary...
+ glGenTextures(2, texids);
+ need_texids = false;
+ }
+
+ glBindTexture(GL_TEXTURE_RECTANGLE_EXT, texids[0]);
+ glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, xres*yres*4, data);
+ if(have_clientstorage)
+ glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE);
+ glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
+
+ if(have_texturerange)
+ glTexParameteri(GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_STORAGE_HINT_APPLE,
+ GL_STORAGE_SHARED_APPLE);
+ glTexParameteri (GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_S,
GL_CLAMP_TO_EDGE);
+ glTexParameteri (GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_WRAP_T,
GL_CLAMP_TO_EDGE);
+ glTexParameteri (GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MAG_FILTER,
GL_NEAREST);
+ glTexParameteri (GL_TEXTURE_RECTANGLE_EXT, GL_TEXTURE_MIN_FILTER,
GL_NEAREST);
+ glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+
+ GLenum format;
+ GLenum type;
+ bool have_alpha = true;
+ if(typeid(*image) == typeid(SimpleImage<RGBA8Pixel>)){
+ format = GL_RGBA;
+ type = big_endian? GL_UNSIGNED_INT_8_8_8_8 : GL_UNSIGNED_INT_8_8_8_8_REV;
+ } else if(typeid(*image) == typeid(SimpleImage<RGB8Pixel>)){
+ format = GL_RGB;
+ type = GL_UNSIGNED_BYTE;
+ have_alpha = false;
+ } else if(typeid(*image) == typeid(SimpleImage<ABGR8Pixel>)){
+ format = GL_RGBA;
+ type = big_endian? GL_UNSIGNED_INT_8_8_8_8_REV : GL_UNSIGNED_INT_8_8_8_8;
+ } else if(typeid(*image) == typeid(SimpleImage<ARGB8Pixel>)){
+ format = GL_BGRA;
+ type = big_endian? GL_UNSIGNED_INT_8_8_8_8_REV : GL_UNSIGNED_INT_8_8_8_8;
+ } else {
+ return false;
+ }
+
+ // Load textures
+ glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, have_alpha? GL_RGBA : GL_RGB,
+ xres, yres, 0, format, type,
+ si->getRawData(0));
+ if(stereo){
+ glBindTexture(GL_TEXTURE_RECTANGLE_EXT, texids[0]);
+ glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, have_alpha? GL_RGBA : GL_RGB,
+ xres, yres, 0, format, type,
+ si->getRawData(0));
+ glBindTexture(GL_TEXTURE_RECTANGLE_EXT, texids[0]);
+ }
+
+ glDrawBuffer(stereo? GL_BACK_LEFT : GL_BACK);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0);
+ glVertex2f(0, 0);
+ glTexCoord2f(xres, 0);
+ glVertex2f(1, 0);
+ glTexCoord2f(xres, yres);
+ glVertex2f(1, 1);
+ glTexCoord2f(0, yres);
+ glVertex2f(0, 1);
+ glEnd();
+ if(stereo){
+ glDrawBuffer(GL_BACK_RIGHT);
+ glBindTexture(GL_TEXTURE_RECTANGLE_EXT, texids[1]);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0);
+ glVertex2f(0, 0);
+ glTexCoord2f(xres, 0);
+ glVertex2f(1, 0);
+ glTexCoord2f(xres, yres);
+ glVertex2f(1, 1);
+ glTexCoord2f(0, yres);
+ glVertex2f(0, 1);
+ glEnd();
+ }
+ glDisable(GL_TEXTURE_RECTANGLE_EXT);
+ return true;
+}
+
+void
+PureOpenGLDisplay::gl_print_error(const char *file, int line)
+{
+ GLenum errcode = glGetError();
+ if(errcode != GL_NO_ERROR)
+ cerr << "PureOpenGLDisplay: "
+ << file << ":"
+ << line << " error: "
+ << gluErrorString(errcode) << "\n";
+}
+
+bool
+PureOpenGLDisplay::have_extension(const char* name)
+{
+ char* extensions = (char*)glGetString(GL_EXTENSIONS);
+ if(!extensions)
+ return false;
+
+ istringstream in(extensions);
+ while(in){
+ string exname;
+ in >> exname;
+ if(in && exname == name)
+ return true;
+ }
+ return false;
+}
Added: trunk/Engine/Display/PureOpenGLDisplay.h
==============================================================================
--- (empty file)
+++ trunk/Engine/Display/PureOpenGLDisplay.h Tue May 2 14:16:41 2006
@@ -0,0 +1,94 @@
+/*
+ For more information, please see:
http://software.sci.utah.edu
+
+ The MIT License
+
+ Copyright (c) 2005-2006
+ Scientific Computing and Imaging Institute, University of Utah
+
+ License for the specific language governing rights and limitations under
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the "Software"),
+ to deal in the Software without restriction, including without limitation
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ and/or sell copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef Manta_Engine_PureOpenGLDisplay_h
+#define Manta_Engine_PureOpenGLDisplay_h
+
+#include <Core/Color/RGBColor.h>
+
+#include <GL/gl.h>
+
+#include <sgi_stl_warnings_off.h>
+#include <string>
+#include <sgi_stl_warnings_on.h>
+
+/*
+ This will only make pure OpenGL calls and should not be dependent on
+ any one architecture or libraries outside of OpenGL.
+*/
+
+namespace Manta {
+ class Image;
+
+ using namespace std;
+
+ class PureOpenGLDisplay {
+ public:
+ PureOpenGLDisplay(const string& new_mode);
+ virtual ~PureOpenGLDisplay();
+
+ bool setMode(const string& new_mode);
+
+ // Called once after obtaining the OpenGL context
+ void init();
+ // Clears the screen with the given color. You still need to swap
+ // the buffer afterwards.
+ void clearScreen(float r, float g, float b, float a = 0);
+ // Renders the image
+ void displayImage(const Image* image);
+
+ private:
+ PureOpenGLDisplay(const PureOpenGLDisplay&);
+ PureOpenGLDisplay& operator=(const PureOpenGLDisplay&);
+
+ protected:
+ string mode;
+
+ bool need_texids;
+ GLuint texids[2];
+
+ bool have_texturerectangle;
+ bool have_clientstorage;
+ bool have_texturerange;
+ bool big_endian;
+
+ bool drawImage_texture(const Image* image);
+ bool drawImage_pixels(const Image* image);
+
+ bool have_extension(const char* name);
+
+ void gl_print_error(const char *file, int line);
+
+ // Called at the beginning of the constructor
+ void setDefaults();
+ // Called at the end of the constructor
+ void setup();
+ };
+}
+
+#endif
Modified: trunk/Engine/Display/SyncDisplay.h
==============================================================================
--- trunk/Engine/Display/SyncDisplay.h (original)
+++ trunk/Engine/Display/SyncDisplay.h Tue May 2 14:16:41 2006
@@ -78,6 +78,8 @@
void waitOnFrameReady(); // blocks until a frame is ready
void renderFrame();
void doneRendering();
+
+ Image const* getCurrentImage() { return current_image; }
private:
SyncDisplay(const SyncDisplay&);
SyncDisplay& operator=(const SyncDisplay&);
Modified: trunk/SwigInterface/manta.i
==============================================================================
--- trunk/SwigInterface/manta.i (original)
+++ trunk/SwigInterface/manta.i Tue May 2 14:16:41 2006
@@ -26,6 +26,7 @@
#include <Core/Exceptions/share.h>
#include <Core/Exceptions/Exception.h>
#include <Core/Exceptions/IllegalArgument.h>
+#include <Core/Exceptions/IllegalValue.h>
#include <Core/Exceptions/BadPrimitive.h>
%}
@@ -46,6 +47,18 @@
}
%enddef
+%define %manta_SCIRun_Exception(Function)
+%exception Function {
+ try {
+ $action
+ } catch(SCIRun::Exception& e) {
+ SWIG_exception(SWIG_ValueError, e.message());
+ } catch(...) {
+ SWIG_exception(SWIG_RuntimeError, "Unknown exception");
+ }
+}
+%enddef
+
%define %manta_IllegalArgument_BadPrimitive_exception(Function)
%exception Function {
try {
@@ -220,15 +233,19 @@
#include <Interface/ImageDisplay.h>
#include <Engine/Display/SyncDisplay.h>
#include <Engine/Display/OpenGLDisplay.h>
- //#include <Engine/Display/PureOpenGLDisplay.h>
+#include <Engine/Display/PureOpenGLDisplay.h>
+#include <Engine/Display/NullDisplay.h>
%}
%manta_Release_PythonGIL(Manta::SyncDisplay::waitOnFrameReady);
+%manta_SCIRun_Exception(Manta::PureOpenGLDisplay::PureOpenGLDisplay);
+%manta_SCIRun_Exception(Manta::PureOpenGLDisplay::setMode);
%include <Interface/ImageDisplay.h>
%include <Engine/Display/SyncDisplay.h>
%include <Engine/Display/OpenGLDisplay.h>
-//%include <Engine/Display/PureOpenGLDisplay.h>
+%include <Engine/Display/PureOpenGLDisplay.h>
+%include <Engine/Display/NullDisplay.h>
Modified: trunk/SwigInterface/wxManta.py
==============================================================================
--- trunk/SwigInterface/wxManta.py (original)
+++ trunk/SwigInterface/wxManta.py Tue May 2 14:16:41 2006
@@ -10,6 +10,8 @@
from manta import *
from pycallback import *
+from OpenGL.GL import *
+
# Number of workers.
numworkers = 2
@@ -90,33 +92,42 @@
class mantaGLCanvas(wxGLCanvas):
- def __init__(self, parent, sync_display):
- wxGLCanvas.__init__(self, parent, -1)
-# EVT_PAINT(self, self.OnPaint)
+ def __init__(self, parent, sync_display, opengl_display):
+ wxGLCanvas.__init__(self, parent, -1, style=wx.NO_BORDER)
self.sync_display = sync_display
+ self.opengl_display = opengl_display
+ self.Bind(wx.EVT_PAINT, self.OnPaint)
self.init = 0
- self.Connect(-1,-1, EVT_MANTA_FRAME_READY_ID, OnFrameReady)
+ self.Connect(-1,-1, EVT_MANTA_FRAME_READY_ID, self.OnFrameReady)
def OnPaint(self, event):
# Note that you must always generate a wxPaintDC object,
# otherwise certain platforms will not think that you painted
# the screen and will call enless refreshes.
- dc = wxPaintDC(self)
- self.SetCurrent()
+ dc = wx.PaintDC(self)
if not self.init:
self.InitGL()
self.init = 1
- self.OnDraw()
+ # Probably should unbind the OnPaint event
+ self.Bind(wx.EVT_PAINT, None)
+ self.clearScreen()
- def OnDraw(self):
- print "mantaGLCanvas::OnDraw"
-
+ def clearScreen(self):
+ size = self.GetSize()
+ self.SetCurrent()
+ glViewport(0, 0, size.x, size.y)
+ glClearColor(0.05, 0.1, 0.2, 0.0);
+ glClear(GL_COLOR_BUFFER_BIT);
+ self.SwapBuffers()
+
def InitGL(self):
print "mantaGLCanvas::InitGL"
+ self.opengl_display.init()
+ self.clearScreen()
def OnFrameReady(self, event):
self.SetCurrent()
- self.sync_display.renderFrame()
+ self.opengl_display.displayImage(self.sync_display.getCurrentImage())
self.sync_display.doneRendering()
self.SwapBuffers()
@@ -127,8 +138,10 @@
## OnInit
###########################################################################
def OnInit(self) :
- self.frame = wx.Frame(parent=None, title='Manta', size=wx.Size(xres,
yres) )
+ self.frame = wx.Frame(parent=None, title='Manta',
+ size=wx.Size(xres, yres) )
self.frame.Show()
+
#######################################################################
# Setup manta.
@@ -148,12 +161,19 @@
# Image display.
use_stereo = False
- display = manta_new( OpenGLDisplay( None, self.frame.GetHandle() ) )
+
+# display = manta_new( OpenGLDisplay( None, self.frame.GetHandle() )
)
+# self.sync_display = manta_new(SyncDisplay(vectorStr()))
+# self.sync_display.setChild(display)
+# self.Connect(-1,-1, EVT_MANTA_FRAME_READY_ID, self.OnFrameReady)
+# self.sync_thread = DisplayThread(self, self.sync_display)
self.sync_display = manta_new(SyncDisplay(vectorStr()))
- self.sync_display.setChild(display)
- self.Connect(-1,-1, EVT_MANTA_FRAME_READY_ID, self.OnFrameReady)
- self.sync_thread = DisplayThread(self, self.sync_display)
+ self.sync_display.setChild(manta_new( NullDisplay(vectorStr()) ))
+ opengl_display = manta_new(PureOpenGLDisplay(""))
+ self.canvas = mantaGLCanvas(self.frame, self.sync_display,
+ opengl_display)
+ self.sync_thread = DisplayThread(self.canvas, self.sync_display)
# Create a display channel.
self.engine.createChannel( self.sync_display, camera, use_stereo,
xres, yres )
@@ -165,12 +185,12 @@
#######################################################################
# Setup the UI events.
- self.frame.Bind( wx.EVT_MOTION, self.OnMotion )
- self.frame.Bind( wx.EVT_LEFT_DOWN, self.OnLeftDown )
- self.frame.Bind( wx.EVT_LEFT_UP, self.OnLeftUp )
- self.frame.Bind( wx.EVT_RIGHT_DOWN, self.OnRightDown )
+ self.canvas.Bind( wx.EVT_MOTION, self.OnMotion )
+ self.canvas.Bind( wx.EVT_LEFT_DOWN, self.OnLeftDown )
+ self.canvas.Bind( wx.EVT_LEFT_UP, self.OnLeftUp )
+ self.canvas.Bind( wx.EVT_RIGHT_DOWN, self.OnRightDown )
# Keyboard events are ignored for wx.Frame.
- self.frame.Bind( wx.EVT_KEY_DOWN, self.OnChar )
+ self.canvas.Bind( wx.EVT_KEY_DOWN, self.OnChar )
##################################################################
# globals
@@ -186,6 +206,7 @@
print "Exiting the engine"
self.sync_thread.abort()
self.engine.finish()
+ self.sync_display.doneRendering()
self.sync_display.doneRendering()
self.engine.blockUntilFinished()
print "Engine exited"
- [MANTA] r1032 - in trunk: Engine/Display SwigInterface, bigler, 05/02/2006
Archive powered by MHonArc 2.6.16.