void * jit_gl_lua_drawinfo(t_jit_gl_lua *x) { if(! x->drawinfo.ob3d) { jit_gl_drawinfo_setup(x, &(x->drawinfo)); } return &(x->drawinfo); }
t_jit_err jit_gl_hap_dest_changed(t_jit_gl_hap *x) { t_symbol *dest_name = _jit_sym_nothing; t_jit_gl_drawinfo drawinfo; dest_name = jit_attr_getsym(x, gensym("drawto")); if(x->hapglsl) { jit_attr_setsym(x->hapglsl, gensym("drawto"), dest_name); jit_object_method(x->hapglsl, gensym("readbuffer"), jit_gl_hap_glsl_jxs); } if(x->texoutput) jit_attr_setsym(x->texoutput, gensym("drawto"), dest_name); if(x->fboid != 0) { glDeleteFramebuffersEXT(1, &x->fboid); x->fboid = 0; } jit_object_method(x->texoutput, gensym("set_rebuild")); // our texture has to be bound in the new context before we can use it // http://cycling74.com/forums/topic.php?id=29197 jit_gl_drawinfo_setup(x, &drawinfo); jit_gl_bindtexture(&drawinfo, jit_attr_getsym(x->texoutput, _jit_sym_name), 0); jit_gl_unbindtexture(&drawinfo, jit_attr_getsym(x->texoutput, _jit_sym_name), 0); return JIT_ERR_NONE; }
void draw_grid(t_jit_gl_videoplane *x,t_jit_object *matrix, GLenum mode) { float *p,*p2; char *bp=NULL; long i,j,rowstride,width,height,planecount,up=0; t_jit_matrix_info info; t_jit_gl_drawinfo drawinfo; if(jit_gl_drawinfo_setup(x,&drawinfo)) return; if (!matrix) return; jit_object_method(matrix,_jit_sym_getinfo,&info); jit_object_method(matrix,_jit_sym_getdata,&bp); if (!bp) return; planecount = info.planecount; rowstride = info.dimstride[1]; height = info.dim[1]-1; width = info.dim[0]; for (i=0;i<height;i++) { p = (float *)(bp + i*rowstride); p2 = (float *)(bp + (i+1)*rowstride); glBegin(mode); switch (planecount) { case 16: case 15: case 14: case 13: case 12: for (j=0;j<width;j++) { glNormal3f(p[_I_NX],p[_I_NY],p[_I_NZ]); // glColor4f(p[_I_R],p[_I_G],p[_I_B],p[_I_A]); jit_gl_texcoord2f(&drawinfo,p[_I_S],p[_I_T]); glVertex3f(p[_I_X],p[_I_Y],p[_I_Z]); glNormal3f(p2[_I_NX],p2[_I_NY],p2[_I_NZ]); // glColor4f(p2[_I_R],p2[_I_G],p2[_I_B],p2[_I_A]); jit_gl_texcoord2f(&drawinfo,p2[_I_S],p2[_I_T]); glVertex3f(p2[_I_X],p2[_I_Y],p2[_I_Z]); p+=planecount; p2+=planecount; } break; case 11: case 10: case 9: case 8: for (j=0;j<width;j++) { glNormal3f(p[_I_NX],p[_I_NY],p[_I_NZ]); jit_gl_texcoord2f(&drawinfo,p[_I_S],p[_I_T]); glVertex3f(p[_I_X],p[_I_Y],p[_I_Z]); glNormal3f(p2[_I_NX],p2[_I_NY],p2[_I_NZ]); glTexCoord2f(p2[_I_S],p2[_I_T]); jit_gl_texcoord2f(&drawinfo,p2[_I_S],p2[_I_T]); glVertex3f(p2[_I_X],p2[_I_Y],p2[_I_Z]); p+=planecount; p2+=planecount; } break; case 7: case 6: case 5: for (j=0;j<width;j++) { jit_gl_texcoord2f(&drawinfo,p[_I_S],p[_I_T]); glVertex3f(p[_I_X],p[_I_Y],p[_I_Z]); glTexCoord2f(p2[_I_S],p2[_I_T]); jit_gl_texcoord2f(&drawinfo,p2[_I_S],p2[_I_T]); glVertex3f(p2[_I_X],p2[_I_Y],p2[_I_Z]); p+=planecount; p2+=planecount; } break; case 4: case 3: for (j=0;j<width;j++) { glVertex3f(p[_I_X],p[_I_Y],p[_I_Z]); glVertex3f(p2[_I_X],p2[_I_Y],p2[_I_Z]); p+=planecount; p2+=planecount; } break; } glEnd(); } }
t_jit_err jit_gl_hap_draw(t_jit_gl_hap *x) { t_jit_err result = JIT_ERR_NONE; t_jit_gl_drawinfo drawinfo; if(x->newfile) { if(x->texture && x->deletetex) { glDeleteTextures(1, &x->texture); x->deletetex = 0; } x->texture = 0; jit_gl_hap_load_file(x); } if(!x->movieloaded) return JIT_ERR_NONE; if(jit_gl_drawinfo_setup(x,&drawinfo)) return JIT_ERR_GENERIC; jit_gl_hap_getcurrentframe(x); if(x->validframe) { GLint previousFBO; // make sure we pop out to the right FBO #ifdef MAC_VERSION GLint previousReadFBO; GLint previousDrawFBO; #endif // We are going to bind our FBO to our internal jit.gl.texture as COLOR_0 attachment // We need the ID, width/height. GLuint texid = jit_attr_getlong(x->texoutput,ps_glid); GLuint width = jit_attr_getlong(x->texoutput,ps_width); GLuint height = jit_attr_getlong(x->texoutput,ps_height); glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &previousFBO); #ifdef MAC_VERSION glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING_EXT, &previousReadFBO); glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING_EXT, &previousDrawFBO); #endif if(width!=x->dim[0] || height!=x->dim[1]) { width = x->dim[0]; height = x->dim[1]; jit_attr_setlong_array(x->texoutput, gensym("dim"), 2, x->dim); jit_attr_user_touch(x, gensym("dim")); } if(x->hap_format == JIT_GL_HAP_PF_HAP) { jit_gl_hap_submit_texture(x); jit_gl_report_error("jit.gl.hap submit texture"); } else if(x->hap_format != JIT_GL_HAP_PF_GL) { jit_gl_hap_submit_nonhap_texture(x); jit_gl_report_error("jit.gl.hap submit non-hap texture"); } if(jit_gl_hap_draw_begin(x, texid, width, height)) { jit_gl_report_error("jit.gl.hap draw begin"); jit_gl_hap_dodraw(x, width, height); jit_gl_report_error("jit.gl.hap draw texture to FBO"); jit_gl_hap_draw_end(x); jit_gl_report_error("jit.gl.hap draw end"); } else { jit_object_error((t_object*)x, "could not bind to FBO"); } glPopClientAttrib(); glPopAttrib(); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, previousFBO); #ifdef MAC_VERSION glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, previousReadFBO); glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, previousDrawFBO); #endif x->validframe = 0; jit_object_notify(x, ps_draw, NULL); jit_gl_hap_do_report(x); } jit_gl_hap_releaseframe(x); return result; }
t_jit_err jit_gl_lua_dest_changed(t_jit_gl_lua *x) { jit_gl_drawinfo_setup(x, &(x->drawinfo)); //glext_init(x->lua); return jit_gl_lua_call_luafunction(x, "dest_changed"); }