00001 #include <cl.h>
00002
00003 #define _CL_FWRITE(ptr, size, nmemb, stream) \
00004 do { \
00005 if ((fwrite((ptr), (size), (nmemb), (stream)) * (size)) \
00006 < ((nmemb) * (size))) \
00007 return GL_FALSE; \
00008 } while(0)
00009
00010
00011
00012
00013
00014
00015 bool clWriteColour(const CLcolour* src, FILE* file)
00016 {
00017 if (!src)
00018 return GL_FALSE;
00019
00020 _CL_FWRITE(src, sizeof(CLcolour), 1, file);
00021
00022 return GL_TRUE;
00023 }
00024
00025 bool clWriteVertex(const CLvertex* src, FILE* file)
00026 {
00027 if (!src)
00028 return GL_FALSE;
00029
00030 _CL_FWRITE(src, sizeof(CLvertex), 1, file);
00031
00032 return GL_TRUE;
00033 }
00034
00035 bool clWriteNormal(const CLnormal* src, FILE* file)
00036 {
00037 if (!src)
00038 return GL_FALSE;
00039
00040 _CL_FWRITE(src, sizeof(CLnormal), 1, file);
00041
00042 return GL_TRUE;
00043 }
00044
00045 bool clWriteTexCoord(const CLtexcoord* src, FILE* file)
00046 {
00047 if (!src)
00048 return GL_FALSE;
00049
00050 _CL_FWRITE(src, sizeof(CLtexcoord), 1, file);
00051
00052 return GL_TRUE;
00053 }
00054
00055 bool clWriteEdgeFlag(const CLedgeflag* src, FILE* file)
00056 {
00057 if (!src)
00058 return GL_FALSE;
00059
00060 _CL_FWRITE(src, sizeof(CLedgeflag), 1, file);
00061
00062 return GL_TRUE;
00063 }
00064
00065 bool clWriteMatrix(const CLmatrix* src, FILE* file)
00066 {
00067 if (!src)
00068 return GL_FALSE;
00069
00070 _CL_FWRITE(src, sizeof(CLmatrix), 1, file);
00071
00072 return GL_TRUE;
00073 }
00074
00075 bool clWriteImage(const CLimage* src, FILE* file)
00076 {
00077 if (!src)
00078 return GL_FALSE;
00079
00080 _CL_FWRITE(src, sizeof(CLimage), 1, file);
00081 _CL_FWRITE(src->data, clImageDataSize(src), 1, file);
00082
00083 return GL_TRUE;
00084 }
00085
00086 bool clWriteLight(const CLlight* src, FILE* file)
00087 {
00088 if (!src)
00089 return GL_FALSE;
00090
00091 _CL_FWRITE(src, sizeof(CLlight), 1, file);
00092
00093 return GL_TRUE;
00094 }
00095
00096 bool clWriteMaterial(const CLmaterial* src, FILE* file)
00097 {
00098 if (!src)
00099 return GL_FALSE;
00100
00101 _CL_FWRITE(src, sizeof(CLmaterial), 1, file);
00102
00103 return GL_TRUE;
00104 }
00105
00106 bool clWriteTexture(const CLtexture* src, FILE* file)
00107 {
00108 if (!src)
00109 return GL_FALSE;
00110
00111 _CL_FWRITE(src, sizeof(CLtexture), 1, file);
00112 _CL_FWRITE(src->image.data, clImageDataSize(&src->image), 1, file);
00113
00114 return GL_TRUE;
00115 }
00116
00117 bool clWritePrimitiveSet(const CLprimitiveset* src, FILE* file)
00118 {
00119 if (!src)
00120 return GL_FALSE;
00121
00122 _CL_FWRITE(src, sizeof(CLprimitiveset), 1, file);
00123 _CL_FWRITE(src->indices, sizeof(GLuint), src->num_indices, file);
00124
00125 return GL_TRUE;
00126 }
00127
00128
00129
00130
00131
00132
00133
00134 bool clWriteMesh(const CLmesh* src, FILE* file)
00135 {
00136 GLuint i;
00137
00138 if (!src)
00139 return GL_FALSE;
00140
00141 _CL_FWRITE(src, sizeof(CLmesh), 1, file);
00142
00143 if (src->colour)
00144 if (!(clWriteColour(src->colour, file)))
00145 return GL_FALSE;
00146
00147 _CL_FWRITE(src->vertices, sizeof(CLvertex), src->num_vertices, file);
00148
00149 if (src->colours)
00150 _CL_FWRITE(src->colours, sizeof(CLcolour), src->num_vertices, file);
00151
00152 if (src->normals)
00153 _CL_FWRITE(src->normals, sizeof(CLnormal), src->num_vertices, file);
00154
00155 if (src->texcoords)
00156 _CL_FWRITE(src->texcoords, sizeof(CLtexcoord), src->num_vertices, file);
00157
00158 if (src->edgeflags)
00159 _CL_FWRITE(src->edgeflags, sizeof(CLedgeflag), src->num_vertices, file);
00160
00161 for (i = 0; i < src->num_primitivesets; i++)
00162 if (!(clWritePrimitiveSet(src->primitivesets[i], file)))
00163 return GL_FALSE;
00164
00165 return GL_TRUE;
00166 }
00167
00168 bool clWriteContext(const CLcontext* src, FILE* file)
00169 {
00170 GLuint i;
00171
00172 if (!src)
00173 return GL_FALSE;
00174
00175 _CL_FWRITE(src, sizeof(CLcontext), 1, file);
00176
00177 for (i = 0; i < src->num_materials; i++)
00178 if (!(clWriteMaterial(src->materials[i], file)))
00179 return GL_FALSE;
00180
00181 for (i = 0; i < src->num_textures; i++)
00182 if (!(clWriteTexture(src->textures[i], file)))
00183 return GL_FALSE;
00184
00185 for (i = 0; i < src->num_lights; i++)
00186 if (!(clWriteLight(src->lights[i], file)))
00187 return GL_FALSE;
00188
00189 for (i = 0; i < src->num_models; i++)
00190 if (!(clWriteModel(src->models[i], file)))
00191 return GL_FALSE;
00192
00193 return GL_TRUE;
00194 }
00195
00197 bool clWriteModel(const CLmodel* src, FILE* file)
00198 {
00199 GLuint i;
00200
00201 if (!src)
00202 return GL_FALSE;
00203
00204 _CL_FWRITE(src, sizeof(CLmodel), 1, file);
00205
00206 for (i = 0; i < src->num_meshes; i++)
00207 {
00208 if (!(clWriteMesh(src->meshes[i], file)))
00209 return GL_FALSE;
00210 }
00211 return GL_TRUE;
00212 }