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