Hey guys,
Just a heads up: Image resizing appears to be broken on Linux. James: I haven't had time to dig into it, but it's acting like it was earlier on muse and simply hiding/unhiding the window doesn't fix it either.
C
bigler@sci.utah.edu wrote:
Author: bigler
Date: Thu May 12 14:23:19 2005
New Revision: 292
Modified:
trunk/Engine/Control/RTRT.cc
trunk/Engine/Control/RTRT.h
trunk/Engine/Display/OpenGLDisplay.cc
trunk/Engine/IdleModes/ZoomIdleMode.cc
trunk/Interface/Callback.h
trunk/Interface/CallbackHelpers.h
trunk/Interface/RTRTInterface.h
trunk/UserInterface/XWindowUI.cc
trunk/UserInterface/XWindowUI.h
Log:
Changed RTRTInterface::changeResolution to take a changePipeline
argument and not take a stereo argument.
Added 2 Data 3 argument and 4 Data 0 argument call back functions.
Added ability to resize image.
Modified: trunk/Engine/Control/RTRT.cc
==============================================================================
--- trunk/Engine/Control/RTRT.cc (original)
+++ trunk/Engine/Control/RTRT.cc Thu May 12 14:23:19 2005
@@ -336,6 +336,7 @@
}
if(pipelineNeedsSetup){
+ cerr << "RTRT::internalRenderLoop::pipelineNeedsSetup = true\n";
// Negotiate the image pipeline for each channel
if(proc == 0){
setupPipelines(numProcs);
@@ -580,11 +581,13 @@
yres = channels[channel]->yres;
}
-void RTRT::changeResolution(int channel, bool stereo, int xres, int yres)
+void RTRT::changeResolution(int channel, int xres, int yres,
+ bool changePipeline)
{
- channels[channel]->stereo = stereo;
channels[channel]->xres = xres;
channels[channel]->yres = yres;
+ if (changePipeline)
+ pipelineNeedsSetup = true;
}
void RTRT::setupPipelines(int numProcs)
Modified: trunk/Engine/Control/RTRT.h
==============================================================================
--- trunk/Engine/Control/RTRT.h (original)
+++ trunk/Engine/Control/RTRT.h Thu May 12 14:23:19 2005
@@ -40,7 +40,8 @@
virtual listType listImageDisplays() const;
virtual Camera* getCamera(int channel) const;
virtual void getResolution(int channel, bool& stereo, int& xres, int& yres);
- virtual void changeResolution(int channel, bool stereo, int xres, int yres);
+ virtual void changeResolution(int channel, int xres, int yres,
+ bool changePipeline);
// Image Traversers
virtual bool selectImageTraverser(const string& spec);
Modified: trunk/Engine/Display/OpenGLDisplay.cc
==============================================================================
--- trunk/Engine/Display/OpenGLDisplay.cc (original)
+++ trunk/Engine/Display/OpenGLDisplay.cc Thu May 12 14:23:19 2005
@@ -72,6 +72,7 @@
bool stereo;
int xres, yres;
context.getResolution(stereo, xres, yres);
+ cerr << "OpenGLDisplay::setupDisplayChannel: res("<<xres<<", "<<yres<<")\n";
if(!windowOpen){
createWindow(xres, yres, context.masterWindow);
old_xres = xres;
@@ -209,11 +210,13 @@
throw InternalError("glXMakeCurrent failed!\n");
madeCurrent=true;
}
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
bool stereo;
int xres, yres;
image->getResolution(stereo, xres, yres);
+ // cerr << "OpenGLDisplay::displayImage:: res("<<xres<<", "<<yres<<")\n";
+ glViewport(0, 0, xres, yres);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
gluOrtho2D(0, xres, 0, yres);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
Modified: trunk/Engine/IdleModes/ZoomIdleMode.cc
==============================================================================
--- trunk/Engine/IdleModes/ZoomIdleMode.cc (original)
+++ trunk/Engine/IdleModes/ZoomIdleMode.cc Thu May 12 14:23:19 2005
@@ -54,7 +54,7 @@
channeldata[channel].yres = -1;
}
}
- context.rtrt_int->changeResolution(channel, stereo, xres, yres);
+ context.rtrt_int->changeResolution(channel, xres, yres, false);
}
setupNeeded = true;
}
Modified: trunk/Interface/Callback.h
==============================================================================
--- trunk/Interface/Callback.h (original)
+++ trunk/Interface/Callback.h Thu May 12 14:23:19 2005
@@ -50,6 +50,14 @@
return new Callback_2Data_1Arg<T, Data1, Data2, Arg1>(ptr, pmf, arg1);
}
+ template<class T, typename Data1, typename Data2,
+ typename Arg1, typename Arg2, typename Arg3> static
+ CallbackBase_2Data<Data1, Data2>*
+ create(T* ptr, void (T::*pmf)(Data1, Data2, Arg1, Arg2, Arg3),
+ Arg1 arg1, Arg2 arg2, Arg3 arg3) {
+ return new Callback_2Data_3Arg<T, Data1, Data2, Arg1, Arg2, Arg3>(ptr, pmf, arg1, arg2, arg3);
+ }
+
// 3 Data elements
template<class T, typename Data1, typename Data2, typename Data3> static
CallbackBase_3Data<Data1, Data2, Data3>*
@@ -61,6 +69,13 @@
CallbackBase_3Data<Data1, Data2, Data3>*
create(T* ptr, void (T::*pmf)(Data1, Data2, Data3, Arg1), Arg1 arg1) {
return new Callback_3Data_1Arg<T, Data1, Data2, Data3, Arg1>(ptr, pmf, arg1);
+ }
+
+ // 4 data elements
+ template<class T, typename Data1, typename Data2, typename Data3, typename Data4> static
+ CallbackBase_4Data<Data1, Data2, Data3, Data4>*
+ create(T* ptr, void (T::*pmf)(Data1, Data2, Data3, Data4)) {
+ return new Callback_4Data_0Arg<T, Data1, Data2, Data3, Data4>(ptr, pmf);
}
// 5 data elements
Modified: trunk/Interface/CallbackHelpers.h
==============================================================================
--- trunk/Interface/CallbackHelpers.h (original)
+++ trunk/Interface/CallbackHelpers.h Thu May 12 14:23:19 2005
@@ -4,6 +4,7 @@
// You should not use these directly - use Callback::create instead
namespace Manta {
+ // 0 Data
class CallbackBase_0Data {
public:
CallbackBase_0Data()
@@ -17,6 +18,8 @@
CallbackBase_0Data(const CallbackBase_0Data&);
CallbackBase_0Data& operator=(const CallbackBase_0Data&);
};
+
+ // 1 Data
template<typename Data1>
class CallbackBase_1Data {
public:
@@ -31,6 +34,8 @@
CallbackBase_1Data(const CallbackBase_1Data&);
CallbackBase_1Data& operator=(const CallbackBase_1Data&);
};
+
+ // 2 Data
template<typename Data1, typename Data2>
class CallbackBase_2Data {
public:
@@ -45,6 +50,8 @@
CallbackBase_2Data(const CallbackBase_2Data&);
CallbackBase_2Data& operator=(const CallbackBase_2Data&);
};
+
+ // 3 Data
template<typename Data1, typename Data2, typename Data3>
class CallbackBase_3Data {
public:
@@ -59,6 +66,24 @@
CallbackBase_3Data(const CallbackBase_3Data&);
CallbackBase_3Data& operator=(const CallbackBase_3Data&);
};
+
+ // 4 Data
+ template<typename Data1, typename Data2, typename Data3, typename Data4>
+ class CallbackBase_4Data {
+ public:
+ CallbackBase_4Data()
+ {
+ }
+ virtual ~CallbackBase_4Data()
+ {
+ }
+ virtual void call(Data1 data1, Data2 data2, Data3 data3, Data4 data4) = 0;
+ private:
+ CallbackBase_4Data(const CallbackBase_4Data&);
+ CallbackBase_4Data& operator=(const CallbackBase_4Data&);
+ };
+
+ // 5 Data
template<typename Data1, typename Data2, typename Data3, typename Data4, typename Data5>
class CallbackBase_5Data {
public:
@@ -73,6 +98,8 @@
CallbackBase_5Data(const CallbackBase_5Data&);
CallbackBase_5Data& operator=(const CallbackBase_5Data&);
};
+
+ // 6 Data
template<typename Data1, typename Data2, typename Data3, typename Data4, typename Data5, typename Data6>
class CallbackBase_6Data {
public:
@@ -88,6 +115,10 @@
CallbackBase_6Data& operator=(const CallbackBase_6Data&);
};
+ //////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////
+ // These are the actuall implementations with the different number
+ // of arguments.
// 0 Data
template<class T>
@@ -230,6 +261,30 @@
Arg1 arg1;
};
+ template<class T, typename Data1, typename Data2,
+ typename Arg1, typename Arg2, typename Arg3>
+ class Callback_2Data_3Arg : public CallbackBase_2Data<Data1, Data2> {
+ public:
+ Callback_2Data_3Arg(T* ptr, void (T::*pmf)(Data1, Data2, Arg1, Arg2, Arg3),
+ Arg1 arg1, Arg2 arg2, Arg3 arg3)
+ : ptr(ptr), pmf(pmf), arg1(arg1), arg2(arg2), arg3(arg3)
+ {
+ }
+ virtual ~Callback_2Data_3Arg()
+ {
+ }
+ virtual void call(Data1 data1, Data2 data2)
+ {
+ (ptr->*pmf)(data1, data2, arg1, arg2, arg3);
+ }
+ private:
+ T* ptr;
+ void (T::*pmf)(Data1, Data2, Arg1, Arg2, Arg3);
+ Arg1 arg1;
+ Arg2 arg2;
+ Arg3 arg3;
+ };
+
// 3 Data
template<class T, typename Data1, typename Data2, typename Data3>
class Callback_3Data_0Arg : public CallbackBase_3Data<Data1, Data2, Data3> {
@@ -268,6 +323,26 @@
T* ptr;
void (T::*pmf)(Data1, Data2, Data3, Arg1);
Arg1 arg1;
+ };
+
+ // 4 Data
+ template<class T, typename Data1, typename Data2, typename Data3, typename Data4>
+ class Callback_4Data_0Arg : public CallbackBase_4Data<Data1, Data2, Data3, Data4> {
+ public:
+ Callback_4Data_0Arg(T* ptr, void (T::*pmf)(Data1, Data2, Data3, Data4))
+ : ptr(ptr), pmf(pmf)
+ {
+ }
+ virtual ~Callback_4Data_0Arg()
+ {
+ }
+ virtual void call(Data1 data1, Data2 data2, Data3 data3, Data4 data4)
+ {
+ (ptr->*pmf)(data1, data2, data3, data4);
+ }
+ private:
+ T* ptr;
+ void (T::*pmf)(Data1, Data2, Data3, Data4);
};
// 5 Data
Modified: trunk/Interface/RTRTInterface.h
==============================================================================
--- trunk/Interface/RTRTInterface.h (original)
+++ trunk/Interface/RTRTInterface.h Thu May 12 14:23:19 2005
@@ -42,7 +42,11 @@
virtual listType listImageDisplays() const = 0;
virtual Camera* getCamera(int channel) const = 0;
virtual void getResolution(int channel, bool& stereo, int& xres, int& yres) = 0;
- virtual void changeResolution(int channel, bool stereo, int xres, int yres) = 0;
+ // You can change the resolution of the rendered image without
+ // having to change the pipeline. If you want the pipeline
+ // changed, then set this parameter to true.
+ virtual void changeResolution(int channel, int xres, int yres,
+ bool changePipeline) = 0;
// Image Traversers
typedef ImageTraverser* (*ImageTraverserCreator)(const vector<string>& args);
Modified: trunk/UserInterface/XWindowUI.cc
==============================================================================
--- trunk/UserInterface/XWindowUI.cc (original)
+++ trunk/UserInterface/XWindowUI.cc Thu May 12 14:23:19 2005
@@ -1,4 +1,3 @@
-
#include <UserInterface/XWindowUI.h>
#include <Core/Util/Args.h>
#include <Interface/Camera.h>
@@ -42,7 +41,7 @@
using namespace std;
UserInterface* XWindowUI::create(const vector<string>& args,
- RTRTInterface *rtrt_interface)
+ RTRTInterface *rtrt_interface)
{
UserInterface *newUI = new XWindowUI(args, rtrt_interface);
return newUI;
@@ -307,6 +306,11 @@
mouse.push_back(entry);
}
+void XWindowUI::changeResolution(int, int, int channel,
+ int new_xres, int new_yres)
+{
+ rtrt_interface->changeResolution(channel, new_xres, new_yres, true);
+}
void XWindowUI::printhelp(ostream& out)
{
@@ -691,6 +695,17 @@
//cerr << "Dropped button motion event for button " << ias.current_button
//<< ", probably because multiple mouse buttons pressed\n";
}
+ break;
+ case ConfigureNotify:
+ {
+ int new_xres = e.xconfigure.width;
+ int new_yres = e.xconfigure.height;
+ XWindow* window = windows[channel];
+ if(new_xres != window->xres || new_yres != window->yres)
+ rtrt_interface->addOneShotCallback(RTRTInterface::Relative, 0,
+ Callback::create(this, &XWindowUI::changeResolution,
+ channel, new_xres, new_yres));
+ } // case ConfigureNotify
break;
default:
cerr << "Unknown X event: " << e.type << '\n';
Modified: trunk/UserInterface/XWindowUI.h
==============================================================================
--- trunk/UserInterface/XWindowUI.h (original)
+++ trunk/UserInterface/XWindowUI.h Thu May 12 14:23:19 2005
@@ -57,6 +57,9 @@
const string& description,
MouseEventCallbackType* events);
+ // This is the callback function used to notify the engine that we
+ // want a resize.
+ void changeResolution(int, int, int channel, int new_xres, int new_yres);
protected:
void register_default_keys();
void register_default_mouse();
Archive powered by MHonArc 2.6.16.