summaryrefslogtreecommitdiff
path: root/patches/OpenCSG-1.1.0-Reset-Hack.patch
blob: 493a11b6c390c925fa5e73037421096e72337791 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
diff --git a/include/opencsg.h b/include/opencsg.h
index daecacc..ffde239 100644
--- a/include/opencsg.h
+++ b/include/opencsg.h
@@ -188,6 +188,9 @@ namespace OpenCSG {
                 Algorithm = AlgorithmUnused, 
                 DepthComplexityAlgorithm = NoDepthComplexitySampling);
 
+    // call this function whenever switching the OpenGL context
+    void reset();
+
 } // namespace OpenCSG
 
 #endif // __OpenCSG__opencsg_h__
diff --git a/src/channelManager.h b/src/channelManager.h
index ecd5a1d..0e1458a 100644
--- a/src/channelManager.h
+++ b/src/channelManager.h
@@ -79,9 +79,9 @@ namespace OpenCSG {
         /// moved into alpha, to allow alpha testing of the channel.
         static void setupTexEnv(Channel channel);
 
-    private:
-
         static OpenGL::OffscreenBuffer* gOffscreenBuffer;
+
+    private:
         static int gOffscreenType;
         static bool gInUse;
 
diff --git a/src/offscreenBuffer.cpp b/src/offscreenBuffer.cpp
index e02dd83..4f978d5 100644
--- a/src/offscreenBuffer.cpp
+++ b/src/offscreenBuffer.cpp
@@ -22,19 +22,41 @@
 #include "offscreenBuffer.h"
 #include "frameBufferObject.h"
 #include "pBufferTexture.h"
+#include "channelManager.h"
+
+static bool reset_f = false;
+static bool reset_p = false;
 
 namespace OpenCSG {
 
+    void reset()
+    {
+	reset_f = true;
+	reset_p = true;
+	OpenCSG::ChannelManager::gOffscreenBuffer = NULL;
+    }
+
     namespace OpenGL {
 
         OffscreenBuffer* getOffscreenBuffer(bool fbo) {
-            static FrameBufferObject* f = new FrameBufferObject;
-            static PBufferTexture* p = new PBufferTexture;
-            
-            if (fbo)
-                return f;
-            else 
+            static FrameBufferObject* f = NULL;
+            static PBufferTexture* p = NULL;
+
+	    if (fbo) {
+	        if (reset_f || f == NULL) {
+	            delete f;
+	            f = new FrameBufferObject;
+	            reset_f = false;
+	        }
+		return f;
+	    } else {
+	        if (reset_p || p == NULL) {
+	            delete p;
+	            p = new PBufferTexture;
+	            reset_p = false;
+	        }
                 return p;
+	    }
         }
 
     } // namespace OpenGL
contact: Jan Huwald // Impressum