static void _del_gl(Evas_Object *obj) { GLData *gld = evas_object_data_get(obj, "gld"); if (!gld) { printf("Unable to get GLData. \n"); return; } Evas_GL_API *gl = gld->glapi; gl->glDeleteShader(gld->vtx_shader); gl->glDeleteShader(gld->fgmt_shader); gl->glDeleteProgram(gld->program); gl->glDeleteBuffers(1, &gld->gear1->vbo); gl->glDeleteBuffers(1, &gld->gear2->vbo); gl->glDeleteBuffers(1, &gld->gear3->vbo); free_gear(gld->gear1); free_gear(gld->gear2); free_gear(gld->gear3); evas_object_data_del((Evas_Object*)obj, "..gld"); free(gld); }
static void exit_func(void) // Function to be passed to atexit(). { if (!state->useGLES2) { glDisableClientState(GL_NORMAL_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); } glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); // clear screen glClear( GL_COLOR_BUFFER_BIT ); eglSwapBuffers(state->display, state->surface); // Release OpenGL resources eglMakeCurrent( state->display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT ); eglDestroySurface( state->display, state->surface ); eglDestroyContext( state->display, state->context ); eglTerminate( state->display ); // release memory used for gear and associated vertex arrays free_gear(state->gear1); free_gear(state->gear2); free_gear(state->gear3); printf("\nRPIGears finished\n"); } // exit_func()
/* Make a new gear, place it next to its parent in the scene, with its teeth meshed and the proper velocity. Returns the gear; or 0 if it didn't work. (Call this a bunch of times until either it works, or you decide it's probably not going to.) [Mostly lifted from pinion.c] */ static gear * place_new_gear (ModeInfo *mi, gear *parent) { gears_configuration *bp = &bps[MI_SCREEN(mi)]; int loop_count = 0; gear *g = 0; while (1) { loop_count++; if (loop_count >= 100) { if (g) free_gear (g); g = 0; break; } g = new_gear (mi, parent); if (!g) return 0; /* out of memory? */ if (place_gear (mi, g, parent)) break; } if (! g) return 0; /* We got a gear, and it is properly positioned. Insert it in the scene. */ bp->gears[bp->ngears++] = g; return g; }
/* Remove the given gear from the scene and free it. */ static void delete_gear (ModeInfo *mi, gear *g) { pinion_configuration *pp = &pps[MI_SCREEN(mi)]; int i; for (i = 0; i < pp->ngears; i++) /* find this gear in the list */ if (pp->gears[i] == g) break; if (pp->gears[i] != g) abort(); for (; i < pp->ngears-1; i++) /* pull later entries forward */ pp->gears[i] = pp->gears[i+1]; pp->gears[i] = 0; pp->ngears--; free_gear (g); }
/* Make a new gear, place it next to its parent in the scene, with its teeth meshed and the proper velocity. Returns the gear; or 0 if it didn't work. (Call this a bunch of times until either it works, or you decide it's probably not going to.) */ static gear * place_new_gear (ModeInfo *mi, gear *parent, Bool coaxial_p) { pinion_configuration *pp = &pps[MI_SCREEN(mi)]; int loop_count = 0; gear *g = 0; while (1) { loop_count++; if (loop_count >= 100) { if (g) free_gear (g); g = 0; break; } g = new_gear (mi, parent, coaxial_p); if (!g) return 0; /* out of memory? */ if (place_gear (mi, g, parent, coaxial_p)) break; } if (! g) return 0; /* We got a gear, and it is properly positioned. Insert it in the scene. */ if (pp->ngears + 2 >= pp->gears_size) { pp->gears_size += 100; pp->gears = (gear **) realloc (pp->gears, pp->gears_size * sizeof (*pp->gears)); if (! pp->gears) { fprintf (stderr, "%s: out of memory (%d gears)\n", progname, pp->gears_size); } } pp->gears[pp->ngears++] = g; return g; }