can someone point me to a formula to quickly convert a float decimal vlaue to the screen's 4-bit decimal value. it should make things move smoother onscreen. i guess its kind of complex, because it depends how precise the decimal is.
float
to
GS_XYZ->x
3d world float to screen float
ok, lets work it out.
4bits holds 16 digits: 0-15
the GS says '15' = '.9375'
so '0001' = .9375 / 15
so '0001' = '.625'
now let do the float:
we divide 1.0f into 15 parts
so 1.0 / 15 = 0.066666666666666666666666666666667
lets just say 0.066
so when the worldscreen float have a decimal of '.066' then the screen decimal should have a value of '0001'(.625)
i think we are ready to convert it
1st we extract decimal number from our worldscreen flaot like this:
float f = 58.8686464...;
int intpart = (int) f;
float decpart = f - intpart;
then calculate our final screen 4 bit decimal like this:
int screen_xy_4bit_decimal = (int) (decpart / 0.066)
i thnk that should do it.
.
anyone think this doesnt work ?
4bits holds 16 digits: 0-15
the GS says '15' = '.9375'
so '0001' = .9375 / 15
so '0001' = '.625'
now let do the float:
we divide 1.0f into 15 parts
so 1.0 / 15 = 0.066666666666666666666666666666667
lets just say 0.066
so when the worldscreen float have a decimal of '.066' then the screen decimal should have a value of '0001'(.625)
i think we are ready to convert it
1st we extract decimal number from our worldscreen flaot like this:
float f = 58.8686464...;
int intpart = (int) f;
float decpart = f - intpart;
then calculate our final screen 4 bit decimal like this:
int screen_xy_4bit_decimal = (int) (decpart / 0.066)
i thnk that should do it.
.
anyone think this doesnt work ?
There is a much eaiser way to do this.
From here
The reason this works is because you want to keep 4 bits of the fraction portion of your float. Shifting 4 bits left is equal to multiplying by 16. So by multiplying your float with 16, you get 4 more bits in your int (when you cast it), which equal the fraction part.
On the VU1 you can use the FTOI4 instruction to do this for you.
Code: Select all
#define FTOI4(x) ((int)((x)*16.0f))
The reason this works is because you want to keep 4 bits of the fraction portion of your float. Shifting 4 bits left is equal to multiplying by 16. So by multiplying your float with 16, you get 4 more bits in your int (when you cast it), which equal the fraction part.
On the VU1 you can use the FTOI4 instruction to do this for you.
nice and simple
:)
you are right:
if i have a float value of 123.45
then: 123.45 * 16.0 = 1975 (bin:11110110111)
if you cut off the last 4 bit you get : '1111011'
which brings us back to the whole number of '123'
and if you check the last 4 bits that we cut off is == 7 witch is about 0.45
THIS IS TOO COOL
.
:)
you are right:
if i have a float value of 123.45
then: 123.45 * 16.0 = 1975 (bin:11110110111)
if you cut off the last 4 bit you get : '1111011'
which brings us back to the whole number of '123'
and if you check the last 4 bits that we cut off is == 7 witch is about 0.45
THIS IS TOO COOL
.