00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include <Windows.h>
00016 #include <Assert.h>
00017
00018 #include "Genesis.h"
00019
00020 #include "Buffer.h"
00021
00022 typedef struct Pos2
00023 {
00024 int16 X, Y, Z;
00025 } Pos2;
00026
00027 geBoolean Buffer_FillByte(Buffer_Data *Buffer, uint8 Byte)
00028 {
00029 assert(Buffer->Pos + (int32)sizeof(uint8) < Buffer->Size);
00030
00031 if (Buffer->Pos + (int32)sizeof(uint8) >= Buffer->Size)
00032 return GE_FALSE;
00033
00034 Buffer->Data[Buffer->Pos] = Byte;
00035
00036 Buffer->Pos += sizeof(uint8);
00037
00038 return GE_TRUE;
00039 }
00040
00041 geBoolean Buffer_FillShort(Buffer_Data *Buffer, uint16 Short)
00042 {
00043 uint16 *Data;
00044
00045 assert(Buffer->Pos + (int32)sizeof(uint16) < Buffer->Size);
00046
00047 if (Buffer->Pos + (int32)sizeof(uint16) >= Buffer->Size)
00048 return GE_FALSE;
00049
00050 Data = (uint16*)&Buffer->Data[Buffer->Pos];
00051
00052 *Data = Short;
00053
00054 Buffer->Pos += sizeof(uint16);
00055
00056 return GE_TRUE;
00057 }
00058
00059 geBoolean Buffer_FillLong(Buffer_Data *Buffer, uint32 Long)
00060 {
00061 uint32 *Data;
00062
00063 assert(Buffer->Pos + (int32)sizeof(uint32) < Buffer->Size);
00064
00065 if (Buffer->Pos + (int32)sizeof(uint32) >= Buffer->Size)
00066 return GE_FALSE;
00067
00068 Data = (uint32*)&Buffer->Data[Buffer->Pos];
00069
00070 *Data = Long;
00071
00072 Buffer->Pos += sizeof(uint32);
00073
00074 return GE_TRUE;
00075 }
00076
00077 geBoolean Buffer_FillSLong(Buffer_Data *Buffer, int32 Long)
00078 {
00079 int32 *Data;
00080
00081 assert(Buffer->Pos + (int32)sizeof(int32) < Buffer->Size);
00082
00083 if (Buffer->Pos + (int32)sizeof(int32) >= Buffer->Size)
00084 return GE_FALSE;
00085
00086 Data = (int32*)&Buffer->Data[Buffer->Pos];
00087
00088 *Data = Long;
00089
00090 Buffer->Pos += sizeof(int32);
00091
00092 return GE_TRUE;
00093 }
00094
00095 geBoolean Buffer_FillFloat(Buffer_Data *Buffer, float Float)
00096 {
00097 float *Data;
00098
00099 assert(Buffer->Pos + (int32)sizeof(float) < Buffer->Size);
00100
00101 if (Buffer->Pos + (int32)sizeof(float) >= Buffer->Size)
00102 return GE_FALSE;
00103
00104 Data = (float*)&Buffer->Data[Buffer->Pos];
00105
00106 *Data = Float;
00107
00108 Buffer->Pos += sizeof(float);
00109
00110 return GE_TRUE;
00111 }
00112
00113 geBoolean Buffer_FillFloat2(Buffer_Data *Buffer, float Float, float Max)
00114 {
00115 uint16 *Data;
00116
00117 assert(Float <= Max);
00118 assert(Buffer->Pos + (int32)sizeof(uint16) < Buffer->Size);
00119
00120 if (Buffer->Pos + (int32)sizeof(uint16) >= Buffer->Size)
00121 return GE_FALSE;
00122
00123 Data = (uint16*)&Buffer->Data[Buffer->Pos];
00124
00125 *Data = (uint16)((Float/Max)*65535);
00126
00127 Buffer->Pos += sizeof(uint16);
00128
00129 return GE_TRUE;
00130 }
00131
00132 geBoolean Buffer_FillAngle(Buffer_Data *Buffer, geVec3d Angle)
00133 {
00134 geVec3d *Data;
00135
00136 assert(Buffer->Pos + (int32)sizeof(geVec3d) < Buffer->Size);
00137
00138 if (Buffer->Pos + (int32)sizeof(geVec3d) >= Buffer->Size)
00139 return GE_FALSE;
00140
00141 Data = (geVec3d*)&Buffer->Data[Buffer->Pos];
00142
00143 *Data = Angle;
00144
00145 Buffer->Pos += sizeof(geVec3d);
00146
00147 return GE_TRUE;
00148 }
00149
00150 geBoolean Buffer_FillPos(Buffer_Data *Buffer, geVec3d Pos)
00151 {
00152 geVec3d *Data;
00153
00154 assert(Buffer->Pos + (int32)sizeof(geVec3d) < Buffer->Size);
00155
00156 if (Buffer->Pos + (int32)sizeof(geVec3d) >= Buffer->Size)
00157 return GE_FALSE;
00158
00159 Data = (geVec3d*)&Buffer->Data[Buffer->Pos];
00160
00161 *Data = Pos;
00162
00163 Buffer->Pos += sizeof(geVec3d);
00164
00165 return GE_TRUE;
00166 }
00167
00168 geBoolean Buffer_FillString(Buffer_Data *Buffer, uint8 *Str)
00169 {
00170 int32 i;
00171
00172 assert(Buffer->Pos + (int32)strlen((char*)Str)+1 < Buffer->Size);
00173
00174 if (Buffer->Pos + (int32)strlen((char*)Str)+1 >= Buffer->Size)
00175 return GE_FALSE;
00176
00177 for (i=0; i< (int32)strlen((char*)Str)+1; i++)
00178 Buffer->Data[Buffer->Pos++] = Str[i];
00179
00180 return GE_TRUE;
00181 }
00182
00183 geBoolean Buffer_FillBuffer(Buffer_Data *Buffer1, Buffer_Data *Buffer2)
00184 {
00185 int32 i;
00186
00187 assert(Buffer2->Pos + Buffer1->Pos < Buffer1->Size);
00188
00189 if (Buffer2->Pos + Buffer1->Pos >= Buffer1->Size)
00190 return GE_FALSE;
00191
00192 for (i=0; i< Buffer2->Pos; i++)
00193 Buffer1->Data[Buffer1->Pos++] = Buffer2->Data[i];
00194
00195 return GE_TRUE;
00196 }
00197
00198 geBoolean Buffer_FillData(Buffer_Data *Buffer1, uint8 *Data, int32 Size)
00199 {
00200 int32 i;
00201
00202 assert(Buffer1->Pos + Size < Buffer1->Size);
00203
00204 if (Buffer1->Pos + Size >= Buffer1->Size)
00205 return GE_FALSE;
00206
00207 for (i=0; i< Size; i++)
00208 Buffer1->Data[Buffer1->Pos++] = Data[i];
00209
00210 return GE_TRUE;
00211 }
00212
00213 geBoolean Buffer_GetByte(Buffer_Data *Buffer, uint8 *Byte)
00214 {
00215 assert(Buffer->Pos + (int32)sizeof(uint8) <= Buffer->Size);
00216
00217 *Byte = Buffer->Data[Buffer->Pos];
00218
00219 Buffer->Pos += sizeof(uint8);
00220
00221 return GE_TRUE;
00222 }
00223
00224 geBoolean Buffer_GetShort(Buffer_Data *Buffer, uint16 *Short)
00225 {
00226 assert(Buffer->Pos + (int32)sizeof(uint16) <= Buffer->Size);
00227
00228 *Short = *((uint16*)&Buffer->Data[Buffer->Pos]);
00229
00230 Buffer->Pos += sizeof(uint16);
00231
00232 return GE_TRUE;
00233 }
00234
00235 geBoolean Buffer_GetLong(Buffer_Data *Buffer, uint32 *Long)
00236 {
00237 assert(Buffer->Pos + (int32)sizeof(uint32) <= Buffer->Size);
00238
00239 *Long = *((uint32*)&Buffer->Data[Buffer->Pos]);
00240
00241 Buffer->Pos += sizeof(uint32);
00242
00243 return GE_TRUE;
00244 }
00245
00246 geBoolean Buffer_GetSLong(Buffer_Data *Buffer, int32 *Long)
00247 {
00248 assert(Buffer->Pos + (int32)sizeof(int32) <= Buffer->Size);
00249
00250 *Long = *((int32*)&Buffer->Data[Buffer->Pos]);
00251
00252 Buffer->Pos += sizeof(int32);
00253
00254 return GE_TRUE;
00255 }
00256
00257 geBoolean Buffer_GetFloat(Buffer_Data *Buffer, float *Float)
00258 {
00259 assert(Buffer->Pos + (int32)sizeof(float) <= Buffer->Size);
00260
00261 *Float = *((float*)&Buffer->Data[Buffer->Pos]);
00262
00263 Buffer->Pos += sizeof(float);
00264
00265 return GE_TRUE;
00266 }
00267
00268 geBoolean Buffer_GetFloat2(Buffer_Data *Buffer, float *Float, float Max)
00269 {
00270 uint16 Temp16;
00271
00272 assert(Buffer->Pos + (int32)sizeof(uint16) <= Buffer->Size);
00273
00274 Temp16 = *((uint16*)&Buffer->Data[Buffer->Pos]);
00275
00276 *Float = ((float)Temp16 / 65535.0f) * Max;
00277
00278 Buffer->Pos += sizeof(uint16);
00279
00280 return GE_TRUE;
00281 }
00282
00283 geBoolean Buffer_GetAngle(Buffer_Data *Buffer, geVec3d *Angle)
00284 {
00285 assert(Buffer->Pos + (int32)sizeof(geVec3d) <= Buffer->Size);
00286
00287 *Angle = *(geVec3d*)&Buffer->Data[Buffer->Pos];
00288
00289 Buffer->Pos += sizeof(geVec3d);
00290
00291 return GE_TRUE;
00292 }
00293
00294 geBoolean Buffer_GetPos(Buffer_Data *Buffer, geVec3d *Pos)
00295 {
00296 assert(Buffer->Pos + (int32)sizeof(geVec3d) <= Buffer->Size);
00297
00298 *Pos = *(geVec3d*)&Buffer->Data[Buffer->Pos];
00299
00300 Buffer->Pos += sizeof(geVec3d);
00301
00302 return GE_TRUE;
00303 }
00304
00305 geBoolean Buffer_GetString(Buffer_Data *Buffer, uint8 *Str)
00306 {
00307 int32 i = 0;
00308 uint8 c = 0;
00309
00310 do
00311 {
00312 assert(Buffer->Pos+1 <= Buffer->Size);
00313
00314 c = Buffer->Data[Buffer->Pos++];
00315 Str[i++] = c;
00316 } while (c != -1 && c != 0);
00317
00318 return GE_TRUE;
00319 }
00320
00321 geBoolean Buffer_GetData(Buffer_Data *Buffer1, uint8 *Data, int32 Size)
00322 {
00323 int32 i;
00324
00325 assert(Buffer1->Pos + Size <= Buffer1->Size);
00326
00327 for (i=0; i< Size; i++)
00328 Data[i] = Buffer1->Data[Buffer1->Pos++];
00329
00330 return GE_TRUE;
00331 }
00332
00333 geBoolean Buffer_Set(Buffer_Data *Buffer, char *Data, int32 Size)
00334 {
00335 assert(Buffer);
00336
00337 Buffer->Data = Data;
00338 Buffer->Size = Size;
00339 Buffer->Pos = 0;
00340
00341 return GE_TRUE;
00342 }