1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/types.h>
4
5 #include "sfm.h"
6
7
8 SFMRealmStruct *SFMInit(int argc, char **argv);
9 void SFMShutdown(SFMRealmStruct *realm);
10
11 void SFMSetTiming(SFMRealmStruct *realm, SFMTime lapsed_ms);
12 void SFMSetTimeCompression(SFMRealmStruct *realm, double compression);
13 void SFMUpdateRealm(SFMRealmStruct *realm, SFMTime lapsed_ms);
14
15
16 /*
17 * Creates a new FDM Realm.
18 */
SFMInit(int argc,char ** argv)19 SFMRealmStruct *SFMInit(int argc, char **argv)
20 {
21 SFMRealmStruct *realm = SFM_REALM(calloc(
22 1, sizeof(SFMRealmStruct)
23 ));
24 if(realm == NULL)
25 return(NULL);
26
27 /* Reset values */
28 realm->lapsed_time = 0l;
29 realm->time_compensation = 1.0;
30 realm->time_compression = 1.0;
31
32 realm->gravity = SFMDefaultGravity;
33
34 realm->airborne_cb_client_data = NULL;
35 realm->airborne_cb = NULL;
36
37 realm->touch_down_cb_client_data = NULL;
38 realm->touch_down_cb = NULL;
39
40 realm->collision_cb_client_data = NULL;
41 realm->collision_cb = NULL;
42
43 realm->model = NULL;
44 realm->total_models = 0;
45
46 return(realm);
47 }
48
49 /*
50 * Deletes the FDM Realm.
51 */
SFMShutdown(SFMRealmStruct * realm)52 void SFMShutdown(SFMRealmStruct *realm)
53 {
54 if(realm == NULL)
55 return;
56
57 /* Delete all FDMs */
58 while(realm->total_models > 0)
59 {
60 if(realm->model[0] == NULL)
61 break;
62
63 /* Delete this SFMModel, this will also call the
64 * destroy_model_cb on the Realm if it is set.
65 *
66 * Note that each call to this function will
67 * deincrement realm->total_models by one
68 */
69 SFMModelDelete(realm, realm->model[0]);
70 }
71
72 free(realm);
73 }
74
75 /*
76 * Sets the FDM Realm's timing.
77 *
78 * Future calls to SFM*() functions will use the timing values
79 * set here.
80 */
SFMSetTiming(SFMRealmStruct * realm,SFMTime lapsed_ms)81 void SFMSetTiming(SFMRealmStruct *realm, SFMTime lapsed_ms)
82 {
83 if(realm == NULL)
84 return;
85
86 if(lapsed_ms < 0l)
87 lapsed_ms = 0l;
88
89 /* Update timings */
90 realm->lapsed_time = lapsed_ms;
91 realm->time_compensation = (double)(
92 (double)lapsed_ms / (double)SFMCycleUnitsMS
93 );
94 }
95
96 /*
97 * Sets the FDM Realm's time compression.
98 */
SFMSetTimeCompression(SFMRealmStruct * realm,double compression)99 void SFMSetTimeCompression(SFMRealmStruct *realm, double compression)
100 {
101 if(realm == NULL)
102 return;
103
104 if(compression < 0.0)
105 compression = 0.0;
106
107 realm->time_compression = compression;
108 }
109
110 /*
111 * Updates the FDM Realm's FDMs and timing.
112 */
SFMUpdateRealm(SFMRealmStruct * realm,SFMTime lapsed_ms)113 void SFMUpdateRealm(SFMRealmStruct *realm, SFMTime lapsed_ms)
114 {
115 int m_num;
116 SFMModelStruct *m;
117
118 if(realm == NULL)
119 return;
120
121 SFMSetTiming(realm, lapsed_ms);
122
123 /* Update each FDM */
124 for(m_num = 0; m_num < realm->total_models; m_num++)
125 {
126 m = realm->model[m_num];
127 if(m == NULL)
128 continue;
129
130 /* TODO */
131
132 }
133 }
134