nuclear@0: /* nuclear@0: 256-color 3D graphics hack for real-mode DOS. nuclear@0: Copyright (C) 2011 John Tsiombikas nuclear@0: nuclear@0: This program is free software: you can redistribute it and/or modify nuclear@0: it under the terms of the GNU General Public License as published by nuclear@0: the Free Software Foundation, either version 3 of the License, or nuclear@0: (at your option) any later version. nuclear@0: nuclear@0: This program is distributed in the hope that it will be useful, nuclear@0: but WITHOUT ANY WARRANTY; without even the implied warranty of nuclear@0: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nuclear@0: GNU General Public License for more details. nuclear@0: nuclear@0: You should have received a copy of the GNU General Public License nuclear@0: along with this program. If not, see . nuclear@0: */ nuclear@0: #include nuclear@0: #include nuclear@0: #include "mingl.h" nuclear@0: nuclear@0: nuclear@0: void mgl_cube(float sz) nuclear@0: { nuclear@0: float hsz = sz * 0.5; nuclear@0: nuclear@0: mgl_begin(MGL_QUADS); nuclear@0: /* front */ nuclear@0: mgl_normal(0, 0, 1); nuclear@0: mgl_vertex3f(-hsz, hsz, hsz); nuclear@0: mgl_vertex3f(-hsz, -hsz, hsz); nuclear@0: mgl_vertex3f(hsz, -hsz, hsz); nuclear@0: mgl_vertex3f(hsz, hsz, hsz); nuclear@0: /* back */ nuclear@0: mgl_normal(0, 0, -1); nuclear@0: mgl_vertex3f(hsz, hsz, -hsz); nuclear@0: mgl_vertex3f(hsz, -hsz, -hsz); nuclear@0: mgl_vertex3f(-hsz, -hsz, -hsz); nuclear@0: mgl_vertex3f(-hsz, hsz, -hsz); nuclear@0: /* right */ nuclear@0: mgl_normal(1, 0, 0); nuclear@0: mgl_vertex3f(hsz, hsz, hsz); nuclear@0: mgl_vertex3f(hsz, -hsz, hsz); nuclear@0: mgl_vertex3f(hsz, -hsz, -hsz); nuclear@0: mgl_vertex3f(hsz, hsz, -hsz); nuclear@0: /* left */ nuclear@0: mgl_normal(-1, 0, 0); nuclear@0: mgl_vertex3f(-hsz, hsz, -hsz); nuclear@0: mgl_vertex3f(-hsz, -hsz, -hsz); nuclear@0: mgl_vertex3f(-hsz, -hsz, hsz); nuclear@0: mgl_vertex3f(-hsz, hsz, hsz); nuclear@0: /* top */ nuclear@0: mgl_normal(0, 1, 0); nuclear@0: mgl_vertex3f(-hsz, hsz, -hsz); nuclear@0: mgl_vertex3f(-hsz, hsz, hsz); nuclear@0: mgl_vertex3f(hsz, hsz, hsz); nuclear@0: mgl_vertex3f(hsz, hsz, -hsz); nuclear@0: /* bottom */ nuclear@0: mgl_normal(0, -1, 0); nuclear@0: mgl_vertex3f(hsz, -hsz, -hsz); nuclear@0: mgl_vertex3f(hsz, -hsz, hsz); nuclear@0: mgl_vertex3f(-hsz, -hsz, hsz); nuclear@0: mgl_vertex3f(-hsz, -hsz, -hsz); nuclear@0: mgl_end(); nuclear@0: } nuclear@0: nuclear@0: void mgl_sphere(float rad, int usub, int vsub) nuclear@0: { nuclear@0: mgl_sphere_part(rad, usub, vsub, 1.0, 1.0); nuclear@0: } nuclear@0: nuclear@0: #define sphere_vertex(u, v) \ nuclear@0: do { \ nuclear@0: float x, y, z, theta, phi; \ nuclear@0: float costheta, sinphi; \ nuclear@0: theta = (u) * 2.0 * M_PI; \ nuclear@0: phi = (v) * M_PI; \ nuclear@0: costheta = cos(theta); \ nuclear@0: sinphi = sin(phi); \ nuclear@0: x = costheta * sinphi; \ nuclear@0: y = cos(phi); \ nuclear@0: z = sin(theta) * sinphi; \ nuclear@0: mgl_normal(x, y, z); \ nuclear@0: mgl_texcoord2f(u, v); \ nuclear@0: mgl_vertex3f(rad * x, rad * y, rad * z); \ nuclear@0: } while(0) nuclear@0: nuclear@0: void mgl_sphere_part(float rad, int usub, int vsub, float umax, float vmax) nuclear@0: { nuclear@0: int i, j; nuclear@0: float u, v, du, dv; nuclear@0: nuclear@0: assert(usub > 2); nuclear@0: assert(vsub > 2); nuclear@0: nuclear@0: du = umax / (float)usub; nuclear@0: dv = vmax / (float)vsub; nuclear@0: nuclear@0: mgl_begin(MGL_QUADS); nuclear@0: nuclear@0: u = 0.0; nuclear@0: for(i=0; i 2); nuclear@0: assert(vsub > 2); nuclear@0: nuclear@0: du = umax / (float)usub; nuclear@0: dv = (vmax - vmin) / (float)vsub; nuclear@0: nuclear@0: mgl_begin(MGL_QUADS); nuclear@0: nuclear@0: u = 0.0; nuclear@0: for(i=0; i