-
-static void
-_c3_geometry_project(
- c3context_p c,
- const struct c3driver_context_t * d,
- c3geometry_p g,
- c3mat4p m)
-{
- switch(g->type.type) {
- case C3_TRIANGLE_TYPE: {
- g->type.subtype = GL_TRIANGLES;
- //g->mat.color = c3vec4f(0.0, 0.0, 1.0, 1.0);
- } break;
- case C3_TEXTURE_TYPE: {
- c3texture_p t = (c3texture_p)g;
- g->type.subtype = GL_TRIANGLE_FAN;
- g->mat.color = c3vec4f(0.0, 1.0, 0.0, 0.5);
- printf("_c3_geometry_project xrure %d!\n", g->textures.count);
- if (!g->texture) {
- GLuint texID = 0;
- dumpError("cp_gl_texture_load_argb flush");
-
- if (g->mat.mode == 0)
- g->mat.mode = GL_TEXTURE_RECTANGLE_ARB;
-
- printf("C3_TEXTURE_TYPE %d\n",g->mat.mode);
- glEnable(g->mat.mode);
- dumpError("cp_gl_texture_load_argb GL_TEXTURE_RECTANGLE_ARB");
-
- glGenTextures(1, &texID);
- dumpError("cp_gl_texture_load_argb glBindTexture GL_TEXTURE_RECTANGLE_ARB");
-
-// glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
-// GL_MODULATE ); //set texture environment parameters
- dumpError("glTexEnvf");
-
- glPixelStorei(GL_UNPACK_ROW_LENGTH, t->pixels.row / t->pixels.psize);
- glTexParameteri(g->mat.mode, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- dumpError("GL_TEXTURE_MAG_FILTER");
- glTexParameteri(g->mat.mode, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
- dumpError("GL_TEXTURE_MIN_FILTER");
- glTexParameteri(g->mat.mode, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
- dumpError("GL_TEXTURE_WRAP_S");
- glTexParameteri(g->mat.mode, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
- dumpError("GL_TEXTURE_WRAP_T");
- glTexParameteri(g->mat.mode, GL_GENERATE_MIPMAP, GL_TRUE);
- dumpError("GL_GENERATE_MIPMAP");
- glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);
- dumpError("GL_GENERATE_MIPMAP_HINT");
-
- g->mat.texture = texID;
- g->texture = 1;
- }
- glBindTexture(g->mat.mode, g->mat.texture);
- dumpError("glBindTexture");
- glTexImage2D(g->mat.mode, 0,
- t->pixels.format == C3PIXEL_A ? GL_ALPHA8 : GL_RGBA8,
- t->pixels.w, t->pixels.h, 0,
- t->pixels.format == C3PIXEL_A ? GL_ALPHA : GL_BGRA,
- GL_UNSIGNED_BYTE,
- t->pixels.base);
- dumpError("glTexImage2D");
- glGenerateMipmap(GL_TEXTURE_2D);
- dumpError("glGenerateMipmap");
-
- } break;
- case C3_LINES_TYPE: {
- // glLineWidth(1);
- float lineWidth = 0.2;
-
- c3vertex_array_p v = &g->projected;
- c3tex_array_p tex = &g->textures;
- c3tex_array_clear(tex);
- c3vertex_array_clear(v);
- for (int l = 0; l < g->vertice.count; l += 2) {
- c3vec3 a = c3mat4_mulv3(m, g->vertice.e[l]);
- c3vec3 b = c3mat4_mulv3(m, g->vertice.e[l+1]);
-
- c3vec3 e = c3vec3_mulf(c3vec3_normalize(c3vec3_sub(b, a)), lineWidth);
-
- c3vec3 N = c3vec3f(-e.y, e.x, 0);
- c3vec3 S = c3vec3_minus(N);
- c3vec3 NE = c3vec3_add(N, e);
- c3vec3 NW = c3vec3_sub(N, e);
- c3vec3 SW = c3vec3_minus(NE);
- c3vec3 SE = c3vec3_minus(NW);
-#if 0
- c3vertex_array_add(v, c3vec3_add(a, SW));
- c3vertex_array_add(v, c3vec3_add(a, NW));
- c3vertex_array_add(v, c3vec3_add(a, S));
- c3vertex_array_add(v, c3vec3_add(a, N));
- c3vertex_array_add(v, c3vec3_add(b, S));
- c3vertex_array_add(v, c3vec3_add(b, N));
- c3vertex_array_add(v, c3vec3_add(b, SE));
- c3vertex_array_add(v, c3vec3_add(b, NE));
-#endif
-
- const float ts = 1;
-
- c3vertex_array_add(v, c3vec3_add(a, SW));
- c3vertex_array_add(v, c3vec3_add(a, S));
- c3vertex_array_add(v, c3vec3_add(a, NW));
- c3tex_array_add(tex, c3vec2f(ts * 0 , ts * 0 ));
- c3tex_array_add(tex, c3vec2f(ts * 0.5, ts * 0 ));
- c3tex_array_add(tex, c3vec2f(ts * 0 , ts * 1 ));
-
- c3vertex_array_add(v, c3vec3_add(a, S));
- c3vertex_array_add(v, c3vec3_add(a, N));
- c3vertex_array_add(v, c3vec3_add(a, NW));
- c3tex_array_add(tex, c3vec2f(ts * 0.5, ts * 0 ));
- c3tex_array_add(tex, c3vec2f(ts * 0.5, ts * 1 ));
- c3tex_array_add(tex, c3vec2f(ts * 0 , ts * 1 ));
-
- c3vertex_array_add(v, c3vec3_add(a, N));
- c3vertex_array_add(v, c3vec3_add(b, S));
- c3vertex_array_add(v, c3vec3_add(b, N));
- c3tex_array_add(tex, c3vec2f(ts * 0.5, ts * 1 ));
- c3tex_array_add(tex, c3vec2f(ts * 0.5, ts * 0 ));
- c3tex_array_add(tex, c3vec2f(ts * 0.5, ts * 1 ));
-
- c3vertex_array_add(v, c3vec3_add(a, N));
- c3vertex_array_add(v, c3vec3_add(a, S));
- c3vertex_array_add(v, c3vec3_add(b, S));
- c3tex_array_add(tex, c3vec2f(ts * 0.5, ts * 1 ));
- c3tex_array_add(tex, c3vec2f(ts * 0.5, ts * 0 ));
- c3tex_array_add(tex, c3vec2f(ts * 0.5, ts * 0 ));
-
- c3vertex_array_add(v, c3vec3_add(b, N));
- c3vertex_array_add(v, c3vec3_add(b, S));
- c3vertex_array_add(v, c3vec3_add(b, SE));
- c3tex_array_add(tex, c3vec2f(ts * 0.5, ts * 1 ));
- c3tex_array_add(tex, c3vec2f(ts * 0.5, ts * 0 ));
- c3tex_array_add(tex, c3vec2f(ts * 1 , ts * 0 ));
-
- c3vertex_array_add(v, c3vec3_add(b, N));
- c3vertex_array_add(v, c3vec3_add(b, SE));
- c3vertex_array_add(v, c3vec3_add(b, NE));
- c3tex_array_add(tex, c3vec2f(ts * 0.5, ts * 1 ));
- c3tex_array_add(tex, c3vec2f(ts * 1 , ts * 0 ));
- c3tex_array_add(tex, c3vec2f(ts * 1 , ts * 1 ));
-
- }
- g->type.subtype = GL_TRIANGLES;
- } break;
- default:
- break;
- }
-}
-
-static void
-_c3_geometry_draw(
- c3context_p c,
- const struct c3driver_context_t *d,
- c3geometry_p g )
-{
- glColor4fv(g->mat.color.n);
- dumpError("glColor");
-// glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, g->mat.color.n);
- glVertexPointer(3, GL_FLOAT, 0,
- g->projected.count ? g->projected.e : g->vertice.e);
- glEnableClientState(GL_VERTEX_ARRAY);
- dumpError("GL_VERTEX_ARRAY");
- glDisable(GL_TEXTURE_2D);
- if (g->textures.count && g->texture) {
- glEnable(g->mat.mode);
- // printf("tex mode %d texture %d\n", g->mat.mode, g->mat.texture);
- dumpError("glEnable texture");
- glBindTexture(g->mat.mode, g->mat.texture);
- dumpError("glBindTexture");
- glTexCoordPointer(2, GL_FLOAT, 0, g->textures.e);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- dumpError("GL_TEXTURE_COORD_ARRAY");
- }
- if (g->normals.count) {
- glNormalPointer(GL_FLOAT, 0, g->normals.e);
- glEnableClientState(GL_NORMAL_ARRAY);
- }
- glDrawArrays(g->type.subtype, 0, g->projected.count ? g->projected.count : g->vertice.count);
- glDisableClientState(GL_VERTEX_ARRAY);
- glDisableClientState(GL_TEXTURE_COORD_ARRAY);
- glDisableClientState(GL_NORMAL_ARRAY);
- if (g->textures.count && g->texture)
- glDisable(g->mat.mode);
-}
-
-const c3driver_context_t c3context_driver = {
- .geometry_project = _c3_geometry_project,
- .geometry_draw = _c3_geometry_draw,
-};
-
-/*
- * Computes the distance from the eye, sort by this value
- */
-static int
-_c3_z_sorter(
- const void *_p1,
- const void *_p2)
-{
- c3geometry_p g1 = *(c3geometry_p*)_p1;
- c3geometry_p g2 = *(c3geometry_p*)_p2;
- // get center of bboxes
- c3vec3 c1 = c3vec3_add(g1->bbox.min, c3vec3_divf(c3vec3_sub(g1->bbox.max, g1->bbox.min), 2));
- c3vec3 c2 = c3vec3_add(g2->bbox.min, c3vec3_divf(c3vec3_sub(g2->bbox.max, g2->bbox.min), 2));
-
- c3f d1 = c3vec3_length2(c3vec3_sub(c1, cam.eye));
- c3f d2 = c3vec3_length2(c3vec3_sub(c2, cam.eye));
-
- /*
- * make sure transparent items are drawn after everyone else
- */
- if (g1->mat.color.n[3] < 1)
- d1 -= 100000.0;
- if (g2->mat.color.n[3] < 1)
- d2 -= 100000.0;
-
- return d1 < d2 ? 1 : d1 > d2 ? -1 : 0;
-}
-