aboutsummaryrefslogtreecommitdiff
path: root/opengl/modules/pdp_3d_windowcontext.c
diff options
context:
space:
mode:
authorPablo Martín <caedesv@users.sourceforge.net>2003-09-07 21:51:37 +0000
committerPablo Martín <caedesv@users.sourceforge.net>2003-09-07 21:51:37 +0000
commit9aa1e112850a11854caa2198393dbd910e226151 (patch)
tree9ed62d40d96b503049229e1cb2555c4883416cb9 /opengl/modules/pdp_3d_windowcontext.c
parent213978fa8a868661dda88e6b4e7cacec1c90677a (diff)
Updating pdp version to 0.12.2
svn path=/trunk/externals/pdp/; revision=942
Diffstat (limited to 'opengl/modules/pdp_3d_windowcontext.c')
-rw-r--r--opengl/modules/pdp_3d_windowcontext.c216
1 files changed, 216 insertions, 0 deletions
diff --git a/opengl/modules/pdp_3d_windowcontext.c b/opengl/modules/pdp_3d_windowcontext.c
new file mode 100644
index 0000000..a475692
--- /dev/null
+++ b/opengl/modules/pdp_3d_windowcontext.c
@@ -0,0 +1,216 @@
+/*
+ * Pure Data Packet module.
+ * Copyright (c) by Tom Schouten <pdp@zzz.kotnet.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+
+#include <GL/gl.h>
+#include "pdp_opengl.h"
+#include "pdp_3dp_base.h"
+
+typedef struct pdp_3d_windowcontext_struct
+{
+ t_pdp_3dp_base x_base;
+ int x_width;
+ int x_height;
+ t_outlet *x_eventout;
+ int x_finish_queue_id[2];
+ int x_finish_queue_id_current;
+
+} t_pdp_3d_windowcontext;
+
+
+static void pdp_3d_windowcontext_sendfinish(t_pdp_3d_windowcontext *x)
+{
+ outlet_symbol(x->x_eventout, gensym("done"));
+}
+
+/* outlet methods */
+
+/* called before the context is propagated */
+static void pdp_3d_windowcontext_clearbuffer(t_pdp_3d_windowcontext *x)
+{
+ int p = pdp_3dp_base_get_context_packet(x);
+ //post("setting up render buffer");
+
+ // for multipass rendering
+ //pdp_packet_3Dcontext_set_subwidth(p, 320);
+ //pdp_packet_3Dcontext_set_subheight(p, 240);
+
+ pdp_packet_3Dcontext_set_rendering_context(p);
+ pdp_packet_3Dcontext_setup_3d_context(p);
+
+ /* clear buffer */
+ //glScissor(0,0,
+ // pdp_packet_3Dcontext_subwidth(p),
+ // pdp_packet_3Dcontext_subheight(p));
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+
+
+}
+
+/* called after context is propagated */
+static void pdp_3d_windowcontext_swapbuffer(t_pdp_3d_windowcontext *x)
+{
+ int p = pdp_3dp_base_get_context_packet(x);
+ //post("displaying render buffer");
+ //pdp_packet_3Dcontext_set_rendering_context(p);
+ pdp_packet_3Dcontext_win_swapbuffers(p);
+ //pdp_packet_3Dcontext_unset_rendering_context(p);
+}
+
+void pdp_3d_windowcontext_resize(t_pdp_3d_windowcontext *x, t_floatarg width, t_floatarg height)
+{
+ int w = (int)width;
+ int h = (int)height;
+ int p = pdp_3dp_base_get_context_packet(x);
+ if ((w>0) && (h>0)){
+ pdp_packet_3Dcontext_win_resize(p, w, h);
+ x->x_width = w;
+ x->x_height = h;
+ }
+}
+
+void pdp_3d_windowcontext_open(t_pdp_3d_windowcontext *x)
+{
+ int p = pdp_3dp_base_get_context_packet(x);
+ if (-1 == p){
+ p = pdp_packet_new_3Dcontext_win();
+ pdp_3d_windowcontext_resize(x, x->x_width, x->x_height);
+ pdp_3dp_base_set_context_packet(x, p);
+ }
+
+}
+void pdp_3d_windowcontext_close(t_pdp_3d_windowcontext *x)
+{
+ int p = pdp_3dp_base_move_context_packet(x);
+ t_pdp_procqueue *q = pdp_3dp_base_get_queue(x);
+ pdp_procqueue_wait(q);
+ //post("FIXME: pdp_3d_windowcontext_close: wait for thread");
+ pdp_packet_delete(p);
+}
+
+void pdp_3d_windowcontext_cursor(t_pdp_3d_windowcontext *x, t_floatarg f)
+{
+ int p = pdp_3dp_base_get_context_packet(x);
+ bool toggle = (f != 0.0f);
+ pdp_packet_3Dcontext_win_cursor(p, toggle);
+}
+
+
+
+static void pdp_3d_windowcontext_bang(t_pdp_3d_windowcontext *x)
+{
+ int p;
+ int cur = x->x_finish_queue_id_current;
+
+ /* check if at least one processing chain is done (two busy = max) */
+ if (-1 != x->x_finish_queue_id[cur]){
+ //post("pdp_3d_windowcontext_bang: bang ignored (previous rendering not finished)");
+ return;
+ }
+
+ /* create a window context if needed */
+ pdp_3d_windowcontext_open(x);
+
+ /* get events */
+ p = pdp_3dp_base_get_context_packet(x);
+ pdp_packet_3Dcontext_win_send_events(p, x->x_eventout);
+
+ /* bang base */
+ pdp_3dp_base_bang(x);
+
+ /* add a dummy process to the queue for synchro */
+ pdp_procqueue_add(pdp_3dp_base_get_queue(x), x, 0, 0, &x->x_finish_queue_id[cur]);
+ x->x_finish_queue_id_current = !cur;
+
+
+
+}
+
+
+static void pdp_3d_windowcontext_free(t_pdp_3d_windowcontext *x)
+{
+ pdp_3d_windowcontext_close(x);
+ pdp_3dp_base_free(x);
+
+}
+
+t_class *pdp_3d_windowcontext_class;
+
+
+void *pdp_3d_windowcontext_new(void)
+{
+ /* allocate */
+ t_pdp_3d_windowcontext *x = (t_pdp_3d_windowcontext *)pd_new(pdp_3d_windowcontext_class);
+
+ x->x_width = 320;
+ x->x_height = 240;
+ x->x_finish_queue_id[0] = -1;
+ x->x_finish_queue_id[1] = -1;
+ x->x_finish_queue_id_current =0;
+
+ /* init super: this is mandatory */
+ pdp_3dp_base_init(x);
+ pdp_3dp_base_disable_active_inlet(x);
+
+ /* set the dpd processing methods & outlets */
+ pdp_3dp_base_add_outlet(x, (t_pdp_method)pdp_3d_windowcontext_clearbuffer, 0);
+ pdp_3dp_base_add_cleanup(x, (t_pdp_method)pdp_3d_windowcontext_swapbuffer, (t_pdp_method)pdp_3d_windowcontext_sendfinish);
+
+ /* add event outlet */
+ x->x_eventout = outlet_new((t_object *)x, &s_anything);
+
+
+ return (void *)x;
+}
+
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+void pdp_3d_windowcontext_setup(void)
+{
+ /* create a standard pd class */
+ pdp_3d_windowcontext_class = class_new(gensym("3dp_windowcontext"), (t_newmethod)pdp_3d_windowcontext_new,
+ (t_method)pdp_3d_windowcontext_free, sizeof(t_pdp_3d_windowcontext), 0, A_NULL);
+
+ /* inherit pdp base class methods */
+ pdp_3dp_base_setup(pdp_3d_windowcontext_class);
+
+ /* register methods */
+ class_addbang(pdp_3d_windowcontext_class, pdp_3d_windowcontext_bang);
+
+ class_addmethod(pdp_3d_windowcontext_class, (t_method)pdp_3d_windowcontext_open, gensym("open"), A_NULL);
+ class_addmethod(pdp_3d_windowcontext_class, (t_method)pdp_3d_windowcontext_close, gensym("close"), A_NULL);
+ class_addmethod(pdp_3d_windowcontext_class, (t_method)pdp_3d_windowcontext_resize, gensym("dim"), A_FLOAT, A_FLOAT, A_NULL);
+ class_addmethod(pdp_3d_windowcontext_class, (t_method)pdp_3d_windowcontext_resize, gensym("size"), A_FLOAT, A_FLOAT, A_NULL);
+ class_addmethod(pdp_3d_windowcontext_class, (t_method)pdp_3d_windowcontext_cursor, gensym("cursor"), A_FLOAT, A_NULL);
+
+}
+
+
+
+#ifdef __cplusplus
+}
+#endif