/* atlantis --- Shows moving 3D sea animals */

/* Copyright (c) E. Lassauge, 1998. */

/*
 * Permission to use, copy, modify, and distribute this software and its
 * documentation for any purpose and without fee is hereby granted,
 * provided that the above copyright notice appear in all copies and that
 * both that copyright notice and this permission notice appear in
 * supporting documentation.
 *
 * This file is provided AS IS with no warranties of any kind.  The author
 * shall have no liability with respect to the infringement of copyrights,
 * trade secrets or any patents by this file or any part thereof.  In no
 * 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 Mark J. Kilgard
 * as a demo for openGL programming.
 * 
 * Porting it to xlock  was possible by comparing the original Mesa's morph3d 
 * demo with it's ported version to xlock, so thanks for Marcelo F. Vianna 
 * (look at morph3d.c) for his indirect help.
 *
 * Thanks goes also to Brian Paul for making it possible and inexpensive
 * to use OpenGL at home.
 *
 * My e-mail address is lassauge@users.sourceforge.net
 *
 * Eric Lassauge  (May-13-1998)
 *
 */

/**
 * (c) Copyright 1993, 1994, Silicon Graphics, Inc.
 * ALL RIGHTS RESERVED
 * Permission to use, copy, modify, and distribute this software for
 * any purpose and without fee is hereby granted, provided that the above
 * copyright notice appear in all copies and that both the copyright notice
 * and this permission notice appear in supporting documentation, and that
 * the name of Silicon Graphics, Inc. not be used in advertising
 * or publicity pertaining to distribution of the software without specific,
 * written prior permission.
 *
 * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
 * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
 * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
 * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
 * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
 * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
 * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
 * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
 * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
 * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 * US Government Users Restricted Rights
 * Use, duplication, or disclosure by the Government is subject to
 * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
 * (c)(1)(ii) of the Rights in Technical Data and Computer Software
 * clause at DFARS 252.227-7013 and/or in similar or successor
 * clauses in the FAR or the DOD or NASA FAR Supplement.
 * Unpublished-- rights reserved under the copyright laws of the
 * United States.  Contractor/manufacturer is Silicon Graphics,
 * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
 *
 * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
 */

#ifdef STANDALONE
# include "xlockmoreI.h"
#else
# include "xlock.h"
#endif

#include <math.h>

#define RAD 57.295
#define RRAD 0.01745

/* default values */
#define NUM_SHARKS 4
#define SHARKSPEED 100
#define SHARKSIZE 6000

typedef struct _fishRec {
	/* Position in global coordinate system */
	float       x, y, z;
	/* Three rotation angles to determine heading; phi=roll, psi=bearing/yaw, theta=elevation/pitch */
	float phi, theta, psi;
	/* Speed along forward direction vector. */
	float v;
	float       xt, yt, zt;
	/* Tail position adjustments; htail controls the phase of the
	   thrash animation for the whales and dolphin. */
	float       htail, vtail;
	/* Scale factor for the whale/dolphin tail thrash
	   speed. Normally bigger creatures move more slowly; since
	   the fish size isn’t stored anywhere adjust this speed
	   instead. */
	float       tail_speed_scale;
	/* Scale factor for the size of the loop the whale/dolphin is
	   swimming around in. */
	float       loop_scale;
	/* Parameters used for shark swimming */
	float       dtheta;
	int         spurt, attack;
	int         sign;
} fishRec;

typedef struct {
	GLint       WinH, WinW;
	GLXContext *glx_context;
	int         num_sharks;
	float       sharkspeed, whalespeed;
	int         sharksize;
	int         wire;
	Bool        whaledir;
	fishRec    *sharks;
	fishRec     momWhale;
	fishRec     babyWhale;
	fishRec     dolph;

        XImage     *texture;	   /* water distortion overlay bits */
} atlantisstruct;

extern void FishTransform(fishRec *);
extern void WhalePilot(fishRec *, float, Bool);
extern void SharkPilot(fishRec *, float);
extern void SharkMiss(atlantisstruct *, int);
extern void DrawWhale(fishRec *, int);
extern void DrawShark(fishRec *, int);
extern void DrawDolphin(fishRec *, int);
