private void UpdateSurfaceDetection(int gameTime) { if (gameTime - lastParticleShapeTestTime > 1200) { var str = ShapeTestEx.RunShapeTest(_position + Vector3.WorldUp * 10.0f, _position + Vector3.WorldDown * 10.0f, null, IntersectOptions.Everything); if (str.HitMaterial != lastMaterialTraversed) { switch (lastMaterialTraversed) { case materials.sand_track: case materials.sand_compact: case materials.sand_dry_deep: case materials.sand_loose: case materials.sand_wet: case materials.sand_wet_deep: { particleColorPrev = particleColor; particleColorGoal = Color.NavajoWhite; particleLerpTime = 0.0f; } break; default: particleColorPrev = particleColor; particleColorGoal = Color.Black; particleLerpTime = 0.0f; break; } lastMaterialTraversed = str.HitMaterial; } lastParticleShapeTestTime = gameTime; } if (particleLerpTime < 1.0f) { particleLerpTime += Game.LastFrameTime / ColorLerpDuration; particleColor = particleColor.Lerp(particleColorGoal, particleLerpTime); } MemoryAccess.SetPtfxColor("core", "ent_amb_smoke_foundry", 0, particleColor); MemoryAccess.SetPtfxColor("core", "ent_amb_smoke_foundry", 1, particleColor); MemoryAccess.SetPtfxColor("core", "ent_amb_smoke_foundry", 2, particleColor); }
public static EnvMaterialFX RaycastMaterialFX(Vector3 start, Vector3 end, out Vector3 result) { var shapeTest = ShapeTestEx.RunShapeTest(start, end, null, IntersectOptions.Map); if (shapeTest.DidHit) { foreach (var item in fxList) { if (item[shapeTest.HitMaterial] != materials.none) { result = shapeTest.HitPosition; return(item); } } } result = Vector3.Zero; return(null); }