// draw a water-hugging sprite; rotate the texture first // Bucket * RenderWaterSprite( const Vector & origin, F32 radius, const Vector &front, const Bitmap *texture, Color color, U32 blend, UVPair uv0, UVPair uv1, UVPair uv2, U16 sorting) // UVPair(0.0f,1.0f), UVPair(1.0f,1.0f), UVPair(1.0f,0.0f) { Vector f = front; f.y =0.0f; f.Normalize(); Matrix m; m.ClearData(); m.SetFromFront( f); F32 du = (F32) fabs(uv2.u + uv0.u) * 0.5f; F32 dv = (F32) fabs(uv2.v + uv0.v) * 0.5f; uv0.u -= du; uv0.v -= dv; uv1.u -= du; uv1.v -= dv; uv2.u -= du; uv2.v -= dv; m.Rotate( uv0); m.Rotate( uv1); m.Rotate( uv2); uv0.u += du; uv0.v += dv; uv1.u += du; uv1.v += dv; uv2.u += du; uv2.v += dv; return RenderWaterSprite( origin, radius, texture, color, blend, uv0, uv1, uv2, sorting); }
static void Handler(U32 pathCrc) { if (Var::lockout) { return; } char * s1 = NULL; switch (pathCrc) { /* VarSys::CreateInteger("mesh.load.terrmipcount", 4, VarSys::NOTIFY, &Var::terrMipCount); */ case 0xB8DA60B2: // "mesh.anim.blendtime" renderState.animBlendTime = Var::animBlendTime; break; case 0x54135A94: // "mesh.load.mipcount" renderState.mipCount = Var::mipCount; break; case 0xF8D50B70: // "mesh.load.mipmin" renderState.mipMin = Var::mipMin; break; case 0xD4D8592F: // "mesh.load.scale" renderState.scaleFactor = Var::scaleFactor; break; case 0x8D87963B: // "mesh.load.mrmgen" renderState.status.mrmGen = Var::doMrmGen; break; case 0xA3B49A76: // "mesh.show.overlaymip" renderState.status.overlayMip = Var::showOverlayMip; break; case 0xDB6B49D2: // "mesh.show.shadow" renderState.status.showShadows = Var::showShadows; break; case 0x5BD45BD5: // "mesh.show.overlay" renderState.status.overlay = Var::showOverlay; break; case 0x106657EA: // "mesh.show.envmap" renderState.status.envmap = Var::showEnvMap; break; case 0x8D408543: // "mesh.show.hardpoints" renderState.status.showPoints = Var::showHardPoints; break; case 0xF866E28F: // "mesh.show.origin" renderState.status.showOrigin = Var::showOrigin; break; case 0x3067FEC3: // "mesh.show.normals" renderState.status.showNormals = Var::showNormals; break; case 0xE0D39344: // "mesh.show.bounds" renderState.status.showBounds = Var::showBounds; break; case 0x4D511DA8: // "mesh.show.multiweight" renderState.status.multiWeight = Var::doMultiWeight; break; case 0xFA861318: // "mesh.show.interpolation" renderState.status.interpMesh = Var::doInterpolate; break; case 0x26AC80A3: // "mesh.mrm.active" renderState.status.mrm = Var::doMRM; if (!*Var::doMRM) { // restore all meshes to max vertex count Mesh::Manager::FullResList(); } break; case 0xEF4F617A: // "mesh.toggle.mrm" Var::doMRM = !*Var::doMRM; break; case 0x6E2078E8: // "mesh.mrm.auto.active" renderState.status.mrmAuto = Var::mrmAuto; break; case 0x115B9E22: // "mesh.mrm.factor" renderState.mrmFactor1 = Var::mrmFactor; break; case 0x0783E3A9: // "mesh.mrm.distance" renderState.mrmDist = Var::mrmDist; break; /* VarSys::CreateInteger("mesh.mrm.auto.low", low, VarSys::NOTIFY, &Var::mrmLow)->SetIntegerRange(1, 100000); VarSys::CreateInteger("mesh.mrm.auto.high", high, VarSys::NOTIFY, &Var::mrmHigh)->SetIntegerRange(1, 100000); VarSys::CreateFloat("mesh.mrm.auto.constant1", 0.1f, VarSys::NOTIFY, &Var::mrmAutoConstant1); VarSys::CreateFloat("mesh.mrm.auto.constant2", 0.00002f, VarSys::NOTIFY, &Var::mrmAutoConstant2); VarSys::CreateFloat("mesh.mrm.auto.constant3", 0.01f, VarSys::NOTIFY, &Var::mrmAutoConstant3); */ case 0xD1598EAB: // "mesh.toggle.weighting" Var::doMultiWeight = !*Var::doMultiWeight; break; case 0x2768304F: // "mesh.toggle.basepose" Var::doBasePose = !*Var::doBasePose; break; case 0x7081F6C1: // "mesh.toggle.interpolation" Var::doInterpolate = !*Var::doInterpolate; break; case 0x7F22B644: // "mesh.toggle.bounds" Var::showBounds = !*Var::showBounds; break; case 0xDC1078E0: // "mesh.toggle.normals" Var::showNormals = !*Var::showNormals; break; case 0x337EB398: // "mesh.toggle.hardpoints" Var::showHardPoints = !*Var::showHardPoints; break; case 0x792562E7: // "mesh.toggle.origins" Var::showOrigin = !*Var::showOrigin; break; case 0x5790E329: // "mesh.light.quick" renderState.status.lightQuick = Var::lightQuick; Mesh::Manager::SetupRenderProcList(); break; case 0x04149DC1: // "mesh.light.single" renderState.status.lightSingle = Var::lightSingle; break; case 0x18DC25F5: // "mesh.shadow.fadedepth" case 0xE268DB72: // "mesh.shadow.fadedist" renderState.shadowFadeDist = Vid::Math::farPlane * *Var::varShadowFadeDist; renderState.shadowFadeDepthInv = 1 / ((Vid::Math::farPlane - Vid::renderState.shadowFadeDist) * *Var::varShadowFadeDepth); break; case 0x71AFCDF2: // "mesh.shadow.fadecutoff" renderState.shadowFadeCutoff = *Var::varShadowFadeCutoff; break; case 0xF6C26D5A: // "mesh.shadow.y" renderState.shadowY = Var::shadowY; break; case 0xB3474136: // "mesh.shadow.size" renderState.texShadowSize = Var::varShadowSize; break; case 0xAC7D07DF: // "mesh.shadow.nightcolor" { S32 r = 255, g = 255, b = 255, a = 88; Console::GetArgInteger(1, r); Console::GetArgInteger(2, g); Console::GetArgInteger(3, b); Console::GetArgInteger(4, a); nightLightColor.Set( r, g, b, a); break; } case 0xA3E7812D: // "mesh.color.team" renderState.teamColor = *Var::teamColor; if (Mesh::Manager::curEnt) { Mesh::Manager::curParent->SetTeamColor( (Color) *Var::teamColor); } break; case 0x263E1AA9: // "mesh.color.envalpha" renderState.envAlpha = Var::envAlpha; break; case 0x7E8D6042: // "mesh.color.shadowalpha" renderState.shadowAlpha = Var::shadowAlpha; Vid::Light::SetupShadow(); break; // utility // case 0x0C39A9C1: // "mesh.envmap" if (Console::GetArgString( 1, s1)) { Bitmap * map = Bitmap::Manager::Find( s1); if (map) { Mesh::Manager::envMap = map; } } else { CON_DIAG(("envmap = %s", Mesh::Manager::envMap ? Mesh::Manager::envMap->GetName() : "null")); } break; case 0x46BDAA81: // "mesh.color.alpha" case 0x05D592EA: // "mesh.color.base" if (Mesh::Manager::curEnt) { Color color = Var::baseColor; color.a = (U8)Var::alphaColor; Mesh::Manager::curParent->SetBaseColor( color); Mesh::Manager::curParent->SetFogTarget( 255, color.a, TRUE); } break; case 0x7AF1FC7D: // "mesh.diffuse" { F32 f1; if (Console::GetArgFloat(1, f1)) { if (f1 < 0.1f) { f1 = 0.1f; } else if (f1 > 1.0f) { f1 = 1.0f; } Material::Manager::SetDiffuse( f1); } else { CON_DIAG(("diffuse = %.2f", Material::Manager::diffuseVal)) } break; } case 0xD3BE61C1: // "mesh.report" Console::GetArgString(1, s1); Mesh::Manager::ReportList( s1); break; case 0xAA7BD58D: // "mesh.dump.heirarchy" if (Mesh::Manager::curEnt) { Mesh::Manager::curEnt->LogHierarchy(); } break; case 0xEC368032: // "mesh.dump.offsetall" if (Mesh::Manager::curEnt) { Mesh::Manager::curEnt->DumpHierarchy(); } break; case 0x9AC2B5EA: // "mesh.dump.offset" if (Mesh::Manager::curEnt && Console::GetArgString( 1, s1)) { FamilyNode * n1 = Mesh::Manager::curEnt->FindLocal( s1); if (n1 && n1 != Mesh::Manager::curEnt) { FamilyNode * n2 = Mesh::Manager::curEnt; char * s2; if (Console::GetArgString( 2, s2)) { FamilyNode * n = Mesh::Manager::curEnt->FindLocal( s2); if (n) { n2 = n; } } Matrix matrix; matrix.ClearData(); n2->FindOffsetLocal( n1, matrix); CON_DIAG(("")); CON_DIAG(("right %f,%f,%f", matrix.right.x, matrix.right.y, matrix.right.z)); CON_DIAG(("up %f,%f,%f", matrix.up.x, matrix.up.y, matrix.up.z)); CON_DIAG(("front %f,%f,%f", matrix.front.x, matrix.front.y, matrix.front.z)); CON_DIAG(("posit %f,%f,%f", matrix.posit.x, matrix.posit.y, matrix.posit.z)); break; } } CON_DIAG(("app.offset [dstnode] [opt:srcnode]")); break; } }