1 | /************************************************************************* |
---|
2 | * * |
---|
3 | * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * |
---|
4 | * All rights reserved. Email: russ@q12.org Web: www.q12.org * |
---|
5 | * * |
---|
6 | * This library is free software; you can redistribute it and/or * |
---|
7 | * modify it under the terms of EITHER: * |
---|
8 | * (1) The GNU Lesser General Public License as published by the Free * |
---|
9 | * Software Foundation; either version 2.1 of the License, or (at * |
---|
10 | * your option) any later version. The text of the GNU Lesser * |
---|
11 | * General Public License is included with this library in the * |
---|
12 | * file LICENSE.TXT. * |
---|
13 | * (2) The BSD-style license that is included with this library in * |
---|
14 | * the file LICENSE-BSD.TXT. * |
---|
15 | * * |
---|
16 | * This library is distributed in the hope that it will be useful, * |
---|
17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of * |
---|
18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * |
---|
19 | * LICENSE.TXT and LICENSE-BSD.TXT for more details. * |
---|
20 | * * |
---|
21 | *************************************************************************/ |
---|
22 | |
---|
23 | #include <stdio.h> |
---|
24 | #include <math.h> |
---|
25 | #include <drawstuff/drawstuff.h> |
---|
26 | |
---|
27 | |
---|
28 | #ifndef M_PI |
---|
29 | #define M_PI (3.14159265358979323846) |
---|
30 | #endif |
---|
31 | |
---|
32 | |
---|
33 | void start() |
---|
34 | { |
---|
35 | // adjust the starting viewpoint a bit |
---|
36 | float xyz[3],hpr[3]; |
---|
37 | dsGetViewpoint (xyz,hpr); |
---|
38 | hpr[0] += 7; |
---|
39 | dsSetViewpoint (xyz,hpr); |
---|
40 | } |
---|
41 | |
---|
42 | |
---|
43 | void simLoop (int pause) |
---|
44 | { |
---|
45 | float pos[3]; |
---|
46 | float R[12]; |
---|
47 | static float a = 0; |
---|
48 | |
---|
49 | if (!pause) a += 0.02f; |
---|
50 | if (a > (2*M_PI)) a -= (float) (2*M_PI); |
---|
51 | float ca = (float) cos(a); |
---|
52 | float sa = (float) sin(a); |
---|
53 | |
---|
54 | dsSetTexture (DS_WOOD); |
---|
55 | |
---|
56 | float b = (a > M_PI) ? (2*(a-(float)M_PI)) : a*2; |
---|
57 | pos[0] = -0.3f; |
---|
58 | pos[1] = 0; |
---|
59 | pos[2] = (float) (0.1f*(2*M_PI*b - b*b) + 0.65f); |
---|
60 | R[0] = ca; R[1] = 0; R[2] = -sa; |
---|
61 | R[4] = 0; R[5] = 1; R[6] = 0; |
---|
62 | R[8] = sa; R[9] = 0; R[10] = ca; |
---|
63 | dsSetColor (1,0.8f,0.6f); |
---|
64 | dsDrawSphere (pos,R,0.3f); |
---|
65 | |
---|
66 | dsSetTexture (DS_NONE); |
---|
67 | |
---|
68 | pos[0] = -0.2f; |
---|
69 | pos[1] = 0.8f; |
---|
70 | pos[2] = 0.4f; |
---|
71 | R[0] = ca; R[1] = -sa; R[2] = 0; |
---|
72 | R[4] = sa; R[5] = ca; R[6] = 0; |
---|
73 | R[8] = 0; R[9] = 0; R[10] = 1; |
---|
74 | float sides[3] = {0.1f,0.4f,0.8f}; |
---|
75 | dsSetColor (0.6f,0.6f,1); |
---|
76 | dsDrawBox (pos,R,sides); |
---|
77 | |
---|
78 | dsSetTexture (DS_WOOD); |
---|
79 | |
---|
80 | float r = 0.3f; // cylinder radius |
---|
81 | float d = (float)cos(a*2) * 0.4f; |
---|
82 | float cd = (float)cos(-d/r); |
---|
83 | float sd = (float)sin(-d/r); |
---|
84 | pos[0] = -0.2f; |
---|
85 | pos[1] = -1 + d; |
---|
86 | pos[2] = 0.3f; |
---|
87 | R[0] = 0; R[1] = 0; R[2] = -1; |
---|
88 | R[4] = -sd; R[5] = cd; R[6] = 0; |
---|
89 | R[8] = cd; R[9] = sd; R[10] = 0; |
---|
90 | dsSetColor (0.4f,1,1); |
---|
91 | dsDrawCylinder (pos,R,0.8f,r); |
---|
92 | |
---|
93 | pos[0] = 0; |
---|
94 | pos[1] = 0; |
---|
95 | pos[2] = 0.2f; |
---|
96 | R[0] = 0; R[1] = sa; R[2] = -ca; |
---|
97 | R[4] = 0; R[5] = ca; R[6] = sa; |
---|
98 | R[8] = 1; R[9] = 0; R[10] = 0; |
---|
99 | dsSetColor (1,0.9f,0.2f); |
---|
100 | dsDrawCappedCylinder (pos,R,0.8f,0.2f); |
---|
101 | } |
---|
102 | |
---|
103 | |
---|
104 | void command (int cmd) |
---|
105 | { |
---|
106 | dsPrint ("received command %d (`%c')\n",cmd,cmd); |
---|
107 | } |
---|
108 | |
---|
109 | |
---|
110 | int main (int argc, char **argv) |
---|
111 | { |
---|
112 | // setup pointers to callback functions |
---|
113 | dsFunctions fn; |
---|
114 | fn.version = DS_VERSION; |
---|
115 | fn.start = &start; |
---|
116 | fn.step = &simLoop; |
---|
117 | fn.command = command; |
---|
118 | fn.stop = 0; |
---|
119 | fn.path_to_textures = 0; // uses default |
---|
120 | |
---|
121 | // run simulation |
---|
122 | dsSimulationLoop (argc,argv,400,400,&fn); |
---|
123 | |
---|
124 | return 0; |
---|
125 | } |
---|