Max 5 API Reference
00001 /* 00002 * Copyright 2001-2005 - Cycling '74 00003 * Derek Gerstmann - derek@cycling74.com 00004 * 00005 * Struct and associated methods for maintaining an OpenGL 00006 * pixel buffer object (vbo). 00007 * 00008 */ 00009 00010 /****************************************************************************/ 00011 00012 #include "jit.gl.vbo.h" 00013 00014 /****************************************************************************/ 00015 00016 void *_jit_gl_vbo_class; 00017 00018 t_jit_err jit_gl_vbo_init(void) 00019 { 00020 void *attr; 00021 long attrflags; 00022 00023 _jit_gl_vbo_class = jit_class_new("jit_gl_vbo", (method)jit_gl_vbo_new, (method)jit_gl_vbo_free, 00024 sizeof(t_jit_gl_vbo),A_DEFSYM,0L); 00025 00026 00027 //add methods 00028 jit_class_addmethod(_jit_gl_vbo_class, (method)jit_gl_vbo_create, "create", A_CANT, 0L); 00029 jit_class_addmethod(_jit_gl_vbo_class, (method)jit_gl_vbo_bind, "bind", A_CANT, 0L); 00030 jit_class_addmethod(_jit_gl_vbo_class, (method)jit_gl_vbo_unbind, "unbind", A_CANT, 0L); 00031 jit_class_addmethod(_jit_gl_vbo_class, (method)jit_gl_vbo_destroy, "destroy", A_CANT, 0L); 00032 00033 00034 attrflags = JIT_ATTR_GET_DEFER_LOW | JIT_ATTR_SET_USURP_LOW | JIT_ATTR_SET_OPAQUE; 00035 attr = jit_object_new(_jit_sym_jit_attr_offset, "id", _jit_sym_long, attrflags, 00036 (method)0L, (method)0L, calcoffset(t_jit_gl_vbo, id)); 00037 jit_class_addattr(_jit_gl_vbo_class, attr); 00038 00039 00040 jit_class_register(_jit_gl_vbo_class); 00041 00042 return JIT_ERR_NONE; 00043 } 00044 00045 t_jit_gl_vbo *jit_gl_vbo_new() 00046 { 00047 t_jit_gl_vbo *x = NULL; 00048 00049 if(x = (t_jit_gl_vbo *)jit_object_alloc(_jit_gl_vbo_class)) 00050 { 00051 jit_gl_vbo_reset(x); 00052 } 00053 00054 return x; 00055 } 00056 00057 void jit_gl_vbo_free(t_jit_gl_vbo *x) 00058 { 00059 if(x) { 00060 jit_gl_vbo_destroy(x); 00061 } 00062 } 00063 00064 t_jit_err jit_gl_vbo_create( 00065 t_jit_gl_vbo *x, long type, long mode, long datatype, long coords, long stride, long size, void *data) 00066 { 00067 GLuint id; 00068 long buffer; 00069 t_jit_err err; 00070 00071 if(!x || !data) 00072 return JIT_ERR_GENERIC; 00073 00074 // destroy any existing buffer 00075 if( x->id > 0 ) 00076 { 00077 err = jit_gl_vbo_destroy(x); 00078 if(err) return err; 00079 } 00080 00081 // get the buffer type 00082 if(type == JIT_GL_VBO_TYPE_INDEX) 00083 { 00084 buffer = GL_ELEMENT_ARRAY_BUFFER_ARB; 00085 } 00086 else 00087 { 00088 buffer = GL_ARRAY_BUFFER_ARB; 00089 } 00090 00091 // create buffer 00092 x->handle = data; 00093 glGenBuffersARB((GLsizei)1, &id); 00094 glBindBufferARB(buffer, id); 00095 glBufferDataARB(buffer, size, x->handle, mode); 00096 00097 // *must* clear data 00098 x->handle = NULL; 00099 00100 // check for errors 00101 if(jit_gl_report_error("jit.gl: error creating vertex buffer object!")) 00102 { 00103 return JIT_ERR_GENERIC; 00104 } 00105 00106 // save data 00107 x->id = id; 00108 x->coords = coords; 00109 x->size = size; 00110 x->type = type; 00111 x->mode = mode; 00112 x->datatype = datatype; 00113 x->stride = stride; 00114 x->buffer = buffer; 00115 x->handle = NULL; 00116 00117 jit_gl_report_error("jit.gl: error creating vertex buffer object!"); 00118 return JIT_ERR_NONE; 00119 } 00120 00121 t_jit_err jit_gl_vbo_bind(t_jit_gl_vbo *x) 00122 { 00123 GLint id; 00124 00125 if(!x) 00126 return JIT_ERR_INVALID_PTR; 00127 00128 // check for existing id 00129 if( x->id > 0 && x->size > 0 && x->type > 0) 00130 { 00131 // bind the buffer 00132 id = x->id; 00133 glBindBufferARB(x->buffer, id); 00134 jit_gl_report_error("jit.gl: error binding vertex buffer object"); 00135 } 00136 else 00137 { 00138 jit_object_error((t_object *)x,"jit.gl: cannot bind vertex buffer object: not initialized!"); 00139 return JIT_ERR_GENERIC; 00140 } 00141 00142 switch(x->type) 00143 { 00144 case JIT_GL_VBO_TYPE_INDEX: 00145 { 00146 glEnableClientState(GL_INDEX_ARRAY); 00147 glIndexPointer(x->datatype, x->stride, x->handle); 00148 break; 00149 } 00150 case JIT_GL_VBO_TYPE_VERTEX: 00151 { 00152 glEnableClientState(GL_VERTEX_ARRAY); 00153 glVertexPointer(x->coords, x->datatype, x->stride, x->handle); 00154 break; 00155 } 00156 case JIT_GL_VBO_TYPE_TEXCOORD: 00157 { 00158 glEnableClientState(GL_TEXTURE_COORD_ARRAY); 00159 glTexCoordPointer(x->coords, x->datatype, x->stride, x->handle); 00160 break; 00161 } 00162 case JIT_GL_VBO_TYPE_NORMAL: 00163 { 00164 glEnableClientState(GL_NORMAL_ARRAY); 00165 glNormalPointer(x->datatype, x->stride, x->handle); 00166 break; 00167 } 00168 case JIT_GL_VBO_TYPE_COLOR: 00169 { 00170 glEnableClientState(GL_COLOR_ARRAY); 00171 glColorPointer(x->coords, x->datatype, x->stride, x->handle); 00172 break; 00173 } 00174 case JIT_GL_VBO_TYPE_EDGEFLAG: 00175 { 00176 glEnableClientState(GL_EDGE_FLAG_ARRAY); 00177 glEdgeFlagPointer(x->stride, x->handle); 00178 break; 00179 } 00180 case JIT_GL_VBO_TYPE_TANGENT: 00181 { 00182 // TODO 00183 break; 00184 } 00185 case JIT_GL_VBO_TYPE_BINORMAL: 00186 { 00187 // TODO 00188 break; 00189 } 00190 default: 00191 { 00192 jit_object_error((t_object *)x,"jit.gl: invalid vertex buffer object type!"); 00193 return JIT_ERR_GENERIC; 00194 } 00195 }; 00196 00197 jit_gl_report_error("jit.gl: error enabling vertex buffer object"); 00198 return JIT_ERR_NONE; 00199 } 00200 00201 t_jit_err jit_gl_vbo_unbind(t_jit_gl_vbo *x) 00202 { 00203 if(!x) 00204 return JIT_ERR_INVALID_PTR; 00205 00206 // clear binding 00207 glBindBufferARB(x->buffer, 0); 00208 jit_gl_report_error("jit.gl: error unbinding vertex buffer object"); 00209 00210 // disable client state 00211 switch(x->type) 00212 { 00213 case JIT_GL_VBO_TYPE_INDEX: 00214 { 00215 glDisableClientState(GL_INDEX_ARRAY); 00216 break; 00217 } 00218 case JIT_GL_VBO_TYPE_VERTEX: 00219 { 00220 glDisableClientState(GL_VERTEX_ARRAY); 00221 break; 00222 } 00223 case JIT_GL_VBO_TYPE_TEXCOORD: 00224 { 00225 glDisableClientState(GL_TEXTURE_COORD_ARRAY); 00226 break; 00227 } 00228 case JIT_GL_VBO_TYPE_NORMAL: 00229 { 00230 glDisableClientState(GL_NORMAL_ARRAY); 00231 break; 00232 } 00233 case JIT_GL_VBO_TYPE_COLOR: 00234 { 00235 glDisableClientState(GL_COLOR_ARRAY); 00236 break; 00237 } 00238 case JIT_GL_VBO_TYPE_EDGEFLAG: 00239 { 00240 glDisableClientState(GL_EDGE_FLAG_ARRAY); 00241 break; 00242 } 00243 case JIT_GL_VBO_TYPE_TANGENT: 00244 { 00245 // TODO 00246 break; 00247 } 00248 case JIT_GL_VBO_TYPE_BINORMAL: 00249 { 00250 // TODO 00251 break; 00252 } 00253 default: 00254 { 00255 jit_object_error((t_object *)x,"jit.gl: invalid vertex buffer object type!"); 00256 return JIT_ERR_GENERIC; 00257 } 00258 }; 00259 00260 jit_gl_report_error("jit.gl: error disabling vertex buffer object"); 00261 return JIT_ERR_NONE; 00262 } 00263 00264 t_jit_err jit_gl_vbo_destroy(t_jit_gl_vbo *x) 00265 { 00266 GLuint id; 00267 00268 if(!x) 00269 return JIT_ERR_INVALID_PTR; 00270 00271 if(x->id > 0) 00272 { 00273 id = x->id; 00274 glDeleteBuffersARB(1, &id); 00275 x->id = -1; 00276 } 00277 00278 x->id = -1; 00279 x->coords = 0; 00280 x->size = 0; 00281 x->type = -1; 00282 x->mode = -1; 00283 x->stride = 0; 00284 x->buffer = 0; 00285 x->handle = NULL; 00286 return JIT_ERR_NONE; 00287 } 00288 00289 t_jit_err jit_gl_vbo_reset(t_jit_gl_vbo *x) 00290 { 00291 if(!x) 00292 return JIT_ERR_INVALID_PTR; 00293 00294 x->id = -1; 00295 x->coords = 0; 00296 x->size = 0; 00297 x->type = -1; 00298 x->mode = -1; 00299 x->stride = 0; 00300 x->buffer = 0; 00301 x->handle = NULL; 00302 return JIT_ERR_NONE; 00303 } 00304 /****************************************************************************/
Copyright © 2008, Cycling '74