+ENTRYPOINT void
+draw_morph3d(ModeInfo * 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;
+
+ mi->polygon_count = 0;
+ glXMakeCurrent(display, window, *(mp->glx_context));
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+
+ glTranslatef(0.0, 0.0, -10.0);
+
+ if (!MI_IS_ICONIC(mi)) {
+ glScalef(Scale4Window * mp->WindH / mp->WindW, Scale4Window, Scale4Window);
+ glTranslatef(2.5 * mp->WindW / mp->WindH * sin(mp->step * 1.11), 2.5 * cos(mp->step * 1.25 * 1.11), 0);
+ } else {
+ 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);
+
+ mp->seno = (sin(mp->step) + 1.0 / 3.0) * (4.0 / 5.0) * mp->Magnitude;
+
+ if (mp->VisibleSpikes) {
+#ifdef DEBUG_CULL_FACE
+ int loop;
+
+ for (loop = 0; loop < 20; loop++)
+ mp->MaterialColor[loop] = MaterialGray;
+#endif
+ glDisable(GL_CULL_FACE);
+ } else {
+#ifdef DEBUG_CULL_FACE
+ int loop;
+
+ for (loop = 0; loop < 20; loop++)
+ mp->MaterialColor[loop] = MaterialWhite;
+#endif
+ glEnable(GL_CULL_FACE);
+ }
+
+ mp->draw_object(mi);
+
+ glPopMatrix();
+
+ if (MI_IS_FPS(mi)) do_fps (mi);
+ glXSwapBuffers(display, window);
+
+ mp->step += 0.05;
+}
+
+#ifndef STANDALONE
+ENTRYPOINT void