static int obj_init(FILE *stream, int flags, void **ud) { int rc = 0; struct obj_fdata *u = *ud = calloc(1, sizeof *u); struct obj *o = u->o = calloc(1, sizeof *o); u->flags = flags; if (flags & ASM_ASSEMBLE) { // TODO proper multiple-records support o->rec_count = 1; o->records = calloc(o->rec_count, sizeof *o->records); o->records->addr = 0; o->records->size = 1024; o->records->data = calloc(o->records->size, sizeof *o->records->data); u->curr_rec = o->records; u->next_sym = &o->symbols; u->next_rlc = &o->relocs; } else if (flags & ASM_DISASSEMBLE) { rc = obj_read(u->o, stream); u->curr_rec = o->records; } return rc; }
int edb_array_capacity(obj_handle *h, u32 *capacity) { LOG_HERE; int err = 0; u32 root; CHECK(obj_read(h, &root)); *capacity = array_capacity(h->db, root); err: return err; }
int edb_array_length(obj_handle *h, u32 *length) { LOG_HERE; int err = 0; u32 root; CHECK(obj_read(h, &root)); *length = array_length(h->db, root); err: return err; }
int edb_array_get(obj_handle *h, u32 index, void* data) { LOG_HERE; int err = 0; u32 root; CHECK(obj_read(h, &root)); CHECK(array_get(h->db, root, index, data)); err: return err; }
void obj_load(t_env *env, char *file) { int fd; if ((fd = open(file, O_RDONLY)) == -1) ERROR("Failed to open file"); env->obj.file = file; obj_read(&env->obj, fd); close(fd); }
static void gd_set_store_story(FILE *i, FILE *o) { struct gd_val *obj; char *pk; int m; char *pks[] = { "topic_id", "id", NULL }; obj = obj_read(i, o); pk = gd_pk_build(obj, pks, &m); if (m > 0) { struct gd_val *obj_t; gd_set_lock(stories, LOCK_RW); if (m == 1) pk = gd_pk_complete(stories->set, pk); if ((obj_t = gd_val_get(stories->set, pk)) != NULL) { /* dequeue story from indexes */ /* ... */ } stories->set = gd_val_set(stories->set, pk, obj); gd_set_lock(stories, UNLOCK_RW); if ((obj_t = gd_val_get(obj, "date")) != NULL) { char *s_date = obj_t->v->k; gd_set_lock(stories_by_date, LOCK_RW); if ((obj_t = gd_val_get_i(stories_by_date->set, s_date)) == NULL) { stories_by_date->set = gd_val_set_i(stories_by_date->set, s_date, gd_val_new(strdup(pk), NULL, NULL)); } else { obj_t->v = gd_val_set_i(obj_t->v, strdup(pk), NULL); } gd_set_lock(stories_by_date, UNLOCK_RW); } fprintf(o, "OK %s story stored\n", pk); } else { fprintf(o, "ERROR story pk not found\n"); free(pk); gd_val_free(obj); } }
static int do_load(struct link_state *s, FILE *in) { int rc = 0; struct obj_list *node = calloc(1, sizeof *node); struct obj *o = calloc(1, sizeof *o); rc = obj_read(o, in); node->obj = o; node->i = s->obj_count++; // put the objects on the list in order node->next = NULL; *s->next_obj = node; s->next_obj = &node->next; return rc; }
/*************************************************************** Load ***************************************************************/ static obj_ptr _load_imp(cptr file, obj_ptr env) { port_ptr p; obj_ptr o = NIL; p = port_open_input_file(file); while (!port_eof(p)) { o = obj_read(p); if (ERRORP(o)) break; o = obj_eval(o, env); if (ERRORP(o)) break; port_skip_while(p, isspace); } if (ERRORP(o)) error_add_file_info(o, port_name(p), port_line(p)); port_close(p); return o; }
static void gd_set_store_v(struct gd_set *s, char **pks, int n, FILE *i, FILE *o) { struct gd_val *obj; char *pk; int m; obj = obj_read(i, o); pk = gd_pk_build(obj, pks, &m); if (m >= n) { gd_set_lock(s, LOCK_RW); s->set = gd_val_set(s->set, pk, obj); gd_set_lock(s, UNLOCK_RW); fprintf(o, "OK %s stored\n", pk); } else { fprintf(o, "ERROR %s pk not found\n", s->name); free(pk); gd_val_free(obj); } }
static void gd_story_set(FILE *i, FILE *o) { struct gd_val *obj; struct gd_val *p; int c, max; char *from, *to, *order; struct gd_val *order_s = NULL; c = 0; max = 0x7fffffff; from = NULL; to = NULL; order = NULL; obj = obj_read(i, o); if ((p = gd_val_get(obj, "num")) != NULL) { sscanf(p->v->k, "%d", &max); } if ((p = gd_val_get(obj, "offset")) != NULL) { sscanf(p->v->k, "%d", &c); c *= -1; } if ((p = gd_val_get(obj, "from")) != NULL) { from = p->v->k; } if ((p = gd_val_get(obj, "to")) != NULL) { to = p->v->k; } if ((p = gd_val_get(obj, "order")) != NULL && strcmp(p->v->k, "date") != 0) { order = p->v->k; } gd_set_lock(stories_by_date, LOCK_RO); fprintf(o, "OK list follows\n"); for (p = stories_by_date->set; c < max && p; p = p->n) { struct gd_val *sp; struct gd_val *story; if (from && strcmp(from, p->k) > 0) break; if (to && strcmp(to, p->k) < 0) continue; for (sp = p->v; c < max && sp; sp = sp->n, c++) { if (c >= 0) { if (order) { struct gd_val *v; gd_set_lock(stories, LOCK_RO); story = gd_val_get(stories->set, sp->k); gd_set_lock(stories, UNLOCK_RO); if (story && (v = gd_val_get(story->v, order)) != NULL) { order_s = gd_val_set_r(order_s, v->v->k, gd_val_new(sp->k, gd_val_new(p->k, NULL, NULL), NULL)); } else printf("no se\n"); } else { fprintf(o, "%s:%s\n", sp->k, p->k); } } } } if (order_s) { for (p = order_s; p; p = p->n) { fprintf(o, "%s:%s\n", p->v->k, p->v->v->k); } gd_val_free(order_s); } fprintf(o, ".\n"); gd_set_lock(stories_by_date, UNLOCK_RO); gd_val_free(obj); }
int main(int argc, char *argv[]) { GLFWwindow* window; glfwSetErrorCallback(error_callback); glfwInit(); window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL); glfwMakeContextCurrent(window); glewExperimental = GL_TRUE; glewInit(); //glfwWindowHint(GLFW_SAMPLES, 0); // 0x antialiasing glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // 设置OPENGL版本3.3 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwSwapInterval(1); glfwSetKeyCallback(window, key_callback); glfwSetCursorPosCallback(window, cursorpos_callback); glfwSetMouseButtonCallback(window, mousebutton_callback); glClearColor(0,0,0,1); // 清理屏幕为黑色 glEnable(GL_CULL_FACE); // 启用面剔除 glCullFace(GL_BACK); glEnable(GL_DEPTH_TEST); // 启用深度测试 glEnable(GL_LIGHT0); // 启用灯光0 glEnable(GL_NORMALIZE); // 启用法线 glEnable(GL_COLOR_MATERIAL);// 启用材质模式 glEnable(GL_LIGHTING); // 打开灯光 glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER ,0.9);//0.5可以换成任何在0~1之间的数 glShadeModel(GL_SMOOTH); // 设置灯光的颜色 const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f }; const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f }; const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f }; const GLfloat light_position[] = { 0.0f, 3.0f, -5.0f, 0.0f }; glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); // 设置环境光颜色 glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); // 设置漫反射的颜色 glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); // 设置镜面反射的颜色 //glLightfv(GL_LIGHT0, GL_POSITION, light_position); // 设置灯的位置 // 设置材质的颜色 const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f }; const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f }; const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f }; const GLfloat high_shininess[] = { 100.0f }; glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); // 设置环境光颜色 glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); // 设置漫反射的颜色 glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); // 设置镜面反射的颜色 glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);// 镜面指数 该值越小,表示材质越粗糙,点光源发射的光线照射到上面,也可以产生较大的亮点 obj_data_t* t = obj_create(); obj_read("Data/panel.obj","Data/panel.mtl",t); obj_render_t* rt = obj_create_render(t); obj_render_dump(rt); float rx = -90.0f; float ry = 0.0f; while (!glfwWindowShouldClose(window)) { int width, height; glfwGetFramebufferSize(window, &width, &height); float ratio = (float) width / (float) height; glViewport(0, 0, width, height); // 把图像按照指定宽,高显示到屏幕上 glMatrixMode(GL_PROJECTION); // 选择透视矩阵 glLoadIdentity(); // 重置矩阵 glFrustum(-ratio, ratio, -1.0, 1.0, 2.0, 100.0);// 设置透视矩阵 glMatrixMode(GL_MODELVIEW); // 选择模型矩阵 glLoadIdentity(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清理颜色和深度缓存 //glTranslatef(0.0f ,0.0f, -3.0f); gluLookAt(0.0f,0.0f,-3.0f, 0.0f,0.0f,1.0f, 0.0f,1.0f,0.0); glLightfv(GL_LIGHT0, GL_POSITION, light_position); glRotatef(rx + g_roll_y, 1.0f, 0.0f, 0.0f); glRotatef(ry + g_roll_x, 0.0f, 1.0f, 0.0f); //====================================================================== obj_render(rt); //====================================================================== glfwSwapBuffers(window); glfwPollEvents(); } obj_destory_data(t); obj_destory_render(rt); glfwDestroyWindow(window); glfwTerminate(); return EXIT_SUCCESS; }