Build 12 update
NOTE: There's a critical bug in Linux where failed loading operations crash the game instead of printing a 'file not found' warning.
It's been there for ages and will take a while to figure out what's going on, sorry about that.
Added _Reciprocal SSE method as ASM and ASMLINUX, speeds up trace code.
(Linux) Ported _appInvsqrt SSE method to ASMLINUX
(Linux) Removed linking to __Context::Env symbol, works on all v436 builds now.
FCollisionCacus review:
- Unified AddActor code for movers and normal actors.
- Nodes won't create child nodes if it has less than 3 actors.
- Encroachment checks are faster
- Fixed integer rounding issue causing actors to be placed in incorrect nodes (inreasing depth).
- Fixed AddActor code adding Movers to incorrect nodes.
- Added OctreeDebug command.
-- OctreeDebug Name=ActorName
-- Prints relevant info regarding an actor in the octree.
Fixed CollidingActors iterator.
Announcer, Credits packages won't cause mismatches when attempting to play a demo.
Boss mesh now has audible footsteps on Strafe and Backrun animations.
Removed PackageMap command.
XC_ServerActor: Nexgen administrators don't need an admin password when doing "AdminLogin" (default=enabled)
Rewritten XC_TravelManager
- No longer accessible as an Object.
- Item info continues to be held for all (present and non-present) player for as long as the coop chain isn't broken.
- Fixed v451 Linux garbage collector crash.
- Can receive 'TravelUpdate' console commands, forces a global travel list update manually.
Rewritten XC_TimeManager
- Is now a separate object, referenced global variable.
- Can receive 'TimeFactor' console command if timing fix is enabled, displays the current time factor in level update.
- Better behaviour after map switch.
I want to thank {HoF} clan for providing betatesting and bearing with me
.
Also, a couple of things that might useful for someone... somewhere.
ASM Reciprocal using Intel and Extended GNU Assembler syntaxes, this crap builds on GCC 2.95 lol.
Code: Select all
inline FLOAT _Reciprocal( FLOAT F)
{
#if ASM
FLOAT z;
__asm
{
rcpss xmm0, F // x0: z ~= 1/x
movss xmm2, F // x2: x
movss xmm1, xmm0 // x1: z ~= 1/x
addss xmm0, xmm0 // x0: 2z
mulss xmm1, xmm1 // x1: z^2
mulss xmm1, xmm2 // x1: xz^2
subss xmm0, xmm1 // x0: z' ~= 1/x to 0.000012%
movss z, xmm0
}
return z;
#elif ASMLINUX
//Higor: finally got this working on GCC 2.95
FLOAT z;
__asm__ __volatile__("rcpss %0,%%xmm0\n"
"movss %0,%%xmm2\n"
"movss %%xmm0,%%xmm1\n"
"addss %%xmm0,%%xmm0\n"
"mulss %%xmm1,%%xmm1\n"
"mulss %%xmm2,%%xmm1\n"
"subss %%xmm1,%%xmm0\n" : : "m" (F) );
__asm__ __volatile__("movss %%xmm0,%0\n" : "=m" (z) );
return z;
#else
return 1.f/F; //ALL ABOARD THE SLOW TRAIN
#endif
}
And the InvQrt from Unreal Engine adapted to Extended GNU Assembler as well.
Code: Select all
inline FLOAT _appInvSqrt( FLOAT F )
{
#if ASM
const FLOAT fThree = 3.0f;
const FLOAT fOneHalf = 0.5f;
FLOAT temp;
__asm
{
movss xmm1,[F]
rsqrtss xmm0,xmm1 // 1/sqrt estimate (12 bits)
// Newton-Raphson iteration (X1 = 0.5*X0*(3-(Y*X0)*X0))
movss xmm3,[fThree]
movss xmm2,xmm0
mulss xmm0,xmm1 // Y*X0
mulss xmm0,xmm2 // Y*X0*X0
mulss xmm2,[fOneHalf] // 0.5*X0
subss xmm3,xmm0 // 3-Y*X0*X0
mulss xmm3,xmm2 // 0.5*X0*(3-Y*X0*X0)
movss [temp],xmm3
}
return temp;
#elif ASMLINUX
//Higor: finally got this working on GCC 2.95
const FLOAT fThree = 3.0f;
const FLOAT fOneHalf = 0.5f;
FLOAT temp;
__asm__ __volatile__("movss %0,%%xmm1\n"
"rsqrtss %%xmm1,%%xmm0\n"
"movss %1,%%xmm3\n"
"movss %%xmm0,%%xmm2\n"
"mulss %%xmm1,%%xmm0\n"
"mulss %%xmm2,%%xmm0\n"
"mulss %2,%%xmm2\n"
"subss %%xmm0,%%xmm3\n"
"mulss %%xmm2,%%xmm3\n" : : "m" (F), "m" (fThree), "m" (fOneHalf) );
__asm__ __volatile__("movss %%xmm3,%0\n" : "=m" (temp) );
return temp;
#else
return 1.0f / appSqrt( F);
#endif
}