public void RenderMainItem(View3D view) { if (InvCurrent != null) { InvCurrent.Render3D(Location.Zero, (float)GlobalTickTimeLocal * 0.5f, new Location(6)); } }
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); } }