/* -*- Mode: C; tab-width: 4 -*- */
/* morph3d --- Shows 3D morphing objects */
-#if !defined( lint ) && !defined( SABER )
-static const char sccsid[] = "@(#)morph3d.c 4.07 97/11/24 xlockmore";
-
+#if 0
+static const char sccsid[] = "@(#)morph3d.c 5.01 2001/03/01 xlockmore";
#endif
#undef DEBUG_CULL_FACE
* event will the author be liable for any lost revenue or profits or
* other special, indirect and consequential damages.
*
- * The original code for this mode was written by Marcelo Fernandes Vianna
+ * The original code for this mode was written by Marcelo Fernandes Vianna
* (me...) and was inspired on a WindowsNT(R)'s screen saver (Flower Box).
- * It was written from scratch and it was not based on any other source code.
- *
- * Porting it to xlock (the final objective of this code since the moment I
- * decided to create it) was possible by comparing the original Mesa's gear
+ * It was written from scratch and it was not based on any other source code.
+ *
+ * Porting it to xlock (the final objective of this code since the moment I
+ * decided to create it) was possible by comparing the original Mesa's gear
* demo with it's ported version to xlock, so thanks for Danny Sung (look at
* gear.c) for his indirect help.
*
* mode, please refer to the Mesa package (ftp iris.ssec.wisc.edu on /pub/Mesa)
*
* Since I'm not a native English speaker, my apologies for any grammatical
- * mistake.
+ * mistakes.
*
* My e-mail address is
- * m-vianna@usa.net
+ * mfvianna@centroin.com.br
*
* Marcelo F. Vianna (Feb-13-1997)
*
* Revision History:
- * 27-Jul-97: Speed ups by Marcelo F. Vianna.
- * 08-May-97: Speed ups by Marcelo F. Vianna.
+ * 05-Apr-2002: Removed all gllist uses (fix some bug with nvidia driver)
+ * 01-Mar-2001: Added FPS stuff E.Lassauge <lassauge@mail.dotcom.fr>
+ * 27-Jul-1997: Speed ups by Marcelo F. Vianna.
+ * 08-May-1997: Speed ups by Marcelo F. Vianna.
*
*/
-/*-
- * PURIFY 3.0a on SunOS4 reports an unitialized memory read on each of
- * the glCallList() functions below when using MesaGL 2.1. This has
- * been fixed in MesaGL 2.2 and later releases.
- */
-
-/*-
- * due to a Bug/feature in VMS X11/Intrinsic.h has to be placed before xlock.
- * otherwise caddr_t is not defined correctly
- */
-
-#include <X11/Intrinsic.h>
-
#ifdef STANDALONE
-# define PROGCLASS "Morph3d"
-# define HACK_INIT init_morph3d
-# define HACK_DRAW draw_morph3d
-# define morph3d_opts xlockmore_opts
-# define DEFAULTS "*delay: 1000 \n" \
- "*count: 0 \n"
+# define MODE_moebius
+# define DEFAULTS "*delay: 40000 \n" \
+ "*showFPS: False \n" \
+ "*count: 0 \n" \
+ "*suppressRotationAnimation: True\n" \
+
+# define free_morph3d 0
+# define release_morph3d 0
+# define morph3d_handle_event xlockmore_no_events
# include "xlockmore.h" /* from the xscreensaver distribution */
#else /* !STANDALONE */
# include "xlock.h" /* from the xlockmore distribution */
#endif /* !STANDALONE */
-#ifdef USE_GL
+#ifdef MODE_moebius
-ModeSpecOpt morph3d_opts =
-{0, NULL, 0, NULL, NULL};
+ENTRYPOINT ModeSpecOpt morph3d_opts =
+{0, (XrmOptionDescRec *) NULL, 0, (argtype *) NULL, (OptionStruct *) NULL};
#ifdef USE_MODULES
ModStruct morph3d_description =
-{"morph3d", "init_morph3d", "draw_morph3d", "release_morph3d",
- "draw_morph3d", "change_morph3d", NULL, &morph3d_opts,
+{"morph3d", "init_morph3d", "draw_morph3d", (char *) NULL,
+ "draw_morph3d", "change_morph3d", (char *) NULL, &morph3d_opts,
1000, 0, 1, 1, 4, 1.0, "",
"Shows GL morphing polyhedra", 0, NULL};
int VisibleSpikes;
void (*draw_object) (ModeInfo * mi);
float Magnitude;
- float *MaterialColor[20];
+ const float *MaterialColor[20];
GLXContext *glx_context;
+ int arrayninit;
+
} morph3dstruct;
-static float front_shininess[] =
-{60.0};
-static float front_specular[] =
-{0.7, 0.7, 0.7, 1.0};
-static float ambient[] =
-{0.0, 0.0, 0.0, 1.0};
-static float diffuse[] =
-{1.0, 1.0, 1.0, 1.0};
-static float position0[] =
-{1.0, 1.0, 1.0, 0.0};
-static float position1[] =
-{-1.0, -1.0, 1.0, 0.0};
-static float lmodel_ambient[] =
-{0.5, 0.5, 0.5, 1.0};
-static float lmodel_twoside[] =
-{GL_TRUE};
-
-static float MaterialRed[] =
-{0.7, 0.0, 0.0, 1.0};
-static float MaterialGreen[] =
-{0.1, 0.5, 0.2, 1.0};
-static float MaterialBlue[] =
-{0.0, 0.0, 0.7, 1.0};
-static float MaterialCyan[] =
-{0.2, 0.5, 0.7, 1.0};
-static float MaterialYellow[] =
-{0.7, 0.7, 0.0, 1.0};
-static float MaterialMagenta[] =
-{0.6, 0.2, 0.5, 1.0};
-static float MaterialWhite[] =
-{0.7, 0.7, 0.7, 1.0};
-static float MaterialGray[] =
-{0.5, 0.5, 0.5, 1.0};
-
-static morph3dstruct *morph3d = NULL;
+static const GLfloat front_shininess[] = {60.0};
+static const GLfloat front_specular[] = {0.7, 0.7, 0.7, 1.0};
+static const GLfloat ambient[] = {0.0, 0.0, 0.0, 1.0};
+static const GLfloat diffuse[] = {1.0, 1.0, 1.0, 1.0};
+static const GLfloat position0[] = {1.0, 1.0, 1.0, 0.0};
+static const GLfloat position1[] = {-1.0, -1.0, 1.0, 0.0};
+static const GLfloat lmodel_ambient[] = {0.5, 0.5, 0.5, 1.0};
+static const GLfloat lmodel_twoside[] = {GL_TRUE};
+
+static const GLfloat MaterialRed[] = {0.7, 0.0, 0.0, 1.0};
+static const GLfloat MaterialGreen[] = {0.1, 0.5, 0.2, 1.0};
+static const GLfloat MaterialBlue[] = {0.0, 0.0, 0.7, 1.0};
+static const GLfloat MaterialCyan[] = {0.2, 0.5, 0.7, 1.0};
+static const GLfloat MaterialYellow[] = {0.7, 0.7, 0.0, 1.0};
+static const GLfloat MaterialMagenta[] = {0.6, 0.2, 0.5, 1.0};
+static const GLfloat MaterialWhite[] = {0.7, 0.7, 0.7, 1.0};
+static const GLfloat MaterialGray[] = {0.5, 0.5, 0.5, 1.0};
+
+static morph3dstruct *morph3d = (morph3dstruct *) NULL;
#define TRIANGLE(Edge, Amp, Divisions, Z, VS) \
{ \
- GLfloat Xf,Yf,Xa,Yb,Xf2,Yf2,Yf_2,Yb2,Yb_2; \
+ GLfloat Xf,Yf,Xa,Yb=0.0,Xf2=0.0,Yf2=0.0,Yf_2=0.0,Yb2,Yb_2; \
GLfloat Factor=0.0,Factor1,Factor2; \
GLfloat VertX,VertY,VertZ,NeiAX,NeiAY,NeiAZ,NeiBX,NeiBY,NeiBZ; \
GLfloat Ax,Ay; \
NeiBX=Factor2*Xf-VertX; NeiBY=Factor2*Yb-VertY; NeiBZ=Factor2*Zf-VertZ; \
glNormal3f(VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ)); \
glVertex3f(VertX, VertY, VertZ); \
+ mi->polygon_count++; \
\
Xf-=Ax; Yf-=Ay; Xa-=Ax; Yb-=Ay; \
\
NeiBX=Factor2*Xf-VertX; NeiBY=Factor2*Yb-VertY; NeiBZ=Factor2*Zf-VertZ; \
glNormal3f(VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ)); \
glVertex3f(VertX, VertY, VertZ); \
+ mi->polygon_count++; \
\
Xf-=Ax; Yf+=Ay; Xa-=Ax; Yb+=Ay; \
} \
NeiBX=Factor2*Xf-VertX; NeiBY=Factor2*Yb-VertY; NeiBZ=Factor2*Zf-VertZ; \
glNormal3f(VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ)); \
glVertex3f(VertX, VertY, VertZ); \
+ mi->polygon_count++; \
} \
glEnd(); \
} \
GLfloat Zf=(Edge)*(Z); \
GLfloat AmpVr2=(Amp)/sqr((Edge)*cossec36_2); \
\
- static GLfloat x[6],y[6]; \
- static int arrayninit=1; \
+ GLfloat x[6],y[6]; \
\
- if (arrayninit) { \
- for(Fi=0;Fi<6;Fi++) { \
- x[Fi]=-cos( Fi*2*Pi/5 + Pi/10 )/(Divisions)*cossec36_2*(Edge); \
- y[Fi]=sin( Fi*2*Pi/5 + Pi/10 )/(Divisions)*cossec36_2*(Edge); \
- } \
- arrayninit=0; \
+ for(Fi=0;Fi<6;Fi++) { \
+ x[Fi]=-cos( Fi*2*Pi/5 + Pi/10 )/(Divisions)*cossec36_2*(Edge); \
+ y[Fi]=sin( Fi*2*Pi/5 + Pi/10 )/(Divisions)*cossec36_2*(Edge); \
} \
\
for (Ri=1; Ri<=(Divisions); Ri++) { \
Xf=(float)(Ri-Ti)*x[Fi] + (float)Ti*x[Fi+1]; \
Yf=(float)(Ri-Ti)*y[Fi] + (float)Ti*y[Fi+1]; \
Xa=Xf+0.001; Yb=Yf+0.001; \
- Factor=1-(((Xf2=sqr(Xf))+(Yf2=sqr(Yf)))*AmpVr2); \
- Factor1=1-((sqr(Xa)+Yf2)*AmpVr2); \
- Factor2=1-((Xf2+sqr(Yb))*AmpVr2); \
+ Factor=1-(((Xf2=sqr(Xf))+(Yf2=sqr(Yf)))*AmpVr2); \
+ Factor1=1-((sqr(Xa)+Yf2)*AmpVr2); \
+ Factor2=1-((Xf2+sqr(Yb))*AmpVr2); \
VertX=Factor*Xf; VertY=Factor*Yf; VertZ=Factor*Zf; \
NeiAX=Factor1*Xa-VertX; NeiAY=Factor1*Yf-VertY; NeiAZ=Factor1*Zf-VertZ; \
NeiBX=Factor2*Xf-VertX; NeiBY=Factor2*Yb-VertY; NeiBZ=Factor2*Zf-VertZ; \
glNormal3f(VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ)); \
- glVertex3f(VertX, VertY, VertZ); \
+ glVertex3f(VertX, VertY, VertZ); \
+ mi->polygon_count++; \
\
Xf-=x[Fi]; Yf-=y[Fi]; Xa-=x[Fi]; Yb-=y[Fi]; \
\
- Factor=1-(((Xf2=sqr(Xf))+(Yf2=sqr(Yf)))*AmpVr2); \
- Factor1=1-((sqr(Xa)+Yf2)*AmpVr2); \
- Factor2=1-((Xf2+sqr(Yb))*AmpVr2); \
+ Factor=1-(((Xf2=sqr(Xf))+(Yf2=sqr(Yf)))*AmpVr2); \
+ Factor1=1-((sqr(Xa)+Yf2)*AmpVr2); \
+ Factor2=1-((Xf2+sqr(Yb))*AmpVr2); \
VertX=Factor*Xf; VertY=Factor*Yf; VertZ=Factor*Zf; \
NeiAX=Factor1*Xa-VertX; NeiAY=Factor1*Yf-VertY; NeiAZ=Factor1*Zf-VertZ; \
NeiBX=Factor2*Xf-VertX; NeiBY=Factor2*Yb-VertY; NeiBZ=Factor2*Zf-VertZ; \
glNormal3f(VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ)); \
- glVertex3f(VertX, VertY, VertZ); \
+ glVertex3f(VertX, VertY, VertZ); \
+ mi->polygon_count++; \
\
} \
Xf=(float)Ri*x[Fi+1]; \
glEnd(); \
} \
} \
- VS=(Factor<0); \
+ VS=(Factor<0); \
}
static void
draw_tetra(ModeInfo * mi)
{
- GLuint list;
-
morph3dstruct *mp = &morph3d[MI_SCREEN(mi)];
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[0]);
- list = glGenLists(1);
- glNewList(list, GL_COMPILE_AND_EXECUTE);
TRIANGLE(2, mp->seno, mp->edgedivisions, 0.5 / SQRT6, mp->VisibleSpikes);
- glEndList();
glPushMatrix();
glRotatef(180, 0, 0, 1);
glRotatef(-tetraangle, 1, 0, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[1]);
- glCallList(list);
+ TRIANGLE(2, mp->seno, mp->edgedivisions, 0.5 / SQRT6, mp->VisibleSpikes);
glPopMatrix();
glPushMatrix();
glRotatef(180, 0, 1, 0);
glRotatef(-180 + tetraangle, 0.5, SQRT3 / 2, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[2]);
- glCallList(list);
+ TRIANGLE(2, mp->seno, mp->edgedivisions, 0.5 / SQRT6, mp->VisibleSpikes);
glPopMatrix();
glRotatef(180, 0, 1, 0);
glRotatef(-180 + tetraangle, 0.5, -SQRT3 / 2, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[3]);
- glCallList(list);
-
- glDeleteLists(list, 1);
+ TRIANGLE(2, mp->seno, mp->edgedivisions, 0.5 / SQRT6, mp->VisibleSpikes);
}
static void
draw_cube(ModeInfo * mi)
{
- GLuint list;
-
morph3dstruct *mp = &morph3d[MI_SCREEN(mi)];
-
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[0]);
- list = glGenLists(1);
- glNewList(list, GL_COMPILE_AND_EXECUTE);
SQUARE(2, mp->seno, mp->edgedivisions, 0.5, mp->VisibleSpikes)
- glEndList();
glRotatef(cubeangle, 1, 0, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[1]);
- glCallList(list);
+ SQUARE(2, mp->seno, mp->edgedivisions, 0.5, mp->VisibleSpikes)
glRotatef(cubeangle, 1, 0, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[2]);
- glCallList(list);
+ SQUARE(2, mp->seno, mp->edgedivisions, 0.5, mp->VisibleSpikes)
glRotatef(cubeangle, 1, 0, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[3]);
- glCallList(list);
+ SQUARE(2, mp->seno, mp->edgedivisions, 0.5, mp->VisibleSpikes)
glRotatef(cubeangle, 0, 1, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[4]);
- glCallList(list);
+ SQUARE(2, mp->seno, mp->edgedivisions, 0.5, mp->VisibleSpikes)
glRotatef(2 * cubeangle, 0, 1, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[5]);
- glCallList(list);
-
- glDeleteLists(list, 1);
+ SQUARE(2, mp->seno, mp->edgedivisions, 0.5, mp->VisibleSpikes)
}
static void
draw_octa(ModeInfo * mi)
{
- GLuint list;
-
morph3dstruct *mp = &morph3d[MI_SCREEN(mi)];
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[0]);
-
- list = glGenLists(1);
- glNewList(list, GL_COMPILE_AND_EXECUTE);
TRIANGLE(2, mp->seno, mp->edgedivisions, 1 / SQRT6, mp->VisibleSpikes);
- glEndList();
glPushMatrix();
glRotatef(180, 0, 0, 1);
glRotatef(-180 + octaangle, 1, 0, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[1]);
- glCallList(list);
+ TRIANGLE(2, mp->seno, mp->edgedivisions, 1 / SQRT6, mp->VisibleSpikes);
glPopMatrix();
glPushMatrix();
glRotatef(180, 0, 1, 0);
glRotatef(-octaangle, 0.5, SQRT3 / 2, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[2]);
- glCallList(list);
+ TRIANGLE(2, mp->seno, mp->edgedivisions, 1 / SQRT6, mp->VisibleSpikes);
glPopMatrix();
glPushMatrix();
glRotatef(180, 0, 1, 0);
glRotatef(-octaangle, 0.5, -SQRT3 / 2, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[3]);
- glCallList(list);
+ TRIANGLE(2, mp->seno, mp->edgedivisions, 1 / SQRT6, mp->VisibleSpikes);
glPopMatrix();
glRotatef(180, 1, 0, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[4]);
- glCallList(list);
+ TRIANGLE(2, mp->seno, mp->edgedivisions, 1 / SQRT6, mp->VisibleSpikes);
glPushMatrix();
glRotatef(180, 0, 0, 1);
glRotatef(-180 + octaangle, 1, 0, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[5]);
- glCallList(list);
+ TRIANGLE(2, mp->seno, mp->edgedivisions, 1 / SQRT6, mp->VisibleSpikes);
glPopMatrix();
glPushMatrix();
glRotatef(180, 0, 1, 0);
glRotatef(-octaangle, 0.5, SQRT3 / 2, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[6]);
- glCallList(list);
+ TRIANGLE(2, mp->seno, mp->edgedivisions, 1 / SQRT6, mp->VisibleSpikes);
glPopMatrix();
glRotatef(180, 0, 1, 0);
glRotatef(-octaangle, 0.5, -SQRT3 / 2, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[7]);
- glCallList(list);
-
- glDeleteLists(list, 1);
+ TRIANGLE(2, mp->seno, mp->edgedivisions, 1 / SQRT6, mp->VisibleSpikes);
}
static void
draw_dodeca(ModeInfo * mi)
{
- GLuint list;
-
morph3dstruct *mp = &morph3d[MI_SCREEN(mi)];
#define TAU ((SQRT5+1)/2)
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[0]);
- list = glGenLists(1);
- glNewList(list, GL_COMPILE_AND_EXECUTE);
PENTAGON(1, mp->seno, mp->edgedivisions, sqr(TAU) * sqrt((TAU + 2) / 5) / 2, mp->VisibleSpikes);
- glEndList();
glPushMatrix();
glRotatef(180, 0, 0, 1);
glPushMatrix();
glRotatef(-dodecaangle, 1, 0, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[1]);
- glCallList(list);
+ PENTAGON(1, mp->seno, mp->edgedivisions, sqr(TAU) * sqrt((TAU + 2) / 5) / 2, mp->VisibleSpikes);
glPopMatrix();
glPushMatrix();
glRotatef(-dodecaangle, cos72, sin72, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[2]);
- glCallList(list);
+ PENTAGON(1, mp->seno, mp->edgedivisions, sqr(TAU) * sqrt((TAU + 2) / 5) / 2, mp->VisibleSpikes);
glPopMatrix();
glPushMatrix();
glRotatef(-dodecaangle, cos72, -sin72, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[3]);
- glCallList(list);
+ PENTAGON(1, mp->seno, mp->edgedivisions, sqr(TAU) * sqrt((TAU + 2) / 5) / 2, mp->VisibleSpikes);
glPopMatrix();
glPushMatrix();
glRotatef(dodecaangle, cos36, -sin36, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[4]);
- glCallList(list);
+ PENTAGON(1, mp->seno, mp->edgedivisions, sqr(TAU) * sqrt((TAU + 2) / 5) / 2, mp->VisibleSpikes);
glPopMatrix();
glRotatef(dodecaangle, cos36, sin36, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[5]);
- glCallList(list);
+ PENTAGON(1, mp->seno, mp->edgedivisions, sqr(TAU) * sqrt((TAU + 2) / 5) / 2, mp->VisibleSpikes);
glPopMatrix();
glRotatef(180, 1, 0, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[6]);
- glCallList(list);
+ PENTAGON(1, mp->seno, mp->edgedivisions, sqr(TAU) * sqrt((TAU + 2) / 5) / 2, mp->VisibleSpikes);
glRotatef(180, 0, 0, 1);
glPushMatrix();
glRotatef(-dodecaangle, 1, 0, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[7]);
- glCallList(list);
+ PENTAGON(1, mp->seno, mp->edgedivisions, sqr(TAU) * sqrt((TAU + 2) / 5) / 2, mp->VisibleSpikes);
glPopMatrix();
glPushMatrix();
glRotatef(-dodecaangle, cos72, sin72, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[8]);
- glCallList(list);
+ PENTAGON(1, mp->seno, mp->edgedivisions, sqr(TAU) * sqrt((TAU + 2) / 5) / 2, mp->VisibleSpikes);
glPopMatrix();
glPushMatrix();
glRotatef(-dodecaangle, cos72, -sin72, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[9]);
- glCallList(list);
+ PENTAGON(1, mp->seno, mp->edgedivisions, sqr(TAU) * sqrt((TAU + 2) / 5) / 2, mp->VisibleSpikes);
glPopMatrix();
glPushMatrix();
glRotatef(dodecaangle, cos36, -sin36, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[10]);
- glCallList(list);
+ PENTAGON(1, mp->seno, mp->edgedivisions, sqr(TAU) * sqrt((TAU + 2) / 5) / 2, mp->VisibleSpikes);
glPopMatrix();
glRotatef(dodecaangle, cos36, sin36, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[11]);
- glCallList(list);
-
- glDeleteLists(list, 1);
+ PENTAGON(1, mp->seno, mp->edgedivisions, sqr(TAU) * sqrt((TAU + 2) / 5) / 2, mp->VisibleSpikes);
}
static void
draw_icosa(ModeInfo * mi)
{
- GLuint list;
-
morph3dstruct *mp = &morph3d[MI_SCREEN(mi)];
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[0]);
- list = glGenLists(1);
- glNewList(list, GL_COMPILE_AND_EXECUTE);
TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
- glEndList();
glPushMatrix();
glRotatef(180, 0, 0, 1);
glRotatef(-icoangle, 1, 0, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[1]);
- glCallList(list);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
glPushMatrix();
glRotatef(180, 0, 1, 0);
glRotatef(-180 + icoangle, 0.5, SQRT3 / 2, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[2]);
- glCallList(list);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
glPopMatrix();
glRotatef(180, 0, 1, 0);
glRotatef(-180 + icoangle, 0.5, -SQRT3 / 2, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[3]);
- glCallList(list);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
glPopMatrix();
glPushMatrix();
glRotatef(180, 0, 1, 0);
glRotatef(-180 + icoangle, 0.5, SQRT3 / 2, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[4]);
- glCallList(list);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
glPushMatrix();
glRotatef(180, 0, 1, 0);
glRotatef(-180 + icoangle, 0.5, SQRT3 / 2, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[5]);
- glCallList(list);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
glPopMatrix();
glRotatef(180, 0, 0, 1);
glRotatef(-icoangle, 1, 0, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[6]);
- glCallList(list);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
glPopMatrix();
glRotatef(180, 0, 1, 0);
glRotatef(-180 + icoangle, 0.5, -SQRT3 / 2, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[7]);
- glCallList(list);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
glPushMatrix();
glRotatef(180, 0, 1, 0);
glRotatef(-180 + icoangle, 0.5, -SQRT3 / 2, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[8]);
- glCallList(list);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
glPopMatrix();
glRotatef(180, 0, 0, 1);
glRotatef(-icoangle, 1, 0, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[9]);
- glCallList(list);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
glPopMatrix();
glRotatef(180, 1, 0, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[10]);
- glCallList(list);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
glPushMatrix();
glRotatef(180, 0, 0, 1);
glRotatef(-icoangle, 1, 0, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[11]);
- glCallList(list);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
glPushMatrix();
glRotatef(180, 0, 1, 0);
glRotatef(-180 + icoangle, 0.5, SQRT3 / 2, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[12]);
- glCallList(list);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
glPopMatrix();
glRotatef(180, 0, 1, 0);
glRotatef(-180 + icoangle, 0.5, -SQRT3 / 2, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[13]);
- glCallList(list);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
glPopMatrix();
glPushMatrix();
glRotatef(180, 0, 1, 0);
glRotatef(-180 + icoangle, 0.5, SQRT3 / 2, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[14]);
- glCallList(list);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
glPushMatrix();
glRotatef(180, 0, 1, 0);
glRotatef(-180 + icoangle, 0.5, SQRT3 / 2, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[15]);
- glCallList(list);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
glPopMatrix();
glRotatef(180, 0, 0, 1);
glRotatef(-icoangle, 1, 0, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[16]);
- glCallList(list);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
glPopMatrix();
glRotatef(180, 0, 1, 0);
glRotatef(-180 + icoangle, 0.5, -SQRT3 / 2, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[17]);
- glCallList(list);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
glPushMatrix();
glRotatef(180, 0, 1, 0);
glRotatef(-180 + icoangle, 0.5, -SQRT3 / 2, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[18]);
- glCallList(list);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
glPopMatrix();
glRotatef(180, 0, 0, 1);
glRotatef(-icoangle, 1, 0, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[19]);
- glCallList(list);
-
- glDeleteLists(list, 1);
+ TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
}
-static void
-reshape(ModeInfo * mi, int width, int height)
+ENTRYPOINT void
+reshape_morph3d(ModeInfo * mi, int width, int height)
{
morph3dstruct *mp = &morph3d[MI_SCREEN(mi)];
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ }
- glViewport(0, 0, mp->WindW = (GLint) width, mp->WindH = (GLint) height);
+ glViewport(0, y, mp->WindW = (GLint) width, mp->WindH = (GLint) height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 15.0);
morph3dstruct *mp = &morph3d[MI_SCREEN(mi)];
glClearDepth(1.0);
- glClearColor(0.0, 0.0, 0.0, 1.0);
glColor3f(1.0, 1.0, 1.0);
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
}
}
-void
+ENTRYPOINT void
init_morph3d(ModeInfo * mi)
{
- int screen = MI_SCREEN(mi);
morph3dstruct *mp;
- if (morph3d == NULL) {
- if ((morph3d = (morph3dstruct *) calloc(MI_NUM_SCREENS(mi),
- sizeof (morph3dstruct))) == NULL)
- return;
- }
- mp = &morph3d[screen];
+ MI_INIT (mi, morph3d);
+ mp = &morph3d[MI_SCREEN(mi)];
mp->step = NRAND(90);
mp->VisibleSpikes = 1;
if ((mp->glx_context = init_GL(mi)) != NULL) {
- reshape(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ reshape_morph3d(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+ glDrawBuffer(GL_BACK);
mp->object = MI_COUNT(mi);
if (mp->object <= 0 || mp->object > 5)
mp->object = NRAND(5) + 1;
}
}
-void
+ENTRYPOINT void
draw_morph3d(ModeInfo * mi)
{
- morph3dstruct *mp = &morph3d[MI_SCREEN(mi)];
-
Display *display = MI_DISPLAY(mi);
Window window = MI_WINDOW(mi);
+ morph3dstruct *mp;
+
+ if (morph3d == NULL)
+ return;
+ mp = &morph3d[MI_SCREEN(mi)];
+
+ MI_IS_DRAWN(mi) = True;
if (!mp->glx_context)
return;
- glDrawBuffer(GL_BACK);
+ mi->polygon_count = 0;
glXMakeCurrent(display, window, *(mp->glx_context));
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glScalef(Scale4Iconic * mp->WindH / mp->WindW, Scale4Iconic, Scale4Iconic);
}
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, h, 1);
+ }
+# endif
+
glRotatef(mp->step * 100, 1, 0, 0);
glRotatef(mp->step * 95, 0, 1, 0);
glRotatef(mp->step * 90, 0, 0, 1);
glPopMatrix();
- glFlush();
-
+ if (MI_IS_FPS(mi)) do_fps (mi);
glXSwapBuffers(display, window);
mp->step += 0.05;
}
-void
+#ifndef STANDALONE
+ENTRYPOINT void
change_morph3d(ModeInfo * mi)
{
morph3dstruct *mp = &morph3d[MI_SCREEN(mi)];
mp->object = (mp->object) % 5 + 1;
pinit(mi);
}
-
-void
-release_morph3d(ModeInfo * mi)
-{
- if (morph3d != NULL) {
- (void) free((void *) morph3d);
- morph3d = NULL;
- }
- FreeAllGL(mi);
-}
+#endif /* !STANDALONE */
#endif
+
+XSCREENSAVER_MODULE ("Morph3D", morph3d)