diff options
author | Simon Rettberg | 2018-10-16 10:08:48 +0200 |
---|---|---|
committer | Simon Rettberg | 2018-10-16 10:08:48 +0200 |
commit | d3a98cf6cbc3bd0b9efc570f58e8812c03931c18 (patch) | |
tree | cbddf8e50f35a9c6e878a5bfe3c6d625d99e12ba /hacks/glx/glschool.c | |
download | xscreensaver-d3a98cf6cbc3bd0b9efc570f58e8812c03931c18.tar.gz xscreensaver-d3a98cf6cbc3bd0b9efc570f58e8812c03931c18.tar.xz xscreensaver-d3a98cf6cbc3bd0b9efc570f58e8812c03931c18.zip |
Original 5.40
Diffstat (limited to 'hacks/glx/glschool.c')
-rw-r--r-- | hacks/glx/glschool.c | 216 |
1 files changed, 216 insertions, 0 deletions
diff --git a/hacks/glx/glschool.c b/hacks/glx/glschool.c new file mode 100644 index 0000000..49cfc11 --- /dev/null +++ b/hacks/glx/glschool.c @@ -0,0 +1,216 @@ +/* glschool.c, Copyright (c) 2005-2006 David C. Lambert <dcl@panix.com> + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. No representations are made about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + */ +#include "xlockmore.h" +#include "glschool.h" + +#define sws_opts xlockmore_opts +#define DEFAULTS "*delay: 20000 \n" \ + "*showFPS: False \n" \ + "*wireframe: False \n" \ + +#define free_glschool (0) +#define release_glschool (0) +#define glschool_handle_event (xlockmore_no_events) + +#undef countof +#define countof(x) (sizeof((x))/sizeof((*x))) + +#define DEF_NFISH "100" +#define DEF_FOG "False" +#define DEF_DRAWBBOX "True" +#define DEF_DRAWGOAL "False" +#define DEF_GOALCHGF "50" +#define DEF_MAXVEL "7.0" +#define DEF_MINVEL "1.0" +#define DEF_ACCLIMIT "8.0" +#define DEF_DISTEXP "2.2" +#define DEF_AVOIDFACT "1.5" +#define DEF_MATCHFACT "0.15" +#define DEF_CENTERFACT "0.1" +#define DEF_TARGETFACT "80" +#define DEF_MINRADIUS "30.0" +#define DEF_MOMENTUM "0.9" +#define DEF_DISTCOMP "10.0" + +static int NFish; +static Bool DoFog; +static Bool DoDrawBBox; +static Bool DoDrawGoal; +static int GoalChgFreq; +static float MinVel; +static float MaxVel; +static float DistExp; +static float AccLimit; +static float AvoidFact; +static float MatchFact; +static float TargetFact; +static float CenterFact; +static float MinRadius; +static float Momentum; +static float DistComp; + +static XrmOptionDescRec opts[] = { + { "-nfish", ".nfish", XrmoptionSepArg, 0 }, + { "-fog", ".fog", XrmoptionNoArg, "True" }, + { "+fog", ".fog", XrmoptionNoArg, "False" }, + { "-drawgoal", ".drawgoal", XrmoptionNoArg, "True" }, + { "+drawgoal", ".drawgoal", XrmoptionNoArg, "False" }, + { "-drawbbox", ".drawbbox", XrmoptionNoArg, "True" }, + { "+drawbbox", ".drawbbox", XrmoptionNoArg, "False" }, + { "-goalchgf", ".goalchgf", XrmoptionSepArg, 0 }, + { "-maxvel", ".maxvel", XrmoptionSepArg, 0 }, + { "-minvel", ".minvel", XrmoptionSepArg, 0 }, + { "-acclimit", ".acclimit", XrmoptionSepArg, 0 }, + { "-distexp", ".distexp", XrmoptionSepArg, 0 }, + { "-avoidfact", ".avoidfact", XrmoptionSepArg, 0 }, + { "-matchfact", ".matchfact", XrmoptionSepArg, 0 }, + { "-centerfact",".centerfact", XrmoptionSepArg, 0 }, + { "-targetfact",".targetfact", XrmoptionSepArg, 0 }, + { "-minradius", ".minradius", XrmoptionSepArg, 0 }, + { "-distcomp", ".distcomp", XrmoptionSepArg, 0 }, + { "-momentum", ".momentum", XrmoptionSepArg, 0 }, +}; + +static argtype vars[] = { + {&NFish, "nfish", "NFish", DEF_NFISH, t_Int}, + {&DoFog, "fog", "DoFog", DEF_FOG, t_Bool}, + {&DoDrawBBox, "drawbbox", "DoDrawBBox", DEF_DRAWBBOX, t_Bool}, + {&DoDrawGoal, "drawgoal", "DoDrawGoal", DEF_DRAWGOAL, t_Bool}, + {&GoalChgFreq, "goalchgf", "GoalChgFreq", DEF_GOALCHGF, t_Int}, + {&MaxVel, "maxvel", "MaxVel", DEF_MAXVEL, t_Float}, + {&MinVel, "minvel", "MinVel", DEF_MINVEL, t_Float}, + {&AccLimit, "acclimit", "AccLimit", DEF_ACCLIMIT, t_Float}, + {&DistExp, "distexp", "DistExp", DEF_DISTEXP, t_Float}, + {&AvoidFact, "avoidfact", "AvoidFact", DEF_AVOIDFACT, t_Float}, + {&MatchFact, "matchfact", "MatchFact", DEF_MATCHFACT, t_Float}, + {&CenterFact, "centerfact", "CenterFact", DEF_CENTERFACT, t_Float}, + {&TargetFact, "targetfact", "TargetFact", DEF_TARGETFACT, t_Float}, + {&MinRadius, "minradius", "MinRadius", DEF_MINRADIUS, t_Float}, + {&Momentum, "momentum", "Momentum", DEF_MOMENTUM, t_Float}, + {&DistComp, "distcomp", "DistComp", DEF_DISTCOMP, t_Float}, +}; + +ENTRYPOINT ModeSpecOpt glschool_opts = {countof(opts), opts, countof(vars), vars, NULL}; + +typedef struct { + int nColors; + int rotCounter; + int goalCounter; + Bool drawGoal; + Bool drawBBox; + GLuint bboxList; + GLuint goalList; + GLuint fishList; + int fish_polys, box_polys; + XColor *colors; + School *school; + GLXContext *context; +} glschool_configuration; + +static glschool_configuration *scs = NULL; + +ENTRYPOINT void +reshape_glschool(ModeInfo *mi, int width, int height) +{ + Bool wire = MI_IS_WIREFRAME(mi); + double aspect = (double)width/(double)height; + glschool_configuration *sc = &scs[MI_SCREEN(mi)]; + + glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(sc->context)); + if (sc->school != (School *)0) { + glschool_setBBox(sc->school, -aspect*160, aspect*160, -130, 130, -450, -50.0); + glDeleteLists(sc->bboxList, 1); + glschool_createBBoxList(&SCHOOL_BBOX(sc->school), + &sc->bboxList, wire); + } + glschool_reshape(width, height); +} + +ENTRYPOINT void +init_glschool(ModeInfo *mi) +{ + int width = MI_WIDTH(mi); + int height = MI_HEIGHT(mi); + Bool wire = MI_IS_WIREFRAME(mi); + glschool_configuration *sc; + + MI_INIT (mi, scs); + sc = &scs[MI_SCREEN(mi)]; + + sc->drawGoal = DoDrawGoal; + sc->drawBBox = DoDrawBBox; + + sc->nColors = 360; + sc->context = init_GL(mi); + sc->colors = (XColor *)calloc(sc->nColors, sizeof(XColor)); + make_color_ramp(0, 0, 0, + 0.0, 1.0, 1.0, + 359.0, 1.0, 1.0, + sc->colors, &sc->nColors, + False, 0, False); + + sc->school = glschool_initSchool(NFish, AccLimit, MaxVel, MinVel, DistExp, Momentum, + MinRadius, AvoidFact, MatchFact, CenterFact, TargetFact, + DistComp); + if (sc->school == (School *)0) { + fprintf(stderr, "couldn't initialize TheSchool, exiting\n"); + exit(1); + } + + reshape_glschool(mi, width, height); + + glschool_initGLEnv(DoFog); + glschool_initFishes(sc->school); + glschool_createDrawLists(&SCHOOL_BBOX(sc->school), + &sc->bboxList, &sc->goalList, &sc->fishList, + &sc->fish_polys, &sc->box_polys, wire); + glschool_computeAccelerations(sc->school); +} + +ENTRYPOINT void +draw_glschool(ModeInfo *mi) +{ + Window window = MI_WINDOW(mi); + Display *dpy = MI_DISPLAY(mi); + glschool_configuration *sc = &scs[MI_SCREEN(mi)]; + + if (!sc->context) { + fprintf(stderr, "no context\n"); + return; + } + + glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(sc->context)); + + mi->polygon_count = 0; + + if ((sc->goalCounter % GoalChgFreq) == 0) + glschool_newGoal(sc->school); + sc->goalCounter++; + + sc->rotCounter++; + sc->rotCounter = (sc->rotCounter%360); + + glschool_applyMovements(sc->school); + glschool_drawSchool(sc->colors, sc->school, sc->bboxList, + sc->goalList, sc->fishList, sc->rotCounter, + sc->drawGoal, sc->drawBBox, + sc->fish_polys, sc->box_polys, + &mi->polygon_count); + glschool_computeAccelerations(sc->school); + + if (mi->fps_p) + do_fps(mi); + + glFinish(); + glXSwapBuffers(dpy, window); +} + +XSCREENSAVER_MODULE("GLSchool", glschool) |