29 #ifdef __LITTLE_ENDIAN__
50 if (!fread(mdd_head,
sizeof(*mdd_head), 1, fp)) {
51 *err_str =
"Missing header";
55 #ifdef __LITTLE_ENDIAN__
60 *err_str =
"Vertex count mismatch";
65 *err_str =
"Invalid frame total";
102 const char **err_str)
106 float f_time, f_time_prev = FLT_MAX;
113 size_t num_frames_read = 0;
114 size_t num_frames_expect = mdd_head.
frame_tot;
116 for (i = 0; i < mdd_head.
frame_tot; i++) {
117 num_frames_read += fread(&f_time,
sizeof(
float), 1, fp);
118 #ifdef __LITTLE_ENDIAN__
121 if (f_time >=
time) {
122 num_frames_expect = i + 1;
125 f_time_prev = f_time;
128 if (num_frames_read != num_frames_expect) {
129 *err_str = errno ? strerror(errno) :
"Timestamp read failed";
136 if (
UNLIKELY(f_time_prev == FLT_MAX)) {
140 const float range = f_time - f_time_prev;
146 frame = (
float)(i - 1) + ((
time - f_time_prev) / range);
155 float (*vertexCos)[3],
159 const char **err_str)
168 *err_str =
"Header seek failed";
173 *err_str =
"Failed to seek frame";
177 size_t num_verts_read = 0;
179 if (factor >= 1.0f) {
181 float *vco = *vertexCos;
183 for (i = mdd_head.
verts_tot; i != 0; i--, vco += 3) {
184 num_verts_read += fread(vco,
sizeof(
float[3]), 1, fp);
186 # ifdef __LITTLE_ENDIAN__
194 if (!fread(vertexCos,
sizeof(
float[3]), mdd_head.
verts_tot, f)) {
195 *err_str = errno ? strerror(errno) :
"Failed to read frame";
198 # ifdef __LITTLE_ENDIAN__
204 const float ifactor = 1.0f - factor;
205 float *vco = *vertexCos;
207 for (i = mdd_head.
verts_tot; i != 0; i--, vco += 3) {
209 num_verts_read += fread(tvec,
sizeof(
float[3]), 1, fp);
211 #ifdef __LITTLE_ENDIAN__
217 vco[0] = (vco[0] * ifactor) + (tvec[0] * factor);
218 vco[1] = (vco[1] * ifactor) + (tvec[1] * factor);
219 vco[2] = (vco[2] * ifactor) + (tvec[2] * factor);
223 if (num_verts_read != mdd_head.
verts_tot) {
224 *err_str = errno ? strerror(errno) :
"Vertex coordinate read failed";
232 float (*vertexCos)[3],
236 const char **err_str)
251 if (index_range[0] == index_range[1]) {
273 float (*vertexCos)[3],
278 const char time_mode,
279 const char **err_str)
287 *err_str = errno ? strerror(errno) :
"Unknown error opening file";
typedef float(TangentPoint)[2]
void BLI_endian_switch_int32_array(int *val, const int size) ATTR_NONNULL(1)
void BLI_endian_switch_float_array(float *val, const int size) ATTR_NONNULL(1)
BLI_INLINE void BLI_endian_switch_float(float *val) ATTR_NONNULL(1)
File and directory operations.
int BLI_fseek(FILE *stream, int64_t offset, int whence)
FILE * BLI_fopen(const char *filename, const char *mode) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Compatibility-like things for windows.
@ MOD_MESHCACHE_TIME_FRAME
@ MOD_MESHCACHE_TIME_FACTOR
@ MOD_MESHCACHE_TIME_SECONDS
bool MOD_meshcache_read_mdd_times(const char *filepath, float(*vertexCos)[3], const int verts_tot, const char interp, const float time, const float fps, const char time_mode, const char **err_str)
bool MOD_meshcache_read_mdd_frame(FILE *fp, float(*vertexCos)[3], const int verts_tot, const char interp, const float frame, const char **err_str)
static bool meshcache_read_mdd_range_from_time(FILE *fp, const int verts_tot, const float time, const float UNUSED(fps), float *r_frame, const char **err_str)
static bool meshcache_read_mdd_range(FILE *fp, const int verts_tot, const float frame, const char interp, int r_index_range[2], float *r_factor, const char **err_str)
bool MOD_meshcache_read_mdd_index(FILE *fp, float(*vertexCos)[3], const int verts_tot, const int index, const float factor, const char **err_str)
static bool meshcache_read_mdd_head(FILE *fp, const int verts_tot, MDDHead *mdd_head, const char **err_str)
void MOD_meshcache_calc_range(const float frame, const char interp, const int frame_tot, int r_index_range[2], float *r_factor)
ccl_device_inline float2 interp(const float2 &a, const float2 &b, float t)