Fixed a division-by-zero issue, and a couple of other minor things.
git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@3997 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
8421aff462
commit
bd44e87734
1 changed files with 35 additions and 15 deletions
|
@ -26,13 +26,23 @@ typedef struct
|
||||||
cam_t position[64];
|
cam_t position[64];
|
||||||
cam_t view[64];
|
cam_t view[64];
|
||||||
} camdata_t;
|
} camdata_t;
|
||||||
|
#define VER 1i /*bump when the above structs change*/
|
||||||
|
|
||||||
static camdata_t cdata;
|
|
||||||
static camdata_t *camdata;
|
static camdata_t *camdata;
|
||||||
static var float splinefile = -1;
|
static var float splinefile = -1;
|
||||||
static int edit_type = 0;
|
static var int edit_type = 0;
|
||||||
static vector submenu_position;
|
static vector submenu_position;
|
||||||
|
|
||||||
|
void(int *dest, int bytes) memclr =
|
||||||
|
{
|
||||||
|
bytes = bytes>>2i;
|
||||||
|
while(bytes > 0i)
|
||||||
|
{
|
||||||
|
bytes = bytes - 1i;
|
||||||
|
dest[bytes] = 0i;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
void() spline_init =
|
void() spline_init =
|
||||||
{
|
{
|
||||||
/*precache the shader*/
|
/*precache the shader*/
|
||||||
|
@ -46,6 +56,16 @@ void() spline_init =
|
||||||
}
|
}
|
||||||
|
|
||||||
camdata = (camdata_t*)(fgets(splinefile));
|
camdata = (camdata_t*)(fgets(splinefile));
|
||||||
|
|
||||||
|
if (!camdata)
|
||||||
|
error("unable to mmap spline.dat\n");
|
||||||
|
|
||||||
|
if (camdata->ver != VER)
|
||||||
|
{
|
||||||
|
print("spline.dat version is outdated, wiping.\n");
|
||||||
|
memclr ((int*)camdata, sizeof(camdata_t));
|
||||||
|
camdata->ver = VER;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
void() spline_shutdown =
|
void() spline_shutdown =
|
||||||
{
|
{
|
||||||
|
@ -264,22 +284,22 @@ vector(spline_t *s, float frac_time) spline_calculate_position =
|
||||||
if (s->numpoints == 3)// || (s->numpoints > 3 && s->type == 1))
|
if (s->numpoints == 3)// || (s->numpoints > 3 && s->type == 1))
|
||||||
{
|
{
|
||||||
t1 = 1-frac_time;
|
t1 = 1-frac_time;
|
||||||
t2 = pow(t1, s->numpoints - 1);
|
t2 = pow(t1, s->numpoints - 1i);
|
||||||
t3 = pow(frac_time, s->numpoints - 1);
|
t3 = pow(frac_time, s->numpoints - 1i);
|
||||||
|
|
||||||
for (i=0; i<s->numpoints; i++)
|
for (i=0; i<s->numpoints; i++)
|
||||||
{
|
{
|
||||||
if (i == 0)
|
if (i == 0i)
|
||||||
{
|
{
|
||||||
r = s->pos[i] * t2;
|
r = s->pos[i] * t2;
|
||||||
}
|
}
|
||||||
else if (i == s->numpoints - 1)
|
else if (i == s->numpoints - 1i)
|
||||||
{
|
{
|
||||||
r = r + s->pos[i] * t3;
|
r = r + s->pos[i] * t3;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
t4 = (s->numpoints-1) * pow(frac_time, i) * pow(t1, s->numpoints - 1 - i);
|
t4 = (s->numpoints-1i) * pow(frac_time, i) * pow(t1, s->numpoints - 1i - i);
|
||||||
r = r + s->pos[i] * t4;
|
r = r + s->pos[i] * t4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -291,7 +311,7 @@ vector(spline_t *s, float frac_time) spline_calculate_position =
|
||||||
{
|
{
|
||||||
// getting the start point -- might change if we add times to points
|
// getting the start point -- might change if we add times to points
|
||||||
// first point is always an entry point last point also
|
// first point is always an entry point last point also
|
||||||
t5 = 1 / (s->numpoints - 3);
|
t5 = 1 / (float)(s->numpoints - 3i);
|
||||||
for (i=1, t4=t5; t4<frac_time; t4 = t4 + t5)
|
for (i=1, t4=t5; t4<frac_time; t4 = t4 + t5)
|
||||||
{
|
{
|
||||||
i++;
|
i++;
|
||||||
|
@ -420,30 +440,30 @@ void(float attime) spline_overrides =
|
||||||
if (camdata->view_count == 0 || camdata->view_count < 0 || camdata->view_count > 64)
|
if (camdata->view_count == 0 || camdata->view_count < 0 || camdata->view_count > 64)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (i=0; i < camdata->position_count; i++)
|
for (i=0i; i < camdata->position_count; i=i+1i)
|
||||||
{
|
{
|
||||||
cpos = &camdata->position[i];
|
cpos = &camdata->position[i];
|
||||||
if (cpos->starttime <= attime && cpos->stoptime >= attime)
|
if (cpos->starttime <= attime && cpos->stoptime > attime)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i == camdata->position_count)
|
if (i == camdata->position_count)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (i=0; i < camdata->view_count; i++)
|
for (i=0i; i < camdata->view_count; i=i+1i)
|
||||||
{
|
{
|
||||||
cview = &camdata->view[i];
|
cview = &camdata->view[i];
|
||||||
if (cview->starttime <= attime && cview->stoptime >= attime)
|
if (cview->starttime <= attime && cview->stoptime > attime)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i == camdata->view_count)
|
if (i == camdata->view_count)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
stime = (attime - cpos->starttime) / (cpos->starttime - cpos->starttime);
|
stime = (attime - cpos->starttime) / (cpos->stoptime - cpos->starttime);
|
||||||
position = spline_calculate_position(&cpos->spline, stime);
|
position = spline_calculate_position(&cpos->spline, stime);
|
||||||
|
|
||||||
stime = (attime - cview->starttime) / (cview->starttime - cview->starttime);
|
stime = (attime - cview->starttime) / (cview->stoptime - cview->starttime);
|
||||||
view = spline_calculate_position(&cview->spline, stime);
|
view = spline_calculate_position(&cview->spline, stime);
|
||||||
|
|
||||||
setviewprop(VF_ORIGIN, position);
|
setviewprop(VF_ORIGIN, position);
|
||||||
|
|
Loading…
Reference in a new issue