diff options
Diffstat (limited to 'opengl/system')
-rw-r--r-- | opengl/system/Makefile | 8 | ||||
-rw-r--r-- | opengl/system/pdp_3Dcontext_common.c | 267 | ||||
-rw-r--r-- | opengl/system/pdp_3Dcontext_glx.c | 374 | ||||
-rw-r--r-- | opengl/system/pdp_3dp_base.c | 30 | ||||
-rw-r--r-- | opengl/system/pdp_mesh.c | 560 | ||||
-rw-r--r-- | opengl/system/pdp_opengl.c | 76 | ||||
-rw-r--r-- | opengl/system/pdp_texture.c | 541 | ||||
-rw-r--r-- | opengl/system/setup.c | 80 |
8 files changed, 0 insertions, 1936 deletions
diff --git a/opengl/system/Makefile b/opengl/system/Makefile deleted file mode 100644 index 0a31482..0000000 --- a/opengl/system/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -include ../Makefile.config - -all: pdp_texture.o pdp_3Dcontext_glx.o pdp_3Dcontext_common.o \ - pdp_opengl.o pdp_3dp_base.o pdp_mesh.o setup.o - -clean: - rm -rf *~ *.o - diff --git a/opengl/system/pdp_3Dcontext_common.c b/opengl/system/pdp_3Dcontext_common.c deleted file mode 100644 index 185e2be..0000000 --- a/opengl/system/pdp_3Dcontext_common.c +++ /dev/null @@ -1,267 +0,0 @@ - -/* - * OpenGL Extension Module for pdp - pbuffer packet implementation - * 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. - * - */ - -/* - this code uses glx. i don't know if it is worth to take into - account portabiliy. since it will take a while until pdp runs - on anything else than linux. but in any case, providing a windows/osx - implementation here should not be too difficult.. -*/ - -#include "pdp_3Dcontext.h" -#include <GL/gl.h> -//#include <GL/glx.h> -#include <GL/glu.h> -//#include <GL/glut.h> - -#define D if (0) - -/* constructor */ - -/* pbuf operators */ - -u32 pdp_packet_3Dcontext_width(int packet) -{ - t_3Dcontext *c = pdp_packet_3Dcontext_info(packet); - if (c) return c->width; - else return 0; -} - -u32 pdp_packet_3Dcontext_height(int packet) -{ - t_3Dcontext *c = pdp_packet_3Dcontext_info(packet); - if (c) return c->height; - else return 0; -} - -u32 pdp_packet_3Dcontext_subwidth(int packet) -{ - t_3Dcontext *c = pdp_packet_3Dcontext_info(packet); - if (c) return c->sub_width; - else return 0; -} - - -u32 pdp_packet_3Dcontext_subheight(int packet) -{ - t_3Dcontext *c = pdp_packet_3Dcontext_info(packet); - if (c) return c->sub_height; - else return 0; -} - - -void pdp_packet_3Dcontext_set_subwidth(int packet, u32 w) -{ - t_3Dcontext *c = pdp_packet_3Dcontext_info(packet); - if (c) c->sub_width = w; -} - - -void pdp_packet_3Dcontext_set_subheight(int packet, u32 h) -{ - t_3Dcontext *c = pdp_packet_3Dcontext_info(packet); - if (c) c->sub_height = h; -} - - -float pdp_packet_3Dcontext_subaspect(int packet) -{ - t_3Dcontext *c = pdp_packet_3Dcontext_info(packet); - if (c) return (float)c->sub_width/c->sub_height; - else return 0; -} - -int pdp_packet_3Dcontext_isvalid(int packet) -{ - t_pdp *header = pdp_packet_header(packet); - t_3Dcontext *c = pdp_packet_3Dcontext_info(packet); - - if (!header) return 0; - if (!c) return 0; - if (PDP_3DCONTEXT != header->type) return 0; - return 1; -} - -t_3Dcontext *pdp_packet_3Dcontext_info(int packet) -{ - t_pdp *header = pdp_packet_header(packet); - if (!header) return 0; - if (PDP_3DCONTEXT != header->type) return 0; - return (t_3Dcontext *)&header->info.raw; -} - - - -void pdp_llconv_flip_top_bottom(char *data, int width, int height, int pixelsize); - -int pdp_packet_3Dcontext_snap_to_bitmap(int packet, int w, int h) -{ - int x, y, new_p, i; - char *data = 0; - // char r; - // int extra = 5; - - if (!pdp_packet_3Dcontext_isvalid(packet)) goto error; - - x = pdp_packet_3Dcontext_subwidth(packet); - y = pdp_packet_3Dcontext_subheight(packet); - - x = (x - w) >> 1; - y = (y - h) >> 1; - x = (x < 0 ) ? 0 : x; - y = (y < 0 ) ? 0 : y; - - new_p = pdp_packet_new_bitmap_rgb(w, h); - data = (char *)pdp_packet_data(new_p); - if (-1 == new_p || !data) goto error; - pdp_packet_3Dcontext_set_rendering_context(packet); - - // D post("BEGIN READPIXELS %d %d %d %d %x", w, h, x, y, data); - - //for (i=0; i<w*h; i++){ - // data[3*i] = 255; - // data[3*i+1] = 255; - // data[3*i+2] = 0; - //} - // r = random(); - // data[w*h*3] = r; - - /* seems nvidia drivers 4191 have a bug - when w % 4 is not zero */ - glReadPixels(x,y, w ,h,GL_RGB,GL_UNSIGNED_BYTE, data); - - /* inplace swap top to bottom (textures and buffers have - another coordinate system than standard images) - instead of fixing this by using a different texture coordinate - system, a memory swap is performed. this is more expensive - but eliminates hassle when converting between buffers, textures - and bitmaps */ - - pdp_llconv_flip_top_bottom(data, w, h, 3); - - // if (r != data[w*h*3]) post("PANIC"); - - // post("END READPIXELS %d %d", w, h); - - - return new_p; - - error: - return -1; - -} - - - - -/* move these to the pdp_3d_context object: they're too specific */ - -/* setup for 2d operation from pbuf dimensions */ -void pdp_packet_3Dcontext_setup_2d_context(int p) -{ - u32 w; - u32 h; - float asp; - if (!pdp_packet_3Dcontext_isvalid(p)) return; - w = pdp_packet_3Dcontext_subwidth(p); - h = pdp_packet_3Dcontext_subheight(p); - asp = pdp_packet_3Dcontext_subaspect(p); - - - /* set the viewport to the size of the sub frame */ - glViewport(0, 0, w, h); - - /* set orthogonal projection, with a relative frame size of (2asp x 2) */ - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - gluOrtho2D(0, 2*asp, 0, 2); - - /* set the center of view */ - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(asp, 1, 0); - glScalef(1,-1,1); - - -} - -/* setup for 3d operation from pbuf dimensions */ -void pdp_packet_3Dcontext_setup_3d_context(int p) -{ - u32 w; - u32 h; - int i; - float asp; - float m_perspect[] = {-1.f, /* left */ - 1.f, /* right */ - -1.f, /* bottom */ - 1.f, /* top */ - 1.f, /* front */ - 20.f};/* back */ - - if (!pdp_packet_3Dcontext_isvalid(p)) return; - w = pdp_packet_3Dcontext_subwidth(p); - h = pdp_packet_3Dcontext_subheight(p); - asp = pdp_packet_3Dcontext_subaspect(p); - - - /* set the viewport to the size of the sub frame */ - glViewport(0, 0, w, h); - - /* set orthogonal projection, with a relative frame size of (2asp x 2) */ - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(m_perspect[0] * asp, m_perspect[1] * asp, // left, right - m_perspect[2], m_perspect[3], // bottom, top - m_perspect[4], m_perspect[5]); // front, back - - /* reset texture matrix */ - glMatrixMode(GL_TEXTURE); - glLoadIdentity(); - - - /* set the center of view */ - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - gluLookAt(0, 0, 4, 0, 0, 0, 0, 1, 0); - //glTranslatef(asp, 1, 0); - - - glEnable(GL_DEPTH_TEST); - glEnable(GL_AUTO_NORMAL); - glEnable(GL_NORMALIZE); - glShadeModel(GL_SMOOTH); - //glShadeModel(GL_FLAT); - - - /* disable everything that is enabled in other modules - this resets the ogl state to its initial conditions */ - glDisable(GL_LIGHTING); - for (i=0; i<8; i++) glDisable(GL_LIGHT0 + i); - glDisable(GL_COLOR_MATERIAL); - - -} - - -void pdp_3Dcontext_common_setup(void) -{ -} diff --git a/opengl/system/pdp_3Dcontext_glx.c b/opengl/system/pdp_3Dcontext_glx.c deleted file mode 100644 index c26999a..0000000 --- a/opengl/system/pdp_3Dcontext_glx.c +++ /dev/null @@ -1,374 +0,0 @@ - -/* - * OpenGL Extension Module for pdp - opengl system stuff - * 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. - * - */ - -/* this file contains the platform dependent opengl setup routines (glx) - and pdp_packet_3Dcontext methods */ - -#include "pdp_opengl.h" -#include "pdp_xwindow.h" -#include "pdp_internals.h" -#include <GL/gl.h> -#include <GL/glx.h> -#include <GL/glu.h> -//#include <GL/glut.h> - -/* all symbols are C-style */ -#ifdef __cplusplus -//extern "C" -//{ -#endif - -// this is buggy: disabled -#define PRIVATE_CONTEXT 0 - - -/* structure to hold the (platform dependent) gl environment setup */ -typedef struct _gl_env -{ - bool initialized; /* data structure is consistent */ - - XVisualInfo *visual; /* the visual info structure for the context */ - GLXContext context; /* the rendering context used to render to windows or pbufs */ - GLXFBConfig *config; /* the framebuffer config object */ - Display *dpy; /* x display connection */ - int screen; /* x screen */ - int last_context_packet; /* the packet that is currently rendered too (for caching) */ -} t_gl_env; - -static t_gl_env pdp_glx_env; -static t_pdp_class *context_class; - -/* PDP_3DCONTEXT packet methods */ - -/* set/unset ogl rendering context to pbuf */ -void pdp_packet_3Dcontext_set_rendering_context(int packet) -{ - t_3Dcontext *c = pdp_packet_3Dcontext_info(packet); - - - if (!c) return; - - - /* don't do a glx call if the context is still the same */ - if (pdp_glx_env.last_context_packet == packet) return; - - //post("new current context is %d", packet); - - - /* pbuffer */ - switch(c->encoding){ - case PDP_3DCONTEXT_WINDOW: - //glFinish(); - //glXMakeCurrent(pdp_glx_env.dpy, ((t_pdp_xwindow *)c->drawable)->win, pdp_glx_env.context); - glXMakeCurrent(pdp_glx_env.dpy, ((t_pdp_xwindow *)c->drawable)->win, (GLXContext)c->context); - pdp_glx_env.last_context_packet = packet; - break; - case PDP_3DCONTEXT_PBUFFER: - //glXMakeCurrent(pdp_glx_env.dpy, (GLXPbuffer)c->drawable, pdp_glx_env.context); - //glXMakeContextCurrent(c->dpy, c->drawable.pbuf, c->drawable.pbuf, c->context); - pdp_glx_env.last_context_packet = -1; - break; - default: - pdp_glx_env.last_context_packet = -1; - break; - } - -} - -void pdp_packet_3Dcontext_unset_rendering_context(int packet) -{ - t_3Dcontext *c = pdp_packet_3Dcontext_info(packet); - if (!c) return; - - /* pbuffer */ - switch(c->encoding){ - case PDP_3DCONTEXT_WINDOW: - glXMakeCurrent(pdp_glx_env.dpy, None, NULL); - pdp_glx_env.last_context_packet = -1; - break; - case PDP_3DCONTEXT_PBUFFER: - //glXMakeCurrent(pdp_glx_env.dpy, None, NULL); - //glXMakeContextCurrent(c->dpy, c->drawable.pbuf, c->drawable.pbuf, c->context); - break; - default: - break; - } -} - - -/* cons/des */ -static void _3Dcontext_clone(t_pdp *dst, t_pdp *src) -{ - post("ERROR: clone not supported for 3Dcontext packets"); -} - -static void _3Dcontext_copy(t_pdp *dst, t_pdp *src) -{ - post("ERROR: copy not supported for 3Dcontext packets"); -} - -static void _3Dcontext_reinit(t_pdp *dst) -{ - /* leave the packet as is */ -} -static void _3Dcontext_cleanup(t_pdp *dst) -{ - t_3Dcontext *c = (t_3Dcontext *)(&dst->info.raw); - - /* reset context packet cache, in case this packet was the current context. */ - pdp_glx_env.last_context_packet = -1; - - switch(c->encoding){ - case PDP_3DCONTEXT_WINDOW: -#if PRIVATE_CONTEXT - glXDestroyContext (pdp_glx_env.dpy, (GLXContext)c->context); -#endif - pdp_xwindow_free((t_pdp_xwindow *)c->drawable); - free(c->drawable); - break; - - case PDP_3DCONTEXT_PBUFFER: - break; - //glXDestroyContext(c->dpy, c->context); - //glXDestroyPbuffer(c->dpy, c->drawable.pbuf); - default: - break; - } -} - - -/* setup packet methods */ -static void _3Dcontext_init_methods(t_pdp *header) -{ - header->theclass = context_class; - header->flags = PDP_FLAG_DONOTCOPY; -} - - - -/* window specific methods */ - - -void _pdp_3Dcontext_set_window_size(t_3Dcontext *c, t_pdp_xwindow *xwin) -{ - c->width = xwin->winwidth; - c->sub_width = xwin->winwidth; - c->height = xwin->winheight; - c->sub_height= xwin->winheight; -} - -/* resize the window */ -void pdp_packet_3Dcontext_win_resize(int packet, int width, int height) -{ - t_pdp_xwindow *xwin; - t_3Dcontext *c = pdp_packet_3Dcontext_info(packet); - if (!c) return; - if (PDP_3DCONTEXT_WINDOW != c->encoding) return; - xwin = (t_pdp_xwindow *)c->drawable; - pdp_xwindow_resize(xwin, width, height); - _pdp_3Dcontext_set_window_size(c, xwin); -} - - -void pdp_packet_3Dcontext_win_send_events(int packet, t_outlet *outlet) -{ - t_pdp_xwindow *xwin; - t_3Dcontext *c = pdp_packet_3Dcontext_info(packet); - if (!c) return; - if (PDP_3DCONTEXT_WINDOW != c->encoding) return; - xwin = (t_pdp_xwindow *)c->drawable; - pdp_xwindow_send_events(xwin, outlet); - _pdp_3Dcontext_set_window_size(c, xwin); -} - -void pdp_packet_3Dcontext_win_cursor(int packet, bool toggle) -{ - t_pdp_xwindow *xwin; - t_3Dcontext *c = pdp_packet_3Dcontext_info(packet); - if (!c) return; - if (PDP_3DCONTEXT_WINDOW != c->encoding) return; - xwin = (t_pdp_xwindow *)c->drawable; - pdp_xwindow_cursor(xwin, toggle); - -} - -void pdp_packet_3Dcontext_win_swapbuffers(int packet) -{ - t_pdp_xwindow *xwin; - t_3Dcontext *c = pdp_packet_3Dcontext_info(packet); - if (!c) return; - if (PDP_3DCONTEXT_WINDOW != c->encoding) return; - xwin = (t_pdp_xwindow *)c->drawable; - glXSwapBuffers(xwin->dpy,xwin->win); - //glFinish(); - -} - - -/* constructors */ - -/* construct (or reuse) a window packet */ -int pdp_packet_new_3Dcontext_win(void) -{ - /* $$$FIXME: this assumes packet can't be reused */ - int p = pdp_packet_new(PDP_3DCONTEXT, 0); - t_pdp_xwindow *xwin; - t_3Dcontext *c; - t_pdp *header = pdp_packet_header(p); - if (!header) return -1; /* pool full ? */ - c = (t_3Dcontext *)&header->info.raw; - - if (c->drawable){ - xwin = (t_pdp_xwindow *)c->drawable; - } - else{ - xwin = (t_pdp_xwindow *)malloc(sizeof(*xwin)); - } - - pdp_xwindow_init(xwin); - pdp_xwindow_create_on_display(xwin, pdp_glx_env.dpy); - - /* init subheader */ -#if PRIVATE_CONTEXT - if (NULL == (c->context = (void *)glXCreateContext(pdp_glx_env.dpy, pdp_glx_env.visual, pdp_glx_env.context, True))){ - post("pdp_packet_new_3Dcontext_wind: ERROR: can't create rendering context"); - } -#else - c->context = (void *)pdp_glx_env.context; -#endif - c->drawable = xwin; - c->encoding = PDP_3DCONTEXT_WINDOW; - _pdp_3Dcontext_set_window_size(c, xwin); - - /* init packet methods */ - _3Dcontext_init_methods(header); - - /* init header */ - header->desc = pdp_gensym("3Dcontext/window"); - header->flags = PDP_FLAG_DONOTCOPY; - - return p; - - -} - -/* pbuf constructor */ -int pdp_packet_new_3Dcontext_pbuf(u32 width, u32 height, u32 depth) -{ - post("ERROR: 3Dcontext/pbuffer packets not implemented"); - return -1; -} - - -/* this is a notifier sent when the processing thread which - executes gl commands is changed. we need to release the current context - before another thread can take it. */ -void pdp_3Dcontext_prepare_for_thread_switch(void) -{ - pdp_packet_3Dcontext_unset_rendering_context(pdp_glx_env.last_context_packet); -} - - -/* setup routine */ - -void pdp_3Dcontext_glx_setup(void) -{ - /* this opens the connection to the x server and creates a render context - for windows (glx < 1.3) or windows/pbufs (glx >= 1.3) */ - - static int dblBuf24[] = {GLX_RGBA, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - GLX_ALPHA_SIZE, 0, - GLX_DEPTH_SIZE, 1, - GLX_DOUBLEBUFFER, - None}; - - pdp_glx_env.initialized = 0; - - - /* init xlib for thread usage */ - if (!XInitThreads()){ - post("pdp_opengl_system_setup: can't init Xlib for thread usage."); - goto init_failed; - } - - - /* open display: - the first display on the local machine is opened, not DISPLAY. - since pdp_opengl is all about direct rendering, and there - is no way to specify another display, or even close it and - open it again, this seems to be the "least surprise" solution. - it enables the pd interface to be displayed on another display, - using the DISPLAY environment variable. */ - - if (NULL == (pdp_glx_env.dpy = XOpenDisplay(":0"))){ - post("pdp_opengl_system_setup: can't open display"); - goto init_failed; - } - - - /* get screen */ - pdp_glx_env.screen = DefaultScreen(pdp_glx_env.dpy); - - /* get visual */ - if (NULL == (pdp_glx_env.visual = glXChooseVisual(pdp_glx_env.dpy, pdp_glx_env.screen, dblBuf24))){ - post("pdp_opengl_system_setup: can't find appropriate visual"); - goto init_failed_close_dpy; - } - - - /* create a (direct) rendering context */ - if (NULL == (pdp_glx_env.context = glXCreateContext(pdp_glx_env.dpy, pdp_glx_env.visual, 0, True))){ - post("pdp_opengl_system_setup: can't create rendering context"); - goto init_failed_close_dpy; - } - - //post("pdp_opengl_system_setup: pdp_opengl init OK."); - pdp_glx_env.last_context_packet = -1; - pdp_glx_env.initialized = 1; - - /* setup class object */ - context_class = pdp_class_new(pdp_gensym("3Dcontext/*"), 0); - context_class->cleanup = _3Dcontext_cleanup; - context_class->reinit = _3Dcontext_reinit; - context_class->clone = _3Dcontext_clone; - context_class->copy = _3Dcontext_copy; - - - /* setup conversion programs: NOT IMPLEMENTED */ - - - return; - - - init_failed_close_dpy: - XCloseDisplay(pdp_glx_env.dpy); - init_failed: - post("pdp_opengl_system_setup: ERROR: pdp_opengl init failed. i sense a crash coming.."); - -} - - -#ifdef __cplusplus -//} -#endif diff --git a/opengl/system/pdp_3dp_base.c b/opengl/system/pdp_3dp_base.c deleted file mode 100644 index 5190c11..0000000 --- a/opengl/system/pdp_3dp_base.c +++ /dev/null @@ -1,30 +0,0 @@ -#include "pdp_opengl.h" -#include "pdp_3dp_base.h" - -#define THIS(b) t_pdp_3pd_base *b = (t_pdp_3pd_base *)x - -/* destructor */ -void pdp_3dp_base_free(void *x) -{ - // free super - pdp_dpd_base_free(x); -} - -/* init method */ -void pdp_3dp_base_init(void *x) -{ - // init super - pdp_dpd_base_init(x); - - // set processing queue to pdp_opengl system queue - pdp_dpd_base_set_queue(x, pdp_opengl_get_queue()); - -} - -/* class setup method */ -void pdp_3dp_base_setup(t_class *class) -{ - // setup super - pdp_dpd_base_setup(class); -} - diff --git a/opengl/system/pdp_mesh.c b/opengl/system/pdp_mesh.c deleted file mode 100644 index b319d1e..0000000 --- a/opengl/system/pdp_mesh.c +++ /dev/null @@ -1,560 +0,0 @@ -/* - * Pure Data Packet module. mesh implementation - * 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. - * - */ - -/* a very naive approach to triangular meshes */ - - -// $$TODO: some serious memory corruption in this file our the list implementation - - -#include <math.h> - -#include "pdp.h" -#include "pdp_mesh.h" - - -/* VERTEX methods */ -void vertex_add_triangle(t_vertex *v, t_triangle *t) -{ - pdp_list_add_pointer(v->trilist, t); -} -void vertex_remove_triangle(t_vertex *v, t_triangle *t) -{ - pdp_list_remove_pointer(v->trilist, t); -} -void vertex_add_neighbour(t_vertex *v, t_vertex *neighbour) -{ - pdp_list_add_pointer_to_set(v->vertlist, neighbour); -}; - - -/* constructor/destructors are "private" - they may only be called by the mesh object to ensure - the vector list stays sound (i.e. without duplicates) */ -void _vertex_free(t_vertex *v) -{ - if (!v->trilist) post("WARNING: vertex %x has empty trilist", v); - else{ - pdp_list_free(v->trilist); - v->trilist = 0; - } - if (!v->vertlist) post("WARNING: vertex %x has empty vertlist", v); - { - pdp_list_free(v->vertlist); - v->vertlist = 0; - } - pdp_dealloc(v); -} - -t_vertex *_vertex_new(float *c, float *n) -{ - int k; - t_vertex *v = (t_vertex *) pdp_alloc(sizeof(t_vertex)); - I3(k) v->c[k] = c[k]; - I3(k) v->n[k] = n[k]; - v->trilist = pdp_list_new(0); - v->vertlist = pdp_list_new(0); - return v; -} - - -void vertex_compute_normal_random(t_vertex *v){int k; I3(k) v->n[k] = _rand();} -void vertex_compute_normal_sphere(t_vertex *v){int k; I3(k) v->n[k] = v->c[k];} -void vertex_compute_normal_prism(t_vertex *v) -{ - float scale = 0.0f; - float sum[] = {0.0f, 0.0f, 0.0f}; - int k; - t_pdp_atom* i; - t_pdp_list *vl = v->vertlist; - t_vertex *vtx; - - PDP_POINTER_IN(vl, i, vtx) { - I3(k) sum[k] += vtx->c[k]; - scale = scale + 1.0f; - } - scale = 1.0f / scale; - I3(k) sum[k] *= scale; - I3(k) v->n[k] = v->c[k] - sum[k]; - - //post("computed normal (%f, %f, %f) of vertex (%f, %f, %f)", v->n[0], v->n[1], v->n[2], v->c[0], v->c[1], v->c[2]); -}; -void vertex_compute_normal_average(t_vertex *v) -{ - int triangles = pdp_list_size(v->trilist); - float scale = 1.0f / ((float)triangles); - t_pdp_atom* i; - int k; - t_triangle *t; - - I3(k) v->n[k] = 0; //reset normal - PDP_POINTER_IN(v->trilist, i, t){ - I3(k) v->n[k] += t->n[k]; - } - _vector3_scale(v->n, scale); - - -} - - -float vertex_normalize(t_vertex *v) -{ - return _vector3_normalize(v->c); -} - - -/* TRIANGLE methods */ - -/* create triangle (a connection between 3 vertices): - counterclockwize with facing front - this method is "private" - you can only create triangles as part of a mesh */ -t_triangle *_triangle_new(t_vertex *v0, t_vertex *v1, t_vertex *v2) -{ - int k; - - t_triangle *t = (t_triangle *)pdp_alloc(sizeof(t_triangle)); - - /* store vertex references */ - t->v[0] = v0; - t->v[1] = v1; - t->v[2] = v2; - - /* reset median vertices */ - I3(k) t->m[k] = 0; - - /* connect triangle to vertices */ - vertex_add_triangle(v0, t); - vertex_add_triangle(v1, t); - vertex_add_triangle(v2, t); - - /* connect vertices to vertices */ - vertex_add_neighbour(v0, v1); - vertex_add_neighbour(v0, v2); - vertex_add_neighbour(v1, v0); - vertex_add_neighbour(v1, v2); - vertex_add_neighbour(v2, v0); - vertex_add_neighbour(v2, v1); - - return t; -} - -/* delete a triangle, disconnecting the vertices */ -void _triangle_free(t_triangle *t) -{ - int k; - - /* remove the triangle reference of the vertices */ - I3(k) vertex_remove_triangle(t->v[k], t); - - /* set references to zero (bug catcher) */ - I3(k) t->v[k] = 0; - I3(k) t->m[k] = 0; - - /* free struct */ - pdp_dealloc(t); - -} - -/* get triangle that shares the link between v0 and v1 */ -t_triangle *triangle_neighbour(t_triangle *t, t_vertex *v0, t_vertex *v1) -{ - t_pdp_atom* it; - t_triangle *tri; - PDP_POINTER_IN(v1->trilist, it, tri){ - if (tri != t && pdp_list_contains_pointer(v0->trilist, tri)) return tri; - } - return 0; -} - -/* add a median vector to a link in a triangle - note: vertices must be in triangle, or behaviour is undefined */ -void triangle_add_median(t_triangle *t, t_vertex *v0, t_vertex *v1, t_vertex *median) -{ - - /* link 0 1 */ - if (!((v0 == t->v[2]) || (v1 == t->v[2]))) t->m[0] = median; - - /* link 1 2 */ - else if (!((v0 == t->v[0]) || (v1 == t->v[0]))) t->m[1] = median; - - /* link 2 0 */ - else t->m[2] = median; -} - -void triangle_compute_normal(t_triangle *t) -{ - int k; - float v0[3]; - float v1[3]; - I3(k) v0[k] = t->v[1]->c[k] - t->v[0]->c[k]; - I3(k) v1[k] = t->v[2]->c[k] - t->v[0]->c[k]; - _vector3_cross(v0,v1,t->n); -} - -void triangle_compute_unit_normal(t_triangle *t) -{ - triangle_compute_normal(t); - _vector3_normalize(t->n); -} - -/* MESH methods */ - -/* add and remove methods for vertices and triangles */ -t_vertex *mesh_vertex_add(t_mesh *m, float *c, float *n) -{ - t_vertex *v = _vertex_new(c, n); - pdp_list_add_pointer(m->vertices, v); - return v; -} - -void mesh_vertex_remove(t_mesh *m, t_vertex *v) -{ - pdp_list_remove_pointer(m->vertices, v); - _vertex_free(v); -} - -t_triangle *mesh_triangle_add(t_mesh *m, t_vertex *v0, t_vertex *v1, t_vertex *v2) -{ - t_triangle *t = _triangle_new(v0,v1,v2); - pdp_list_add_pointer(m->triangles, t); - return t; -} - -void mesh_triangle_remove(t_mesh *m, t_triangle *t) -{ - pdp_list_remove_pointer(m->triangles, t); - _triangle_free(t); -} - -/* calculate normals */ -void mesh_calculate_normals(t_mesh *m) -{ - t_pdp_atom* it; - t_pdp_atom* it_tri; - t_pdp_list *l = m->vertices; - t_pdp_list *l_tri = m->triangles; - t_vertex *v; - t_triangle *t; - //while (v = pdp_list_getnext_pointer(l, &it)) vertex_compute_normal_sphere(v); - switch(m->normal_type){ - default: - case MESH_NORMAL_SPHERE: PDP_POINTER_IN(l, it, v) vertex_compute_normal_sphere(v); break; - case MESH_NORMAL_PRISM: PDP_POINTER_IN(l, it, v) vertex_compute_normal_prism(v); break; - case MESH_NORMAL_RANDOM: PDP_POINTER_IN(l, it, v) vertex_compute_normal_random(v); break; - case MESH_NORMAL_AVERAGE: - PDP_POINTER_IN(l_tri, it_tri, t) triangle_compute_unit_normal(t); - PDP_POINTER_IN(l, it, v) vertex_compute_normal_average(v); - break; - } -} - -/* split a triangle in 4, using the intermedia median vertex storage */ -void mesh_split_four(t_mesh *m, t_triangle *old_t) -{ - int k; - t_vertex *v[6]; - - /* some intermediates */ - t_triangle *neighbour; - t_float newv[] = {0,0,0}; - t_float nullvect[] = {0,0,0}; - - - /* get main vertices */ - I3(k) v[k] = old_t->v[k]; - - /* get median vertices inserted by neighbouring triangles */ - I3(k) v[k+3] = old_t->m[k]; - -#define GET_MEDIAN(v, v0, v1) \ - if (!v){ \ - I3(k) newv[k] = 0.5f * (v0->c[k] + v1->c[k]); \ - v = mesh_vertex_add(m, newv, nullvect); \ - /*vertex_normalize(v);*/ \ - if (neighbour = triangle_neighbour(old_t, v0, v1)){ \ - triangle_add_median(neighbour, v0, v1, v); \ - } \ - } - - GET_MEDIAN(v[3], v[0], v[1]) - GET_MEDIAN(v[4], v[1], v[2]) - GET_MEDIAN(v[5], v[2], v[0]) - -#undef GET_MEDIAN - - /* remove the old triangle */ - mesh_triangle_remove(m, old_t); - - /* create 4 new triangles */ - mesh_triangle_add(m, v[0], v[3], v[5]); - mesh_triangle_add(m, v[1], v[4], v[3]); - mesh_triangle_add(m, v[2], v[5], v[4]); - mesh_triangle_add(m, v[3], v[4], v[5]); - -} - -/* split a triangle in 3 */ -void mesh_split_three(t_mesh *m, t_triangle *old_t) -{ - int k, l; - t_vertex *v[4]; - t_float newv[] = {0,0,0}; - t_float nullvect[] = {0,0,0}; - - /* get vertices */ - I3(k) v[k] = old_t->v[k]; - - /* remove a triangle */ - mesh_triangle_remove(m, old_t); - - /* compute new vertex coordinates */ - I3(k) I3(l) newv[k] += 0.33333f * v[l]->c[k]; - - /* create new vertex */ - v[3] = mesh_vertex_add(m, newv, nullvect); - //vertex_normalize(v[3]); - - /* create 3 new triangles */ - mesh_triangle_add(m, v[0], v[1], v[3]); - mesh_triangle_add(m, v[1], v[2], v[3]); - mesh_triangle_add(m, v[2], v[0], v[3]); - -} - - - -void mesh_split_all_four(t_mesh *m) -{ - t_triangle *t; - t_pdp_list *l = pdp_list_copy(m->triangles); - - //post("split_all_four: nb triangles %d", pdp_list_size(m->triangles)); - - while (l->elements){ - t = pdp_list_pop(l).w_pointer; - mesh_split_four(m, t); - } - mesh_calculate_normals(m); - pdp_list_free(l); -} - - -void mesh_split_all_three(t_mesh *m) -{ - t_triangle *t; - t_pdp_list *l = pdp_list_copy(m->triangles); - - //post("split_all_three: nb triangles %d", pdp_list_size(m->triangles)); - - while (l->elements){ - t = pdp_list_pop(l).w_pointer; - mesh_split_three(m, t); - } - mesh_calculate_normals(m); - pdp_list_free(l); -} - -void mesh_split_random_three(t_mesh *m) -{ - int size = pdp_list_size(m->triangles); - t_triangle *t = pdp_list_index(m->triangles, (random() % size)).w_pointer; - mesh_split_three(m, t); - mesh_calculate_normals(m); -} - - - -void mesh_free(t_mesh *m) -{ - t_pdp_list *l; - t_triangle *t; - t_vertex *v; - - /* delete all triangles */ - while (m->triangles->elements){ - t = pdp_list_pop(m->triangles).w_pointer; - //post("freeing triangle %x", t); - _triangle_free(t); - } - pdp_list_free(m->triangles); - m->triangles = 0; - - /* delete all vertices */ - while (m->vertices->elements){ - v = pdp_list_pop(m->vertices).w_pointer; - //post("freeing vertex %x", v); - _vertex_free(v); - } - pdp_list_free(m->vertices); - m->vertices = 0; - - pdp_dealloc(m); - -} - - -t_mesh *_mesh_new(void) -{ - t_mesh *m = (t_mesh *)pdp_alloc(sizeof(t_mesh)); - - /* create main vertex and triangle lists */ - m->triangles = pdp_list_new(0); - m->vertices = pdp_list_new(0); - - /* set normal type */ - m->normal_type = MESH_NORMAL_PRISM; - - return m; -} - -/* init tetra */ -t_mesh *mesh_new_tetra(void) -{ - int k; - t_triangle *t[4]; - t_vertex *v[4]; - t_pdp_atom* it; - t_triangle *tri; - t_mesh *m = _mesh_new(); - - float n[] = {0,0,0}; - float fv[4][3] = {{2,0,0},{0,2,0},{0,0,2}, {-1,-1,-1}}; - - /* add vertices */ - I4(k) v[k] = mesh_vertex_add(m, &fv[k][0], n); - I4(k) vertex_normalize(v[k]); - - /* add triangles */ - mesh_triangle_add(m, v[0], v[1], v[2]); - mesh_triangle_add(m, v[1], v[0], v[3]); - mesh_triangle_add(m, v[0], v[2], v[3]); - mesh_triangle_add(m, v[1], v[3], v[2]); - - - /* compute normals */ - mesh_calculate_normals(m); - - return m; -} - - -void _mesh_relax_compute_resultant_spring(t_mesh *m, float *center, float d0, float r0) -{ - int k; - t_pdp_atom *i, *j; - t_vertex *v, *w; - - PDP_POINTER_IN(m->vertices, i, v){ - float scale = 0.0f; - float r; - - /* compute contribution of origin link */ - I3(k) v->n[k] = v->c[k] - center[k]; - r = _vector3_normalize(v->n); - I3(k) v->n[k] *= (r0 - r); - - PDP_POINTER_IN(v->vertlist, j, w){ - int k; - float f[3]; - float d, l; - - /* compute force contribution of one link (model: spring with rest length == d0) */ - I3(k) f[k] = w->c[k] - v->c[k]; // PC: f == distance vector - d = _vector3_normalize(f); // PC: d == distance, vector == unit norm - I3(k) v->n[k] += (d - d0) * f[k]; // PC: n == n_prev + fource resultant - } - } -} - -void _mesh_relax_apply_force(t_mesh *m, float k) -{ - t_pdp_atom* it; - t_vertex *v; - - PDP_POINTER_IN(m->vertices, it, v){ - int i; - /* apply fource vector with step */ - I3(i) v->c[i] += k * v->n[i]; - } - -} - -void mesh_compute_center(t_mesh *m, float *c) -{ - t_pdp_atom*(it); - t_vertex *v; - float scale; - int k; - - I3(k) c[k] = 0; - PDP_POINTER_IN(m->vertices, it, v){ - I3(k) c[k] += v->c[k]; - } - scale = 1.0f / ((float)pdp_list_size(m->vertices)); - I3(k) c[k] *= scale; - -} - -void mesh_translate(t_mesh *m, float *c) -{ - t_pdp_atom *it; - t_vertex *v; - int k; - - PDP_POINTER_IN(m->vertices, it, v){ - I3(k) v->c[k] += c[k]; - } -} - -/* relax a mesh (move toward equal link length) */ -void mesh_relax(t_mesh *m, float step, float d0, float r0) -{ - int k; - float c[3]; - mesh_compute_center(m, c); - I3(k) c[k] = -c[k]; - mesh_translate(m, c); - I3(k) c[k] = 0; - _mesh_relax_compute_resultant_spring(m, c, d0, r0); /* compute force resultant */ - _mesh_relax_apply_force(m, step); /* apply "time step towards desired distance" */ - mesh_calculate_normals(m); /* restore normals */ -} - - - -/* print some debug information */ -void mesh_debug(t_mesh *m) -{ - int k; - int boundary_edges = 0; - t_pdp_atom* it; - t_triangle *t; - post("mesh info"); - post("\tnumber of vertices = %d", pdp_list_size(m->vertices)); - post("\tnumber of triangles = %d", pdp_list_size(m->triangles)); - - PDP_POINTER_IN(m->triangles, it, t){ - I3(k) if (!triangle_neighbour(t, t->v[k], t->v[(k+1)%3])) boundary_edges++; - } - post("\tnumber of boundaray edges = %d", boundary_edges); - - -} diff --git a/opengl/system/pdp_opengl.c b/opengl/system/pdp_opengl.c deleted file mode 100644 index 541af75..0000000 --- a/opengl/system/pdp_opengl.c +++ /dev/null @@ -1,76 +0,0 @@ - -/* - * OpenGL Extension Module for pdp - opengl system stuff - * 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 "pdp.h" -#include "pdp_control.h" - -#define PDP_3DP_QUEUE_LOGSIZE 16 -#define PDP_3DP_QUEUE_DELTIME 1.0f - - - -void pdp_3Dcontext_prepare_for_thread_switch(void *); -static t_pdp_procqueue _3dp_queue; - - -static void pdp_control_thread(void *x, t_symbol *s, int argc, t_atom *argv) -{ - int t = 0; - float f; - if (argc != 1) return; - if (argv[0].a_type != A_FLOAT) return; - f = argv[0].a_w.w_float; - t = (f != 0.0f); - post("3dp thread switched %s", t ? "on":"off"); - - - /* when we switch threads, the glx system needs to be notified - because it has to release the render context. this is done - in a process method, so it is run in the correct thread. */ - - - pdp_procqueue_add(&_3dp_queue, 0, pdp_3Dcontext_prepare_for_thread_switch, 0, 0); - pdp_procqueue_wait(&_3dp_queue); - - - /* fresh start: enable/disable the thread dispatching */ - pdp_procqueue_use_thread(&_3dp_queue, t); - -} - -/* kernel setup */ -void pdp_opengl_system_setup(void) -{ - /* init the 3dp queue */ - pdp_procqueue_init(&_3dp_queue, PDP_3DP_QUEUE_DELTIME, PDP_3DP_QUEUE_LOGSIZE); - - /* scheduler uses the thread */ - pdp_procqueue_use_thread(&_3dp_queue, 1); - //pdp_procqueue_use_thread(&_3dp_queue, 0); //DEBUG: disable 3dp thread - - /* add pdp_control method for thread */ - pdp_control_addmethod((t_method)pdp_control_thread, gensym("3dthread")); -} - -t_pdp_procqueue* pdp_opengl_get_queue(void){return (&_3dp_queue);} - - - diff --git a/opengl/system/pdp_texture.c b/opengl/system/pdp_texture.c deleted file mode 100644 index 46e1c7a..0000000 --- a/opengl/system/pdp_texture.c +++ /dev/null @@ -1,541 +0,0 @@ -/* - * OpenGL Extension Module for pdp - texture packet implementation - * 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. - * - */ - - -/* this modules implemtents the opengl texture packet - it contains only portable opengl code */ - -#include <stdio.h> -#include <GL/gl.h> -#include <GL/glu.h> -#include "pdp_opengl.h" -#include "pdp_texture.h" -#include "pdp_dpd_command.h" - - -static t_pdp_class *texture_class; - -static t_pdp_dpd_commandfactory _tex_cf; - -typedef struct _texture_command -{ - t_pdp_dpd_command base; - int p_src; - int p_dst; -} t_texture_command; - - -/* all symbols are C-style */ -#ifdef __cplusplus -extern "C" -{ -#endif - - - -/* returns a pointer to the packet subheader given the pdp header */ -static t_texture *_pdp_tex_info(t_pdp *x) -{ - return (t_texture *)&(x->info.raw); -} - - -/* create a pow of 2 texture dimension, ge than 8 */ -static int _round_to_pow_2(int n){ - int r = 8; - while (n > r) r <<= 1; - return r; -} - -t_pdp_symbol *_pdp_get_tex_description_from_params(GLsizei width, GLsizei height, GLint format) -{ - char description[1024]; - char *c = description; - - c += sprintf(c, "texture"); - switch(format){ - case GL_LUMINANCE: c += sprintf(c, "/grey"); break; - case GL_RGB: c += sprintf(c, "/rgb"); break; - case GL_RGBA: c += sprintf(c, "/rgba"); break; - default: - c += sprintf(c, "/unknown"); goto exit; - } - c += sprintf(c, "/%dx%d", width, height); - - exit: - return pdp_gensym(description); -} - -t_pdp_symbol *_pdp_tex_get_description(t_pdp *header) -{ - t_texture *texture = _pdp_tex_info(header); - int encoding; - - if (!header) return pdp_gensym("invalid"); - else if (!header->desc){ - if (header->type == PDP_TEXTURE){ - /* if description is not defined, try to construct it */ - return _pdp_get_tex_description_from_params(texture->width, texture->height, texture->format); - } - else return pdp_gensym("unknown"); - } - else return header->desc; -} - - -static int _pdp_packet_texture_old_or_dummy(u32 width, u32 height, s32 format); -static void _pdp_packet_gentexture(int packet); - -static void texture_command_convert_bitmap_to_texture(t_texture_command *c) -{ - t_texture *t = (t_texture *)pdp_packet_subheader(c->p_dst); - - /* make sure packet contains a texture, since it is created with _pdp_packet_reuse_texture */ - _pdp_packet_gentexture(c->p_dst); - - /* flip source image before uploading */ - pdp_packet_bitmap_flip_top_bottom(c->p_src); - - /* fill texture */ - pdp_packet_texture_make_current(c->p_dst); - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, t->sub_width, t->sub_height, - t->format, GL_UNSIGNED_BYTE, (char *)pdp_packet_data(c->p_src)); - - /* decrease refcount */ - pdp_packet_mark_unused(c->p_src); - pdp_packet_mark_unused(c->p_dst); - - //post("conversion done"); - pdp_dpd_command_suicide(c); -} - - -/* converters to standard pdp types */ -int _pdp_packet_texture_convert_image_to_texture(int packet, t_pdp_symbol *dest_template) -{ - int p_temp, p; - - //post ("converting to bitmap"); - p_temp = pdp_packet_convert_rw(packet, pdp_gensym("bitmap/*/*")); - if (p_temp == -1) return -1; - - //post ("converting to texture"); - p = pdp_packet_convert_rw(p_temp, pdp_gensym("texture/*/*")); - pdp_packet_mark_unused(p_temp); - return p; -} - - - -/* converters to standard pdp types */ -int _pdp_packet_texture_convert_bitmap_to_texture(int packet, t_pdp_symbol *dest_template) -{ - t_pdp *header = pdp_packet_header(packet); - void *data = pdp_packet_data (packet); - int new_p; - u32 w; - u32 h; - t_texture_command *c; - - if (!pdp_packet_bitmap_isvalid(packet)) return -1; - - w = header->info.image.width; - h = header->info.image.height; - - switch (header->info.image.encoding){ - case PDP_BITMAP_GREY: - /* create greyscale texture */ - new_p = _pdp_packet_texture_old_or_dummy(w,h, GL_LUMINANCE); - break; - case PDP_BITMAP_RGB: - /* create rgb texture */ - new_p = _pdp_packet_texture_old_or_dummy(w,h, GL_RGB); - break; - case PDP_BITMAP_RGBA: - /* create greyscale texture */ - new_p = _pdp_packet_texture_old_or_dummy(w,h, GL_RGBA); - break; - default: - new_p = -1; - break; - } - - if (new_p != -1){ - - /* remark: this is a hack. a texture has to be created - when a rendering context is active. this means it has - to be created in the correct thread. therefore a dpd - command is added to the 3dp queue. this seems to work, - but without a dropping mechanism, this can overload the - queue. the real solution would be to add a converter - object to a 3dp chain, or to accept image or bitmap - packets in 3dp objects */ - - - /* dispatch command */ - c = (t_texture_command *)pdp_dpd_commandfactory_get_new_command(&_tex_cf); - c->p_src = pdp_packet_copy_rw(packet); - c->p_dst = pdp_packet_copy_ro(new_p); - pdp_procqueue_add(pdp_opengl_get_queue(), c, texture_command_convert_bitmap_to_texture, 0, 0); - } - return new_p; - -} - - - -int _pdp_packet_texture_convert_texture_to_bitmap(int packet, t_pdp_symbol *dest_template0) -{ - post("_pdp_packet_texture_convert_texture_to_bitmap not implemented."); - return -1; -} - - -t_texture *pdp_packet_texture_info(int packet) -{ - t_pdp *header = pdp_packet_header(packet); - if (pdp_packet_texture_isvalid(packet)) return _pdp_tex_info(header); - else return 0; -} - -/* check if valid texture packet. all other methods assume packet is valid */ -int pdp_packet_texture_isvalid(int packet) -{ - t_pdp *header; - if (!(header = pdp_packet_header(packet))) return 0; - if (PDP_TEXTURE != header->type) return 0; - return glIsTexture(_pdp_tex_info(header)->tex_obj); -} - - - -static void _tex_init_obj(t_texture *t) -{ - //u8 *dummydata; - //int i; - - glBindTexture(GL_TEXTURE_2D, t->tex_obj); - glTexImage2D(GL_TEXTURE_2D, 0, t->format, t->width, t->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); - - /* debug - dummydata = (u8 *)malloc(t->width*t->height*4); - for (i=0; i<t->width*t->height*4; i++){dummydata[i] = random(); } - glTexImage2D(GL_TEXTURE_2D, 0, t->format, t->width, t->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, dummydata); - free(dummydata); - */ - -} - - -static void _pdp_tex_copy(t_pdp *dst, t_pdp *src); -static void _pdp_tex_clone(t_pdp *dst, t_pdp *src); -static void _pdp_tex_reinit(t_pdp *dst); -static void _pdp_tex_cleanup(t_pdp *dst); - -static void _pdp_tex_init_methods(t_pdp *h) -{ - h->theclass = texture_class; -} - -static void _pdp_tex_reinit(t_pdp *dst) -{ - /* this does nothing. texture is assumed to be in a valid state */ -} -static void _pdp_tex_clone(t_pdp *dst, t_pdp *src) -{ - t_texture *dst_t = _pdp_tex_info(dst); - t_texture *src_t = _pdp_tex_info(src); - - //post("WARNING: _pdp_tex_clone: should not be called from outside 3d thread"); - - /* determine if destination texture is valid */ - if (glIsTexture(dst_t->tex_obj)){ - /* check format */ - if ((dst_t->width >= src_t->width) - && (dst_t->height >= src_t->height) - && (dst_t->format == src_t->format)){ - dst_t->sub_width = src_t->sub_width; - dst_t->sub_height = src_t->sub_height; - return; - } - } - /* not initialized, so we need to create a new one */ - else { - glGenTextures(1, (GLuint*)&dst_t->tex_obj); - } - - /* setup header */ - dst_t->width = src_t->width; - dst_t->height = src_t->height; - dst_t->format = src_t->format; - dst_t->sub_width = src_t->sub_width; - dst_t->sub_height = src_t->sub_height; - - /* setup packet methods */ - _pdp_tex_init_methods(dst); - - /* init description */ - dst->desc = _pdp_tex_get_description(dst); - -} -static void _pdp_tex_copy(t_pdp *dst, t_pdp *src) -{ - /* texture copying is inefficient. for the tex extensions there is no analogy - for "efficient in-place processing" - this means the pdp_packet_register_rw() call should be avoided - this inconsistency should be tucked away in a texture base class */ - - /* todo: use texture combining extensions for this */ - - post("WARNING: fanout is not yet implemented correctly for texture packets"); - - /* not implemented yet, just a call to the clone method */ - _pdp_tex_clone(dst, src); -} - -static void _pdp_tex_cleanup(t_pdp *dst) -{ - t_texture *t = _pdp_tex_info(dst); - glDeleteTextures(1, (GLuint*)&t->tex_obj); - t->tex_obj = -1; /* is this value guaranteed to be invalid? */ -} - - -/* texture constructors */ - -/* reuse a texture, or create a "dummy" == packet with everything except a valid texture object */ -static int _pdp_packet_texture_old_or_dummy(u32 width, u32 height, s32 format) -{ - int p = -1; - t_pdp *h; - t_texture *t; - - int p2_w = _round_to_pow_2(width); - int p2_h = _round_to_pow_2(height); - - - /* try to reuse a texture packet or get a new one */ - p = pdp_packet_reuse(_pdp_get_tex_description_from_params(p2_w, p2_h, format)); - if (-1 == p) p = pdp_packet_brandnew(PDP_TEXTURE, 0); - if (-1 == p) return -1; - - h = pdp_packet_header(p); - t = _pdp_tex_info(h); - - /* check if alloc succeded */ - if (!h) return -1; - - /* check if tex is already initialized */ - if (pdp_packet_texture_isvalid(p)){ - /* check format */ - if ((t->width >= width) && (t->height >= height) && (t->format == format)){ - //post("pdp_packet_new_tex: reused"); - t->sub_width = width; - t->sub_height = height; - return p; - } - post("ERROR: pdp_packet_new_texture: pdp_packet_reuse returned wrong type"); - } - - /* determine the texture dims * setup rest of data struct */ - t->width = 64; - t->height = 64; - while (t->width < width) t->width <<= 1; - while (t->height < height) t->height <<= 1; - - t->format = format; - t->sub_width = width; - t->sub_height = height; - - _pdp_tex_init_methods(h); - - - /* init the texture */ - //_tex_init_obj(t); - - /* init description */ - h->desc = _pdp_tex_get_description(h); - - - return p; -} - -/* don't call this method on a non-texture object! */ -static void _pdp_packet_gentexture(int p) -{ - t_texture *t; - if (!pdp_packet_texture_isvalid(p)){ - /* not initialized, so we need to create a new one */ - // post("generating texture"); - t = (t_texture *)pdp_packet_subheader(p); - - /* create the texture object */ - glGenTextures(1, (GLuint *)&t->tex_obj); - - /* init the texture */ - _tex_init_obj(t); - - } -} - -int pdp_packet_new_texture(u32 width, u32 height, s32 format) -{ - t_texture *t; - int p = _pdp_packet_texture_old_or_dummy(width, height, format); - - //post("WARNING: pdp_packet_new_texture: this method should not be called outside the 3dp thread"); - - if (p == -1) return -1; - _pdp_packet_gentexture(p); - return p; -} - - -/* high level texture packet operators */ - -/* make a texture the current texture context */ -void pdp_packet_texture_make_current(int packet) -{ - t_texture *t = pdp_packet_texture_info(packet); - if (!t) return; - glBindTexture(GL_TEXTURE_2D, t->tex_obj); -} - -void pdp_packet_texture_make_current_enable(int packet) -{ - glEnable(GL_TEXTURE_2D); - pdp_packet_texture_make_current(packet); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); -} - -float pdp_packet_texture_fracx(int packet) -{ - t_texture *t = pdp_packet_texture_info(packet); - if (!t) return 0.0; - return (float)t->sub_width/t->width; -} - -float pdp_packet_texture_fracy(int packet) -{ - t_texture *t = pdp_packet_texture_info(packet); - if (!t) return 0.0; - return (float)t->sub_height/t->height; -} - -u32 pdp_packet_texture_total_width(int packet) -{ - t_texture *t = pdp_packet_texture_info(packet); - if (!t) return 0; - return t->width; - -} -u32 pdp_packet_texture_total_height(int packet) -{ - t_texture *t = pdp_packet_texture_info(packet); - if (!t) return 0; - return t->height; - -} - -u32 pdp_packet_texture_sub_width(int packet) -{ - t_texture *t = pdp_packet_texture_info(packet); - if (!t) return 0; - return t->sub_width; - -} -u32 pdp_packet_texture_sub_height(int packet) -{ - t_texture *t = pdp_packet_texture_info(packet); - if (!t) return 0; - return t->sub_height; -} - -float pdp_packet_texture_sub_aspect(int packet) -{ - t_texture *t = pdp_packet_texture_info(packet); - if (!t) return 0; - return (float)t->sub_width/t->sub_height; -} - -/* setup for 2d operation from texture dimensions */ -void pdp_packet_texture_setup_2d_context(int p) -{ - u32 w; - u32 h; - float asp; - if (!pdp_packet_texture_isvalid(p)) return; - w = pdp_packet_texture_sub_width(p); - h = pdp_packet_texture_sub_height(p); - asp = pdp_packet_texture_sub_aspect(p); - - /* set the viewport to the size of the sub texture */ - glViewport(0, 0, w, h); - - /* set orthogonal projection, with a relative frame size of (2asp x 2) */ - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - gluOrtho2D(0.0, 2*asp, 0, 2); - - /* set the center of view */ - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(asp, 1, 0); - glScalef(1,-1,1); -} - -void pdp_texture_setup(void) -{ - t_pdp_conversion_program *program; - - /* setup packet class */ - texture_class = pdp_class_new(pdp_gensym("texture/*/*"), 0); - texture_class->cleanup = _pdp_tex_cleanup; - texture_class->reinit = _pdp_tex_reinit; - texture_class->clone = _pdp_tex_clone; - texture_class->copy = _pdp_tex_copy; - - /* init command list */ - pdp_dpd_commandfactory_init(&_tex_cf, sizeof(t_texture_command)); - - - - /* setup programs */ - program = pdp_conversion_program_new(_pdp_packet_texture_convert_bitmap_to_texture, 0); - pdp_type_register_conversion(pdp_gensym("bitmap/*/*"), pdp_gensym("texture/*/*"), program); - - /* this is a hack to use until the type conversion system has a proper search algo */ - program = pdp_conversion_program_new(_pdp_packet_texture_convert_image_to_texture, 0); - pdp_type_register_conversion(pdp_gensym("image/*/*"), pdp_gensym("texture/*/*"), program); - - - program = pdp_conversion_program_new(_pdp_packet_texture_convert_texture_to_bitmap, 0); - pdp_type_register_conversion(pdp_gensym("texture/*/*"), pdp_gensym("bitmap/*/*"), program); - -} - -/* all symbols are C-style */ -#ifdef __cplusplus -} -#endif diff --git a/opengl/system/setup.c b/opengl/system/setup.c deleted file mode 100644 index 4bbda49..0000000 --- a/opengl/system/setup.c +++ /dev/null @@ -1,80 +0,0 @@ -#include "pdp_opengl.h" - -/* 3dp overview: - - - texture packets (gl) - - drawable packets (glX windows and pbufs) - - the 3dp system connects to a display server and creates a common context - this can be a pbuf context (if supported, glx >= 1.3) or a normal glX context - textures are standard opengl - drawable packets are wrappers around glx drawables (windows or pbufs) - they share the central display connection and rendering context - -*/ - - -#ifdef __cplusplus -extern "C" -{ -#endif - -/* opengl lib kernel setup */ -void pdp_opengl_system_setup(void); - -/* packet type setup */ -void pdp_3Dcontext_glx_setup(void); /* glx specific part of the 3D context packet */ -void pdp_3Dcontext_common_setup(void); /* common part of the 3D context packet */ -void pdp_texture_setup(void); /* texture packet */ - - -/* module setup */ -void pdp_3d_windowcontext_setup(void); -void pdp_3d_draw_setup(void); -void pdp_3d_view_setup(void); -void pdp_3d_light_setup(void); -void pdp_3d_color_setup(void); -void pdp_3d_push_setup(void); -void pdp_3d_snap_setup(void); -void pdp_3d_dlist_setup(void); -void pdp_3d_drawmesh_setup(void); -void pdp_3d_for_setup(void); -void pdp_3d_state_setup(void); -void pdp_3d_subcontext_setup(void); - - -void pdp_opengl_setup(void) -{ - int i; - post("PDP: pdp_opengl extension library"); - - /* setup system */ - pdp_opengl_system_setup(); - - /* setup packet types */ - pdp_3Dcontext_glx_setup(); - pdp_3Dcontext_common_setup(); - pdp_texture_setup(); - - - /* setup modules */ - pdp_3d_windowcontext_setup(); - pdp_3d_draw_setup(); - pdp_3d_view_setup(); - pdp_3d_push_setup(); - pdp_3d_light_setup(); - pdp_3d_dlist_setup(); - pdp_3d_color_setup(); - pdp_3d_snap_setup(); - pdp_3d_drawmesh_setup(); - pdp_3d_for_setup(); - pdp_3d_state_setup(); - pdp_3d_subcontext_setup(); - - -} - - -#ifdef __cplusplus -} -#endif |