Esempio n. 1
0
 public void RenderMainItem(View3D view)
 {
     if (InvCurrent != null)
     {
         InvCurrent.Render3D(Location.Zero, (float)GlobalTickTimeLocal * 0.5f, new Location(6));
     }
 }
Esempio n. 2
0
 public void Render3D(View3D view)
 {
     GL.Enable(EnableCap.CullFace);
     if (view.ShadowsOnly)
     {
         for (int i = 0; i < TheRegion.ShadowCasters.Count; i++)
         {
             TheRegion.ShadowCasters[i].Render();
         }
         if (view.TranspShadows)
         {
             TheRegion.RenderClouds();
         }
     }
     else
     {
         GL.ActiveTexture(TextureUnit.Texture1);
         Textures.NormalDef.Bind();
         GL.ActiveTexture(TextureUnit.Texture0);
         if (view.FBOid == FBOID.MAIN)
         {
             s_fbot.Bind();
             RenderSkybox();
             s_fbo.Bind();
         }
         if (view.FBOid == FBOID.FORWARD_SOLID || view.FBOid == FBOID.FORWARD_TRANSP)
         {
             RenderSkybox(); // TODO: s_fbot equivalent for forward renderer?
         }
         if (view.FBOid == FBOID.TRANSP_UNLIT || view.FBOid == FBOID.TRANSP_LIT || view.FBOid == FBOID.TRANSP_SHADOWS
             || view.FBOid == FBOID.FORWARD_SOLID || view.FBOid == FBOID.FORWARD_TRANSP)
         {
             Rendering.SetMinimumLight(1);
             TheRegion.RenderClouds();
             Rendering.SetMinimumLight(0);
         }
         for (int i = 0; i < TheRegion.Entities.Count; i++)
         {
             TheRegion.Entities[i].Render();
         }
         SetEnts();
         if (CVars.g_weathermode.ValueI > 0)
         {
             RainCylPos += gDelta * ((CVars.g_weathermode.ValueI == 1) ? 0.5 : 0.1);
             while (RainCylPos > 1.0)
             {
                 RainCylPos -= 1.0;
             }
             Matrix4d rot = (CVars.g_weathermode.ValueI == 2) ? Matrix4d.CreateRotationZ(Math.Sin(RainCylPos * 2f * Math.PI) * 0.1f) : Matrix4d.Identity;
             for (int i = -10; i <= 10; i++)
             {
                 Matrix4d mat = rot * Matrix4d.CreateTranslation(ClientUtilities.ConvertD(MainWorldView.CameraPos + new Location(0, 0, 4 * i + RainCylPos * -4)));
                 MainWorldView.SetMatrix(2, mat);
                 if (CVars.g_weathermode.ValueI == 1)
                 {
                     RainCyl.Draw();
                 }
                 else if (CVars.g_weathermode.ValueI == 2)
                 {
                     SnowCyl.Draw();
                 }
             }
         }
         if (MainWorldView.FBOid == FBOID.MAIN)
         {
             Rendering.SetMinimumLight(1f);
         }
         GL.ActiveTexture(TextureUnit.Texture1);
         Textures.NormalDef.Bind();
         GL.ActiveTexture(TextureUnit.Texture0);
         Particles.Engine.Render();
     }
     SetEnts();
     isVox = false;
     SetVox();
     TheRegion.Render();
     SetEnts();
     TheRegion.RenderPlants();
     if (!view.ShadowsOnly)
     {
         GL.ActiveTexture(TextureUnit.Texture1);
         Textures.NormalDef.Bind();
         GL.ActiveTexture(TextureUnit.Texture0);
     }
     Textures.White.Bind();
     Location mov = (CameraFinalTarget - MainWorldView.CameraPos) / CameraDistance;
     Location cpos = CameraFinalTarget - (CameraImpactNormal * 0.01f);
     Location cpos2 = CameraFinalTarget + (CameraImpactNormal * 0.91f);
     // TODO: 5 -> Variable length (Server controlled?)
     if (TheRegion.GetBlockMaterial(cpos) != Material.AIR && CameraDistance < 5)
     {
         if (CVars.u_highlight_targetblock.ValueB)
         {
             Location cft = cpos.GetBlockLocation();
             GL.LineWidth(3);
             Rendering.SetColor(Color4.Blue);
             Rendering.SetMinimumLight(1.0f);
             Rendering.RenderLineBox(cft - mov * 0.01f, cft + Location.One - mov * 0.01f);
             GL.LineWidth(1);
         }
         if (CVars.u_highlight_placeblock.ValueB)
         {
             Rendering.SetColor(Color4.Cyan);
             Location cft2 = cpos2.GetBlockLocation();
             Rendering.RenderLineBox(cft2, cft2 + Location.One);
         }
         Rendering.SetColor(Color4.White);
     }
     if (MainWorldView.FBOid == FBOID.MAIN)
     {
         Rendering.SetMinimumLight(0f);
     }
     if (CVars.n_debugmovement.ValueB)
     {
         Rendering.SetColor(Color4.Red);
         GL.LineWidth(5);
         foreach (Chunk chunk in TheRegion.LoadedChunks.Values)
         {
             if (chunk._VBO == null && !chunk.IsAir)
             {
                 Rendering.RenderLineBox(chunk.WorldPosition.ToLocation() * Chunk.CHUNK_SIZE, (chunk.WorldPosition.ToLocation() + Location.One) * Chunk.CHUNK_SIZE);
             }
         }
         GL.LineWidth(1);
         Rendering.SetColor(Color4.White);
     }
     Textures.White.Bind();
     Rendering.SetMinimumLight(1);
     TheRegion.RenderEffects();
     Textures.GetTexture("effects/beam").Bind(); // TODO: Store
     for (int i = 0; i < TheRegion.Joints.Count; i++)
     {
         if (TheRegion.Joints[i] is ConnectorBeam)
         {
             switch (((ConnectorBeam)TheRegion.Joints[i]).type)
             {
                 case BeamType.STRAIGHT:
                     {
                         Location one = TheRegion.Joints[i].One.GetPosition();
                         if (TheRegion.Joints[i].One is CharacterEntity)
                         {
                             one = ((CharacterEntity)TheRegion.Joints[i].One).GetEyePosition() + new Location(0, 0, -0.3);
                         }
                         Location two = TheRegion.Joints[i].Two.GetPosition();
                         Vector4 col = Rendering.AdaptColor(ClientUtilities.ConvertD((one + two) * 0.5), ((ConnectorBeam)TheRegion.Joints[i]).color);
                         Rendering.SetColor(col);
                         Rendering.RenderLine(one, two);
                     }
                     break;
                 case BeamType.CURVE:
                     {
                         Location one = TheRegion.Joints[i].One.GetPosition();
                         Location two = TheRegion.Joints[i].Two.GetPosition();
                         Location cPoint = (one + two) * 0.5f;
                         if (TheRegion.Joints[i].One is CharacterEntity)
                         {
                             one = ((CharacterEntity)TheRegion.Joints[i].One).GetEyePosition() + new Location(0, 0, -0.3);
                             cPoint = one + ((CharacterEntity)TheRegion.Joints[i].One).ForwardVector() * (two - one).Length();
                         }
                         DrawCurve(one, two, cPoint, ((ConnectorBeam)TheRegion.Joints[i]).color);
                     }
                     break;
                 case BeamType.MULTICURVE:
                     {
                         Location one = TheRegion.Joints[i].One.GetPosition();
                         Location two = TheRegion.Joints[i].Two.GetPosition();
                         double forlen = 1;
                         Location forw = Location.UnitZ;
                         if (TheRegion.Joints[i].One is CharacterEntity)
                         {
                             one = ((CharacterEntity)TheRegion.Joints[i].One).GetEyePosition() + new Location(0, 0, -0.3);
                             forlen = (two - one).Length();
                             forw = ((CharacterEntity)TheRegion.Joints[i].One).ForwardVector();
                         }
                         Location spos = one + forw * forlen;
                         const int curves = 5;
                         BEPUutilities.Vector3 bvec = new BEPUutilities.Vector3(0, 0, 1);
                         BEPUutilities.Vector3 bvec2 = new BEPUutilities.Vector3(1, 0, 0);
                         BEPUutilities.Quaternion bquat;
                         BEPUutilities.Quaternion.GetQuaternionBetweenNormalizedVectors(ref bvec2, ref bvec, out bquat);
                         BEPUutilities.Vector3 forwvec = forw.ToBVector();
                         GL.LineWidth(6);
                         DrawCurve(one, two, spos, ((ConnectorBeam)TheRegion.Joints[i]).color);
                         for (int c = 0; c < curves; c++)
                         {
                             double tang = TheRegion.GlobalTickTimeLocal + Math.PI * 2.0 * ((double)c / (double)curves);
                             BEPUutilities.Vector3 res = BEPUutilities.Quaternion.Transform(forw.ToBVector(), bquat);
                             BEPUutilities.Quaternion quat = BEPUutilities.Quaternion.CreateFromAxisAngle(forwvec, (float)(tang % (Math.PI * 2.0)));
                             res = BEPUutilities.Quaternion.Transform(res, quat);
                             res = res * (float)(0.1 * forlen);
                             DrawCurve(one, two, spos + new Location(res), ((ConnectorBeam)TheRegion.Joints[i]).color);
                         }
                     }
                     break;
             }
         }
     }
     Rendering.SetColor(Color4.White);
     Rendering.SetMinimumLight(0);
     Textures.White.Bind();
     if (!view.ShadowsOnly)
     {
         GL.ActiveTexture(TextureUnit.Texture1);
         GL.BindTexture(TextureTarget.Texture2D, 0);
         GL.ActiveTexture(TextureUnit.Texture0);
         Render2D(true);
     }
 }