2017-09-08 09:24:16 -07:00
//
// trafficCar.js
//--------------------
// Provides multiple types of traffic.
// by RHY3756547
//
// includes:
// render stuff idk
//
window . ObjTruck = function ( obji , scene ) {
var obji = obji ;
var res = [ ] ;
var t = this ;
t . pos = vec3 . clone ( obji . pos ) ;
//t.angle = vec3.clone(obji.angle);
t . scale = vec3 . clone ( obji . scale ) ;
2019-06-09 15:50:55 -07:00
t . vel = vec3 . create ( ) ;
2017-09-08 09:24:16 -07:00
t . requireRes = requireRes ;
t . provideRes = provideRes ;
t . update = update ;
t . draw = draw ;
t . route = scene . paths [ obji . routeID ] ;
2019-06-09 15:50:55 -07:00
t . routeSpeed = 0.01 ;
t . unknown = ( obji . setting1 & 0xFFFF ) ;
t . routePos = ( obji . setting1 >> 16 ) ; //(obji.setting1&0xFFFF)%t.route.length;
t . variant = ( obji . setting2 & 0xFFFF ) ; //sets design for this car (from nsbtp)
t . variant2 = ( obji . setting2 >> 16 ) ; //0 or 1. unknown purpose
t . routePos = ( t . routePos + 1 ) % t . route . length ;
t . nodes = [
t . route [ ( t . routePos + t . route . length - 2 ) % t . route . length ] . pos ,
t . route [ ( t . routePos + t . route . length - 1 ) % t . route . length ] . pos ,
t . route [ t . routePos ] . pos ,
t . route [ ( t . routePos + 1 ) % t . route . length ] . pos
] ;
2017-09-08 09:24:16 -07:00
t . nextNode = t . route [ t . routePos ] ;
t . prevPos = t . pos ;
t . elapsedTime = 0 ;
var curNormal = [ 0 , 1 , 0 ] ;
2019-06-09 15:50:55 -07:00
var curFloorNormal = [ 0 , 1 , 0 ] ;
2017-09-08 09:24:16 -07:00
var floorNormal = [ 0 , 1 , 0 ] ;
2019-06-09 15:50:55 -07:00
//collision stuff
t . collidable = true ;
t . colMode = 0 ;
t . colRad = 512 ;
t . colFrame = 0 ;
t . moveWith = moveWith ;
t . getCollision = getCollision ;
var colRes ;
var dirVel = 0 ;
var prevMat ;
var curMat ;
var colMat = mat4 . create ( ) ;
prevMat = curMat ;
function setMat ( ) {
prevMat = curMat ;
var mat = mat4 . create ( ) ;
mat4 . translate ( mat , mat , t . pos ) ;
mat4 . scale ( mat , mat , vec3 . scale ( [ ] , t . scale , 16 ) ) ;
mat4 . mul ( mat , mat , mat4 . invert ( [ ] , mat4 . lookAt ( [ ] , [ 0 , 0 , 0 ] , curNormal , curFloorNormal ) ) ) ;
mat4 . scale ( colMat , mat , [ colRes . scale , colRes . scale , colRes . scale ] ) ;
t . colFrame ++ ;
curMat = mat ;
}
//end collision stuff
function cubic1D ( y0 , y1 , y2 , y3 , i ) {
var a0 , a1 , a2 , a3 , i2 ;
i2 = i * i ;
a0 = - 0.5 * y0 + 1.5 * y1 - 1.5 * y2 + 0.5 * y3 ;
a1 = y0 - 2.5 * y1 + 2 * y2 - 0.5 * y3 ;
a2 = - 0.5 * y0 + 0.5 * y2 ;
a3 = y1 ;
return ( a0 * i * i2 + a1 * i2 + a2 * i + a3 ) ;
}
function cubic3D ( points , i ) { //note: i is 0-1 between point 1 and 2. (0 and 3 are used to better define the curve)
var p0 = points [ 0 ] ;
var p1 = points [ 1 ] ;
var p2 = points [ 2 ] ;
var p3 = points [ 3 ] ;
return [
cubic1D ( p0 [ 0 ] , p1 [ 0 ] , p2 [ 0 ] , p3 [ 0 ] , i ) ,
cubic1D ( p0 [ 1 ] , p1 [ 1 ] , p2 [ 1 ] , p3 [ 1 ] , i ) ,
cubic1D ( p0 [ 2 ] , p1 [ 2 ] , p2 [ 2 ] , p3 [ 2 ] , i )
] ;
}
2017-09-08 09:24:16 -07:00
function update ( scene ) {
//simple behaviour, just follow the path! piece of cake.
2019-06-09 15:50:55 -07:00
//recalculate our route speed using a target real world speed.
var nextTime = t . elapsedTime + t . routeSpeed ;
for ( var i = 0 ; i < ( ( t . elapsedTime == 0 ) ? 3 : 1 ) ; i ++ ) {
if ( nextTime < 1 ) {
var targSpeed = 2 ;
var estimate = cubic3D ( t . nodes , nextTime ) ;
var estDistance = vec3 . dist ( estimate , t . pos ) ;
t . routeSpeed *= targSpeed / estDistance ; //correct
if ( t . routeSpeed > 0.2 ) t . routeSpeed = 0.2 ;
}
}
if ( t . routeSpeed <= 0 ) t . routeSpeed = 0.01 ;
2017-09-08 09:24:16 -07:00
t . elapsedTime += t . routeSpeed ;
2019-06-09 15:50:55 -07:00
var i = t . elapsedTime ;
var newPos = cubic3D ( t . nodes , i ) ; //vec3.lerp([], t.prevPos, t.nextNode.pos, i);
vec3 . sub ( t . vel , newPos , t . pos ) ;
t . pos = newPos ;
if ( t . elapsedTime >= 1 ) {
t . elapsedTime -= 1 ;
2017-09-08 09:24:16 -07:00
t . routePos = ( t . routePos + 1 ) % t . route . length ;
t . nextNode = t . route [ t . routePos ] ;
2019-06-09 15:50:55 -07:00
t . nodes . splice ( 0 , 1 ) ;
t . nodes . push ( t . route [ ( t . routePos + 1 ) % t . route . length ] . pos ) ;
t . routeSpeed = 0.25 ;
2017-09-08 09:24:16 -07:00
}
2019-06-09 15:50:55 -07:00
curNormal = vec3 . sub ( [ ] , t . prevPos , t . pos )
t . prevPos = vec3 . clone ( t . pos ) ;
2017-09-08 09:24:16 -07:00
vec3 . normalize ( curNormal , curNormal ) ;
2019-06-09 15:50:55 -07:00
if ( isNaN ( curNormal [ 0 ] ) ) curNormal = [ 0 , 0 , 1 ] ;
2017-09-08 09:24:16 -07:00
var spos = vec3 . clone ( t . pos ) ;
spos [ 1 ] += 32 ;
2019-06-09 15:50:55 -07:00
var result = lsc . raycast ( spos , [ 0 , - 100 , 0 ] , scene , 0.05 , [ ] ) ;
2017-09-08 09:24:16 -07:00
if ( result != null ) {
floorNormal = result . normal ;
} else {
floorNormal = [ 0 , 1 , 0 ] ;
}
2019-06-09 15:50:55 -07:00
var rate = 0.025 ;
curFloorNormal [ 0 ] += ( floorNormal [ 0 ] - curFloorNormal [ 0 ] ) * rate ;
curFloorNormal [ 1 ] += ( floorNormal [ 1 ] - curFloorNormal [ 1 ] ) * rate ;
curFloorNormal [ 2 ] += ( floorNormal [ 2 ] - curFloorNormal [ 2 ] ) * rate ;
vec3 . normalize ( curFloorNormal , curFloorNormal ) ;
setMat ( ) ;
2017-09-08 09:24:16 -07:00
}
function draw ( view , pMatrix ) {
var mat = mat4 . translate ( mat4 . create ( ) , view , t . pos ) ;
mat4 . scale ( mat , mat , vec3 . scale ( [ ] , t . scale , 16 ) ) ;
2019-06-09 15:50:55 -07:00
mat4 . mul ( mat , mat , mat4 . invert ( [ ] , mat4 . lookAt ( [ ] , [ 0 , 0 , 0 ] , curNormal , curFloorNormal ) ) ) ;
res . mdl [ 0 ] . setFrame ( t . variant ) ;
2017-09-08 09:24:16 -07:00
res . mdl [ 0 ] . draw ( mat , pMatrix ) ;
}
function requireRes ( ) { //scene asks what resources to load
switch ( obji . ID ) {
case 0x019A :
2019-06-09 15:50:55 -07:00
return { mdl : [ { nsbmd : "car_a.nsbmd" } ] , other : [ "car_a.nsbtp" ] } ; //one model, car
2017-09-08 09:24:16 -07:00
case 0x019C :
2019-06-09 15:50:55 -07:00
return { mdl : [ { nsbmd : "truck_a.nsbmd" } ] , other : [ "truck_a.nsbtp" ] } ; //one model, truck
2017-09-08 09:24:16 -07:00
case 0x0195 :
return { mdl : [ { nsbmd : "bus_a.nsbmd" } ] } ; //one model, bus
}
}
2019-06-09 15:50:55 -07:00
function moveWith ( obj ) { //used for collidable objects that move.
//the most general way to move something with an object is to multiply its position by the inverse mv matrix of that object, and then the new mv matrix.
vec3 . transformMat4 ( obj . pos , obj . pos , mat4 . invert ( [ ] , prevMat ) )
vec3 . transformMat4 ( obj . pos , obj . pos , curMat ) ;
}
function getCollision ( ) {
return { tris : colRes . dat , mat : colMat , frame : t . colFrame } ;
}
2017-09-08 09:24:16 -07:00
function provideRes ( r ) {
res = r ; //...and gives them to us. :)
2019-06-09 15:50:55 -07:00
if ( r . other != null ) {
if ( r . other . length > 0 && r . other [ 0 ] != null ) {
res . mdl [ 0 ] . loadTexPAnim ( r . other [ 0 ] ) ;
}
}
colRes = res . mdl [ 0 ] . getBoundingCollisionModel ( 0 , 0 ) ;
for ( var i = 0 ; i < colRes . dat . length ; i ++ ) {
colRes . dat [ i ] . CollisionType = MKDS _COLTYPE . KNOCKBACK _DAMAGE << 8 ;
}
2017-09-08 09:24:16 -07:00
}
}
window . ObjCar = ObjTruck ;
window . ObjBus = ObjTruck ;