/* ============ idAASSettings::ParseBool ============ */ bool idAASSettings::ParseBool( idLexer &src, bool &b ) { if ( !src.ExpectTokenString( "=" ) ) { return false; } b = src.ParseBool(); return true; }
/* ================ idDeclAF::ParseBody ================ */ bool idDeclAF::ParseBody( idLexer &src ) { bool hasJoint = false; idToken token; idAFVector angles; idDeclAF_Body *body = new idDeclAF_Body; bodies.Alloc() = body; body->SetDefault( this ); if ( !src.ExpectTokenType( TT_STRING, 0, &token ) || !src.ExpectTokenString( "{" ) ) { return false; } body->name = token; if ( !body->name.Icmp( "origin" ) || !body->name.Icmp( "world" ) ) { src.Error( "a body may not be named \"origin\" or \"world\"" ); return false; } while( src.ReadToken( &token ) ) { if ( !token.Icmp( "model" ) ) { if ( !src.ExpectTokenType( TT_NAME, 0, &token ) ) { return false; } if ( !token.Icmp( "box" ) ) { body->modelType = TRM_BOX; if ( !src.ExpectTokenString( "(" ) || !body->v1.Parse( src ) || !src.ExpectTokenString( "," ) || !body->v2.Parse( src ) || !src.ExpectTokenString( ")" ) ) { return false; } } else if ( !token.Icmp( "octahedron" ) ) { body->modelType = TRM_OCTAHEDRON; if ( !src.ExpectTokenString( "(" ) || !body->v1.Parse( src ) || !src.ExpectTokenString( "," ) || !body->v2.Parse( src ) || !src.ExpectTokenString( ")" ) ) { return false; } } else if ( !token.Icmp( "dodecahedron" ) ) { body->modelType = TRM_DODECAHEDRON; if ( !src.ExpectTokenString( "(" ) || !body->v1.Parse( src ) || !src.ExpectTokenString( "," ) || !body->v2.Parse( src ) || !src.ExpectTokenString( ")" ) ) { return false; } } else if ( !token.Icmp( "cylinder" ) ) { body->modelType = TRM_CYLINDER; if ( !src.ExpectTokenString( "(" ) || !body->v1.Parse( src ) || !src.ExpectTokenString( "," ) || !body->v2.Parse( src ) || !src.ExpectTokenString( "," ) ) { return false; } body->numSides = src.ParseInt(); if ( !src.ExpectTokenString( ")" ) ) { return false; } } else if ( !token.Icmp( "cone" ) ) { body->modelType = TRM_CONE; if ( !src.ExpectTokenString( "(" ) || !body->v1.Parse( src ) || !src.ExpectTokenString( "," ) || !body->v2.Parse( src ) || !src.ExpectTokenString( "," ) ) { return false; } body->numSides = src.ParseInt(); if ( !src.ExpectTokenString( ")" ) ) { return false; } } else if ( !token.Icmp( "bone" ) ) { body->modelType = TRM_BONE; if ( !src.ExpectTokenString( "(" ) || !body->v1.Parse( src ) || !src.ExpectTokenString( "," ) || !body->v2.Parse( src ) || !src.ExpectTokenString( "," ) ) { return false; } body->width = src.ParseFloat(); if ( !src.ExpectTokenString( ")" ) ) { return false; } } else if ( !token.Icmp( "custom" ) ) { src.Error( "custom models not yet implemented" ); return false; } else { src.Error( "unkown model type %s", token.c_str() ); return false; } } else if ( !token.Icmp( "origin" ) ) { if ( !body->origin.Parse( src ) ) { return false; } } else if ( !token.Icmp( "angles" ) ) { if ( !angles.Parse( src ) ) { return false; } body->angles = idAngles( angles.ToVec3().x, angles.ToVec3().y, angles.ToVec3().z ); } else if ( !token.Icmp( "joint" ) ) { if ( !src.ExpectTokenType( TT_STRING, 0, &token ) ) { return false; } body->jointName = token; hasJoint = true; } else if ( !token.Icmp( "mod" ) ) { if ( !src.ExpectAnyToken( &token ) ) { return false; } body->jointMod = JointModFromString( token.c_str() ); } else if ( !token.Icmp( "density" ) ) { body->density = src.ParseFloat(); } else if ( !token.Icmp( "inertiaScale" ) ) { src.Parse1DMatrix( 9, body->inertiaScale[0].ToFloatPtr() ); } else if ( !token.Icmp( "friction" ) ) { body->linearFriction = src.ParseFloat(); src.ExpectTokenString( "," ); body->angularFriction = src.ParseFloat(); src.ExpectTokenString( "," ); body->contactFriction = src.ParseFloat(); } else if ( !token.Icmp( "contents" ) ) { ParseContents( src, body->contents ); } else if ( !token.Icmp( "clipMask" ) ) { ParseContents( src, body->clipMask ); } else if ( !token.Icmp( "selfCollision" ) ) { body->selfCollision = src.ParseBool(); } else if ( !token.Icmp( "containedjoints" ) ) { if ( !src.ExpectTokenType( TT_STRING, 0, &token ) ) { return false; } body->containedJoints = token; } else if ( !token.Icmp( "frictionDirection" ) ) { if ( !body->frictionDirection.Parse( src ) ) { return false; } } else if ( !token.Icmp( "contactMotorDirection" ) ) { if ( !body->contactMotorDirection.Parse( src ) ) { return false; } } else if ( token == "}" ) { break; } else { src.Error( "unknown token %s in body", token.c_str() ); return false; } } if ( body->modelType == TRM_INVALID ) { src.Error( "no model set for body" ); return false; } if ( !hasJoint ) { src.Error( "no joint set for body" ); return false; } body->clipMask |= CONTENTS_MOVEABLECLIP; return true; }
/* ================ idDeclAF::ParseSettings ================ */ bool idDeclAF::ParseSettings( idLexer &src ) { idToken token; if ( !src.ExpectTokenString( "{" ) ) { return false; } while( src.ReadToken( &token ) ) { if ( !token.Icmp( "mesh" ) ) { if ( !src.ExpectTokenType( TT_STRING, 0, &token ) ) { return false; } } else if ( !token.Icmp( "anim" ) ) { if ( !src.ExpectTokenType( TT_STRING, 0, &token ) ) { return false; } } else if ( !token.Icmp( "model" ) ) { if ( !src.ExpectTokenType( TT_STRING, 0, &token ) ) { return false; } model = token; } else if ( !token.Icmp( "skin" ) ) { if ( !src.ExpectTokenType( TT_STRING, 0, &token ) ) { return false; } skin = token; } else if ( !token.Icmp( "friction" ) ) { defaultLinearFriction = src.ParseFloat(); if ( !src.ExpectTokenString( "," ) ) { return false; } defaultAngularFriction = src.ParseFloat(); if ( !src.ExpectTokenString( "," ) ) { return false; } defaultContactFriction = src.ParseFloat(); if ( src.CheckTokenString( "," ) ) { defaultConstraintFriction = src.ParseFloat(); } } else if ( !token.Icmp( "totalMass" ) ) { totalMass = src.ParseFloat(); } else if ( !token.Icmp( "suspendSpeed" ) ) { suspendVelocity[0] = src.ParseFloat(); if ( !src.ExpectTokenString( "," ) ) { return false; } suspendVelocity[1] = src.ParseFloat(); if ( !src.ExpectTokenString( "," ) ) { return false; } suspendAcceleration[0] = src.ParseFloat(); if ( !src.ExpectTokenString( "," ) ) { return false; } suspendAcceleration[1] = src.ParseFloat(); } else if ( !token.Icmp( "noMoveTime" ) ) { noMoveTime = src.ParseFloat(); } else if ( !token.Icmp( "noMoveTranslation" ) ) { noMoveTranslation = src.ParseFloat(); } else if ( !token.Icmp( "noMoveRotation" ) ) { noMoveRotation = src.ParseFloat(); } else if ( !token.Icmp( "minMoveTime" ) ) { minMoveTime = src.ParseFloat(); } else if ( !token.Icmp( "maxMoveTime" ) ) { maxMoveTime = src.ParseFloat(); } else if ( !token.Icmp( "contents" ) ) { ParseContents( src, contents ); } else if ( !token.Icmp( "clipMask" ) ) { ParseContents( src, clipMask ); } else if ( !token.Icmp( "selfCollision" ) ) { selfCollision = src.ParseBool(); } else if ( token == "}" ) { break; } else { src.Error( "unknown token %s in settings", token.c_str() ); return false; } } return true; }
/* ================ idDeclFX::ParseSingleFXAction ================ */ void idDeclFX::ParseSingleFXAction( idLexer &src, idFXSingleAction& FXAction ) { idToken token; FXAction.type = -1; FXAction.sibling = -1; FXAction.data = "<none>"; FXAction.name = "<none>"; FXAction.fire = "<none>"; FXAction.delay = 0.0f; FXAction.duration = 0.0f; FXAction.restart = 0.0f; FXAction.size = 0.0f; FXAction.fadeInTime = 0.0f; FXAction.fadeOutTime = 0.0f; FXAction.shakeTime = 0.0f; FXAction.shakeAmplitude = 0.0f; FXAction.shakeDistance = 0.0f; FXAction.shakeFalloff = false; FXAction.shakeImpulse = 0.0f; FXAction.shakeIgnoreMaster = false; FXAction.lightRadius = 0.0f; FXAction.rotate = 0.0f; FXAction.random1 = 0.0f; FXAction.random2 = 0.0f; FXAction.lightColor = vec3_origin; FXAction.offset = vec3_origin; FXAction.axis = mat3_identity; FXAction.bindParticles = false; FXAction.explicitAxis = false; FXAction.noshadows = false; FXAction.particleTrackVelocity = false; FXAction.trackOrigin = false; FXAction.soundStarted = false; while (1) { if ( !src.ReadToken( &token ) ) { break; } if ( !token.Icmp( "}" ) ) { break; } if ( !token.Icmp( "shake" ) ) { FXAction.type = FX_SHAKE; FXAction.shakeTime = src.ParseFloat(); src.ExpectTokenString(","); FXAction.shakeAmplitude = src.ParseFloat(); src.ExpectTokenString(","); FXAction.shakeDistance = src.ParseFloat(); src.ExpectTokenString(","); FXAction.shakeFalloff = src.ParseBool(); src.ExpectTokenString(","); FXAction.shakeImpulse = src.ParseFloat(); continue; } if ( !token.Icmp( "noshadows" ) ) { FXAction.noshadows = true; continue; } if ( !token.Icmp( "name" ) ) { src.ReadToken( &token ); FXAction.name = token; continue; } if ( !token.Icmp( "fire") ) { src.ReadToken( &token ); FXAction.fire = token; continue; } if ( !token.Icmp( "random" ) ) { FXAction.random1 = src.ParseFloat(); src.ExpectTokenString( "," ); FXAction.random2 = src.ParseFloat(); FXAction.delay = 0.0f; // check random continue; } if ( !token.Icmp( "delay" ) ) { FXAction.delay = src.ParseFloat(); continue; } if ( !token.Icmp( "rotate" ) ) { FXAction.rotate = src.ParseFloat(); continue; } if ( !token.Icmp( "duration" ) ) { FXAction.duration = src.ParseFloat(); continue; } if ( !token.Icmp( "trackorigin" ) ) { FXAction.trackOrigin = src.ParseBool(); continue; } if (!token.Icmp("restart")) { FXAction.restart = src.ParseFloat(); continue; } if ( !token.Icmp( "fadeIn" ) ) { FXAction.fadeInTime = src.ParseFloat(); continue; } if ( !token.Icmp( "fadeOut" ) ) { FXAction.fadeOutTime = src.ParseFloat(); continue; } if ( !token.Icmp( "size" ) ) { FXAction.size = src.ParseFloat(); continue; } if ( !token.Icmp( "offset" ) ) { FXAction.offset.x = src.ParseFloat(); src.ExpectTokenString( "," ); FXAction.offset.y = src.ParseFloat(); src.ExpectTokenString( "," ); FXAction.offset.z = src.ParseFloat(); continue; } if ( !token.Icmp( "axis" ) ) { idVec3 v; v.x = src.ParseFloat(); src.ExpectTokenString( "," ); v.y = src.ParseFloat(); src.ExpectTokenString( "," ); v.z = src.ParseFloat(); v.Normalize(); FXAction.axis = v.ToMat3(); FXAction.explicitAxis = true; continue; } if ( !token.Icmp( "angle" ) ) { idAngles a; a[0] = src.ParseFloat(); src.ExpectTokenString( "," ); a[1] = src.ParseFloat(); src.ExpectTokenString( "," ); a[2] = src.ParseFloat(); FXAction.axis = a.ToMat3(); FXAction.explicitAxis = true; continue; } if ( !token.Icmp( "uselight" ) ) { src.ReadToken( &token ); FXAction.data = token; for( int i = 0; i < events.Num(); i++ ) { if ( events[i].name.Icmp( FXAction.data ) == 0 ) { FXAction.sibling = i; FXAction.lightColor = events[i].lightColor; FXAction.lightRadius = events[i].lightRadius; } } FXAction.type = FX_LIGHT; // precache the light material declManager->FindMaterial( FXAction.data ); continue; } if ( !token.Icmp( "attachlight" ) ) { src.ReadToken( &token ); FXAction.data = token; FXAction.type = FX_ATTACHLIGHT; // precache it declManager->FindMaterial( FXAction.data ); continue; } if ( !token.Icmp( "attachentity" ) ) { src.ReadToken( &token ); FXAction.data = token; FXAction.type = FX_ATTACHENTITY; // precache the model renderModelManager->FindModel( FXAction.data ); continue; } if ( !token.Icmp( "launch" ) ) { src.ReadToken( &token ); FXAction.data = token; FXAction.type = FX_LAUNCH; // precache the entity def declManager->FindType( DECL_ENTITYDEF, FXAction.data ); continue; } if ( !token.Icmp( "useModel" ) ) { src.ReadToken( &token ); FXAction.data = token; for( int i = 0; i < events.Num(); i++ ) { if ( events[i].name.Icmp( FXAction.data ) == 0 ) { FXAction.sibling = i; } } FXAction.type = FX_MODEL; // precache the model renderModelManager->FindModel( FXAction.data ); continue; } if ( !token.Icmp( "light" ) ) { src.ReadToken( &token ); FXAction.data = token; src.ExpectTokenString( "," ); FXAction.lightColor[0] = src.ParseFloat(); src.ExpectTokenString( "," ); FXAction.lightColor[1] = src.ParseFloat(); src.ExpectTokenString( "," ); FXAction.lightColor[2] = src.ParseFloat(); src.ExpectTokenString( "," ); FXAction.lightRadius = src.ParseFloat(); FXAction.type = FX_LIGHT; // precache the light material declManager->FindMaterial( FXAction.data ); continue; } if ( !token.Icmp( "model" ) ) { src.ReadToken( &token ); FXAction.data = token; FXAction.type = FX_MODEL; // precache it renderModelManager->FindModel( FXAction.data ); continue; } if ( !token.Icmp( "particle" ) ) { // FIXME: now the same as model src.ReadToken( &token ); FXAction.data = token; FXAction.type = FX_PARTICLE; // precache it renderModelManager->FindModel( FXAction.data ); continue; } if ( !token.Icmp( "decal" ) ) { src.ReadToken( &token ); FXAction.data = token; FXAction.type = FX_DECAL; // precache it declManager->FindMaterial( FXAction.data ); continue; } if ( !token.Icmp( "particleTrackVelocity" ) ) { FXAction.particleTrackVelocity = true; continue; } if ( !token.Icmp( "sound" ) ) { src.ReadToken( &token ); FXAction.data = token; FXAction.type = FX_SOUND; // precache it declManager->FindSound( FXAction.data ); continue; } if ( !token.Icmp( "ignoreMaster" ) ) { FXAction.shakeIgnoreMaster = true; continue; } if ( !token.Icmp( "shockwave" ) ) { src.ReadToken( &token ); FXAction.data = token; FXAction.type = FX_SHOCKWAVE; // precache the entity def declManager->FindType( DECL_ENTITYDEF, FXAction.data ); continue; } src.Warning( "FX File: bad token" ); continue; } }