void glopLight(GLContext *c, GLParam *p) { int light = p[1].i; int type = p[2].i; V4 v; GLLight *l; int i; assert(light >= TGL_LIGHT0 && light < TGL_LIGHT0 + T_MAX_LIGHTS); l = &c->lights[light - TGL_LIGHT0]; for (i = 0; i < 4; i++) v.v[i] = p[3 + i].f; switch(type) { case TGL_AMBIENT: l->ambient = v; break; case TGL_DIFFUSE: l->diffuse = v; break; case TGL_SPECULAR: l->specular = v; break; case TGL_POSITION: { V4 pos; gl_M4_MulV4(&pos, c->matrix_stack_ptr[0], &v); l->position=pos; if (l->position.v[3] == 0) { l->norm_position.X = pos.X; l->norm_position.Y = pos.Y; l->norm_position.Z = pos.Z; gl_V3_Norm(&l->norm_position); } } break; case TGL_SPOT_DIRECTION: for (i = 0; i < 3; i++) { l->spot_direction.v[i] = v.v[i]; l->norm_spot_direction.v[i] = v.v[i]; } gl_V3_Norm(&l->norm_spot_direction); break; case TGL_SPOT_EXPONENT: l->spot_exponent = v.v[0]; break; case TGL_SPOT_CUTOFF: { float a = v.v[0]; assert(a == 180 || (a >= 0 && a <= 90)); l->spot_cutoff=a; if (a != 180) l->cos_spot_cutoff = (float)(cos(a * LOCAL_PI / 180.0)); } break; case TGL_CONSTANT_ATTENUATION: l->attenuation[0] = v.v[0]; break; case TGL_LINEAR_ATTENUATION: l->attenuation[1] = v.v[0]; break; case TGL_QUADRATIC_ATTENUATION: l->attenuation[2] = v.v[0]; break; default: assert(0); } }
void glopVertex(GLContext * c, GLParam * p) { GLVertex *v; int n, i, cnt; gl_assert(c->in_begin != 0); n = c->vertex_n; cnt = c->vertex_cnt; cnt++; c->vertex_cnt = cnt; /* quick fix to avoid crashes on large polygons */ if (n >= c->vertex_max) { GLVertex *newarray; c->vertex_max <<= 1; /* just double size */ newarray = gl_malloc(sizeof(GLVertex) * c->vertex_max); if (!newarray) { gl_fatal_error("unable to allocate GLVertex array.\n"); } memcpy(newarray, c->vertex, n * sizeof(GLVertex)); gl_free(c->vertex); c->vertex = newarray; } /* new vertex entry */ v = &c->vertex[n]; n++; v->coord.X = p[1].f; v->coord.Y = p[2].f; v->coord.Z = p[3].f; v->coord.W = p[4].f; gl_vertex_transform(c, v); /* color */ if (c->lighting_enabled) { gl_shade_vertex(c, v); } else { v->color = c->current_color; } /* tex coords */ if (c->texture_2d_enabled) { if (c->apply_texture_matrix) { gl_M4_MulV4(&v->tex_coord, c->matrix_stack_ptr[2], &c->current_tex_coord); } else { v->tex_coord = c->current_tex_coord; } } /* precompute the mapping to the viewport */ if (v->clip_code == 0) gl_transform_to_viewport(c, v); /* edge flag */ v->edge_flag = c->current_edge_flag; switch (c->begin_type) { case GL_POINTS: gl_draw_point(c, &c->vertex[0]); n = 0; break; case GL_LINES: if (n == 2) { gl_draw_line(c, &c->vertex[0], &c->vertex[1]); n = 0; } break; case GL_LINE_STRIP: case GL_LINE_LOOP: if (n == 1) { c->vertex[2] = c->vertex[0]; } else if (n == 2) { gl_draw_line(c, &c->vertex[0], &c->vertex[1]); c->vertex[0] = c->vertex[1]; n = 1; } break; case GL_TRIANGLES: if (n == 3) { gl_draw_triangle(c, &c->vertex[0], &c->vertex[1], &c->vertex[2]); n = 0; } break; case GL_TRIANGLE_STRIP: if (cnt >= 3) { if (n == 3) n = 0; /* needed to respect triangle orientation */ switch(cnt & 1) { case 0: gl_draw_triangle(c,&c->vertex[2],&c->vertex[1],&c->vertex[0]); break; default: case 1: gl_draw_triangle(c,&c->vertex[0],&c->vertex[1],&c->vertex[2]); break; } } break; case GL_TRIANGLE_FAN: if (n == 3) { gl_draw_triangle(c, &c->vertex[0], &c->vertex[1], &c->vertex[2]); c->vertex[1] = c->vertex[2]; n = 2; } break; case GL_QUADS: if (n == 4) { c->vertex[2].edge_flag = 0; gl_draw_triangle(c, &c->vertex[0], &c->vertex[1], &c->vertex[2]); c->vertex[2].edge_flag = 1; c->vertex[0].edge_flag = 0; gl_draw_triangle(c, &c->vertex[0], &c->vertex[2], &c->vertex[3]); n = 0; } break; case GL_QUAD_STRIP: if (n == 4) { gl_draw_triangle(c, &c->vertex[0], &c->vertex[1], &c->vertex[2]); gl_draw_triangle(c, &c->vertex[1], &c->vertex[3], &c->vertex[2]); for (i = 0; i < 2; i++) c->vertex[i] = c->vertex[i + 2]; n = 2; } break; case GL_POLYGON: break; default: gl_fatal_error("glBegin: type %x not handled\n", c->begin_type); } c->vertex_n = n; }