Beispiel #1
0
 void Init()
 {
     if (!inited)
     {
         if (Dfm != null)
         {
             Dfm.Initialize(sysr.ResourceManager);
         }
         if (Model != null && Model.Levels.Length > 0)
         {
             Model.Initialize(sysr.ResourceManager);
         }
         else if (Cmp != null)
         {
             Cmp.Initialize(sysr.ResourceManager);
         }
         else if (Sph != null)
         {
             Sph.Initialize(sysr.ResourceManager);
             if (Sph.SideMaterials.Length > 6)
             {
                 radiusAtmosphere = Sph.Radius * Math.Max(Sph.SideMaterials[6].Scale, 1f);
             }
             else
             {
                 radiusAtmosphere = Sph.Radius;
             }
         }
         inited = true;
     }
 }
Beispiel #2
0
 public override void Register(SystemRenderer renderer)
 {
     sysr = renderer;
     sysr.Objects.Add(this);
     if (!inited)
     {
         if (Dfm != null)
         {
             Dfm.Initialize(sysr.Game.ResourceManager);
         }
         if (Model != null && Model.Levels.Length > 0)
         {
             Model.Initialize(sysr.Game.ResourceManager);
         }
         else if (Cmp != null)
         {
             Cmp.Initialize(sysr.Game.ResourceManager);
         }
         else if (Sph != null)
         {
             Sph.Initialize(sysr.Game.ResourceManager);
             if (Sph.SideMaterials.Length > 6)
             {
                 radiusAtmosphere = Sph.Radius * Sph.SideMaterials[6].Scale;
             }
             else
             {
                 radiusAtmosphere = Sph.Radius;
             }
         }
         inited = true;
     }
 }
Beispiel #3
0
 public override void Draw(ICamera camera, CommandBuffer commands, SystemLighting lights, NebulaRenderer nr)
 {
     Init();
     if (Dfm != null)
     {
         Dfm.Update(camera, TimeSpan.Zero, TimeSpan.FromSeconds(sysr.Game.TotalTime));
         var center = VectorMath.Transform(Vector3.Zero, World);
         //var lighting = RenderHelpers.ApplyLights(lights, LightGroup, center, 20, nr, LitAmbient, LitDynamic, NoFog);
         Dfm.DrawBuffer(commands, World, ref Lighting.Empty);
     }
     if (Model != null)
     {
         if (Model.Levels.Length > 0)
         {
             Model.Update(camera, TimeSpan.Zero, TimeSpan.FromSeconds(sysr.Game.TotalTime));
             var center = VectorMath.Transform(Model.Levels[0].Center, World);
             var lvl    = GetLevel(Model, center, camera.Position);
             if (lvl == null)
             {
                 return;
             }
             var lighting = RenderHelpers.ApplyLights(lights, LightGroup, center, Model.Levels[0].Radius, nr, LitAmbient, LitDynamic, NoFog);
             var r        = Model.Levels [0].Radius + lighting.FogRange.Y;
             if (lighting.FogMode != FogModes.Linear || VectorMath.DistanceSquared(camera.Position, center) <= (r * r))
             {
                 Model.DrawBufferLevel(lvl, commands, World, ref lighting);
             }
         }
     }
     else if (Cmp != null)
     {
         Cmp.Update(camera, TimeSpan.Zero, TimeSpan.FromSeconds(sysr.Game.TotalTime));
         foreach (Part p in Cmp.Parts)
         {
             var     model = p.Model;
             Matrix4 w     = World;
             if (p.Construct != null)
             {
                 w = p.Construct.Transform * World;
             }
             if (model.Levels.Length > 0)
             {
                 var center = VectorMath.Transform(model.Levels[0].Center, w);
                 var lvl    = GetLevel(model, center, camera.Position);
                 if (lvl == null)
                 {
                     continue;
                 }
                 var bsphere = new BoundingSphere(
                     center,
                     model.Levels[0].Radius
                     );
                 if (camera.Frustum.Intersects(bsphere))
                 {
                     var lighting = RenderHelpers.ApplyLights(lights, LightGroup, center, model.Levels[0].Radius, nr, LitAmbient, LitDynamic, NoFog);
                     var r        = model.Levels [0].Radius + lighting.FogRange.Y;
                     if (lighting.FogMode != FogModes.Linear || VectorMath.DistanceSquared(camera.Position, center) <= (r * r))
                     {
                         model.DrawBufferLevel(lvl, commands, w, ref lighting);
                     }
                 }
             }
         }
     }
     else if (CmpParts != null)
     {
         _parentCmp.Update(camera, TimeSpan.Zero, TimeSpan.FromSeconds(sysr.Game.TotalTime));
         foreach (Part p in CmpParts)
         {
             p.Update(camera, TimeSpan.Zero, TimeSpan.FromSeconds(sysr.Game.TotalTime));
             var     model = p.Model;
             Matrix4 w     = World;
             if (p.Construct != null)
             {
                 w = p.Construct.Transform * World;
             }
             if (model.Levels.Length > 0)
             {
                 var center = VectorMath.Transform(model.Levels[0].Center, w);
                 var lvl    = GetLevel(model, center, camera.Position);
                 if (lvl == null)
                 {
                     continue;
                 }
                 var bsphere = new BoundingSphere(
                     center,
                     model.Levels[0].Radius
                     );
                 if (camera.Frustum.Intersects(bsphere))
                 {
                     var lighting = RenderHelpers.ApplyLights(lights, LightGroup, center, model.Levels[0].Radius, nr, LitAmbient, LitDynamic, NoFog);
                     var r        = model.Levels[0].Radius + lighting.FogRange.Y;
                     if (lighting.FogMode != FogModes.Linear || VectorMath.DistanceSquared(camera.Position, center) <= (r * r))
                     {
                         model.DrawBufferLevel(lvl, commands, w, ref lighting);
                     }
                 }
             }
         }
     }
     else if (Sph != null)
     {
         Sph.Update(camera, TimeSpan.Zero, TimeSpan.FromSeconds(sysr.Game.TotalTime));
         var l = RenderHelpers.ApplyLights(lights, LightGroup, pos, Sph.Radius, nr, LitAmbient, LitDynamic, NoFog);
         var r = Sph.Radius + l.FogRange.Y;
         if (l.FogMode != FogModes.Linear || VectorMath.DistanceSquared(camera.Position, pos) <= (r * r))
         {
             Sph.DrawBuffer(commands, World, ref l);
         }
     }
 }