diff --git a/Effects/Models/MyEffectModelsDNS.fx b/Effects/Models/MyEffectModelsDNS.fx index 4dbab73..7fe3ac4 100644 --- a/Effects/Models/MyEffectModelsDNS.fx +++ b/Effects/Models/MyEffectModelsDNS.fx @@ -3,7 +3,6 @@ #include "../MyEffectReflectorBase.fxh" // This shader renders a model with diffuse & specular & normal map textures, so it requires certain vertex shader data - //const float CHANNEL_TEXTURE_SCALE = 40; float4x4 WorldMatrix; @@ -19,11 +18,6 @@ float3 Highlight = 0; float SpecularIntensity = 1; float SpecularPower = 1; -//float Channel0Intensity = 0; -//float Channel1Intensity = 0; -//float Channel2Intensity = 0; -//float Channel3Intensity = 0; - float2 HalfPixel; float2 Scale; @@ -45,35 +39,6 @@ sampler TextureNormalSampler = sampler_state AddressV = WRAP; }; -/* -Texture TextureMask; -sampler TextureMaskSampler = sampler_state -{ - texture = ; - mipfilter = LINEAR; - AddressU = WRAP; - AddressV = WRAP; -}; - -Texture TextureChannel0; -sampler TextureChannel0Sampler = sampler_state -{ - texture = ; - mipfilter = LINEAR; - AddressU = WRAP; - AddressV = WRAP; -}; - -Texture TextureChannel1; -sampler TextureChannel1Sampler = sampler_state -{ - texture = ; - mipfilter = LINEAR; - AddressU = WRAP; - AddressV = WRAP; -}; - */ - //This sampler is used for HOLO objects Texture DepthTextureNear; sampler DepthTextureNearSampler = sampler_state @@ -155,43 +120,8 @@ struct VertexShaderOutput_DNS_Instanced VertexShaderOutput_DNS BaseOutput; VertexShaderOutputInstance InstanceOutput; }; - /* -// Channels normal & higher -struct VertexShaderInput_DNS_Channels -{ - VertexShaderInput_DNS Input; - float2 MaskCoord : TEXCOORD1; -}; - -struct VertexShaderOutput_DNS_Channels -{ - VertexShaderOutput_DNS Output; - float2 MaskCoord : TEXCOORD8; -}; - -// Instance data -struct VertexShaderInput_Instance -{ - float4 worldMatrixRow0 : BLENDWEIGHT0; - float4 worldMatrixRow1 : BLENDWEIGHT1; - float4 worldMatrixRow2 : BLENDWEIGHT2; - float4 worldMatrixRow3 : BLENDWEIGHT3; - float4 diffuse : BLENDWEIGHT4; - float4 SpecularIntensity_SpecularPower_Emisivity_None : BLENDWEIGHT5; - float3 Highlight : BLENDWEIGHT6; -}; -VertexShaderOutputInstance VertexShaderInstance_Base(VertexShaderInput_Instance instanceData) -{ - VertexShaderOutputInstance output; - output.Diffuse = instanceData.diffuse; - output.SpecularIntensity_SpecularPower_Emisivity_None = instanceData.SpecularIntensity_SpecularPower_Emisivity_None; - output.Highlight = instanceData.Highlight; - return output; -} - */ // Low VS - VertexShaderOutputLow_DNS VertexShaderFunctionLow_DNS_Base(VertexShaderInputLow_DNS input, float4x4 world) { VertexShaderOutputLow_DNS output; @@ -216,22 +146,8 @@ VertexShaderOutputLow_DNS VertexShaderFunctionLow_DNS(VertexShaderInputLow_DNS i { return VertexShaderFunctionLow_DNS_Base(input, WorldMatrix); } -/* -VertexShaderOutputLow_DNS_Instanced VertexShaderFunctionLow_DNS_Instanced(VertexShaderInputLow_DNS input, VertexShaderInput_Instance instanceData) -{ - float4x4 instanceWorldMatrix = {instanceData.worldMatrixRow0, - instanceData.worldMatrixRow1, - instanceData.worldMatrixRow2, - instanceData.worldMatrixRow3}; - VertexShaderOutputLow_DNS_Instanced output; - output.BaseOutput = VertexShaderFunctionLow_DNS_Base(input, instanceWorldMatrix); - output.InstanceOutput = VertexShaderInstance_Base(instanceData); - return output; -} - */ // Normal, High, Extreme VS - VertexShaderOutput_DNS VertexShaderFunction_DNS_Base(VertexShaderInput_DNS input, float4x4 world) { VertexShaderOutput_DNS output; @@ -252,28 +168,6 @@ VertexShaderOutput_DNS VertexShaderFunction_DNS(VertexShaderInput_DNS input) { return VertexShaderFunction_DNS_Base(input, WorldMatrix); } -/* -VertexShaderOutput_DNS_Instanced VertexShaderFunction_DNS_Instanced(VertexShaderInput_DNS input, VertexShaderInput_Instance instanceData) -{ - float4x4 instanceWorldMatrix = {instanceData.worldMatrixRow0, - instanceData.worldMatrixRow1, - instanceData.worldMatrixRow2, - instanceData.worldMatrixRow3}; - - VertexShaderOutput_DNS_Instanced output; - - output.BaseOutput = VertexShaderFunction_DNS_Base(input, instanceWorldMatrix); - output.InstanceOutput = VertexShaderInstance_Base(instanceData); - return output; -} */ - /* -VertexShaderOutput_DNS_Channels VertexShaderFunction_DNS_Channels(VertexShaderInput_DNS_Channels input) -{ - VertexShaderOutput_DNS_Channels output; - output.Output = VertexShaderFunction_DNS(input.Input); - output.MaskCoord = input.MaskCoord; - return output; -} */ VertexShaderOutputForward_DNS VertexShaderFunctionLow_DNS_Forward(VertexShaderInputLow_DNS input) { @@ -292,8 +186,6 @@ VertexShaderOutputForward_DNS VertexShaderFunctionLow_DNS_Forward(VertexShaderIn return output; } - - float4 PixelShaderFunctionLow_DNS_Forward(VertexShaderOutputForward_DNS input) : COLOR0 { //return float4(1,1,1,1); @@ -316,16 +208,9 @@ float4 PixelShaderFunctionLow_DNS_Forward(VertexShaderOutputForward_DNS input) : MyGbufferPixelShaderOutput CalculateOutput(VertexShaderOutputLow_DNS input, float3 normal, float specularIntensity, float3 diffuseColor, float3 si_sp_e, float3 highlight) { - //To check normals from vertices - //normal.xyz = normalize(input.TangentToWorld[2]); - //float3 diffusec = GetNormalVectorIntoRenderTarget(normalize(input.TangentToWorld[1])); - float4 diffuseTexture = tex2D(TextureDiffuseSampler, input.TexCoordAndViewDistance.xy); - float3 diffuse = diffuseTexture.xyz * diffuseColor.xyz; - //float fogBlend = (input.TexCoordAndViewDistance.z - FogDistanceNear) / (FogDistanceFar - FogDistanceNear); - //diffuse = lerp(diffuse, FogColor, saturate(fogBlend) * FogMultiplier); - + // Output into MRT MyGbufferPixelShaderOutput output = GetGbufferPixelShaderOutput(normal.xyz, diffuse + highlight, specularIntensity * si_sp_e.x / SPECULAR_INTENSITY_RATIO, si_sp_e.y / SPECULAR_POWER_RATIO, input.TexCoordAndViewDistance.z); @@ -336,7 +221,6 @@ MyGbufferPixelShaderOutput CalculateOutput(VertexShaderOutputLow_DNS input, floa } // Low PS - MyGbufferPixelShaderOutput PixelShaderFunctionLow_DNS_Base(VertexShaderOutputLow_DNS input, float3 diffuse, float3 si_sp_e, float3 highlight) { return CalculateOutput(input, input.Normal, 1, diffuse, si_sp_e, highlight); @@ -346,17 +230,29 @@ MyGbufferPixelShaderOutput PixelShaderFunctionLow_DNS(VertexShaderOutputLow_DNS { return PixelShaderFunctionLow_DNS_Base(input, DiffuseColor, float3(SpecularIntensity, SpecularPower, Emissivity), Highlight); } - /* -MyGbufferPixelShaderOutput PixelShaderFunctionLow_DNS_Instanced(VertexShaderOutputLow_DNS_Instanced input) + +float2 GetParallaxMapedCoords(VertexShaderOutput_DNS input) { - float3 si_sp_e = input.InstanceOutput.SpecularIntensity_SpecularPower_Emisivity_None.xyz; - return PixelShaderFunctionLow_DNS_Base(input.BaseOutput, input.InstanceOutput.Diffuse, si_sp_e, input.InstanceOutput.Highlight); -} */ + float3x3 worldToTangent = transpose(input.TangentToWorld); + float3 directionToCamera = input.BaseOutput.WorldPos - CameraPosition; + float3 cameraDirectionWithTangent = mul(directionToCamera, worldToTangent); -// Normal, High, Extreme PS + float3 cameraDir = normalize(cameraDirectionWithTangent); + float height = tex2D(TextureNormalSampler, input.BaseOutput.TexCoordAndViewDistance.xy).a; + + float scale = 0.12f; + float bias = -0.026f; + + height = height * scale + bias; + + return input.BaseOutput.TexCoordAndViewDistance.xy + height * cameraDir.xy; +} +// Normal, High, Extreme PS MyGbufferPixelShaderOutput PixelShaderFunction_DNS_Base(VertexShaderOutput_DNS input, float3 diffuse, float3 si_sp_e, float3 highlight) { + input.BaseOutput.TexCoordAndViewDistance.xy = GetParallaxMapedCoords(input); + float4 diffuseTexture = tex2D(TextureDiffuseSampler, input.BaseOutput.TexCoordAndViewDistance.xy); input.TangentToWorld[0] = normalize(input.TangentToWorld[0]); @@ -375,14 +271,6 @@ MyGbufferPixelShaderOutput PixelShaderFunction_DNS_Base(VertexShaderOutput_DNS i MyGbufferPixelShaderOutput PixelShaderFunction_DNS(VertexShaderOutput_DNS input) { - //Cut pixels from LOD1 which are before LodNear - /*if (input.BaseOutput.TexCoordAndViewDistance.w < LodCut) - { - discard; - return (MyGbufferPixelShaderOutput)0; - //return PixelShaderFunction_Base(input, float4(1,0,0,1), Highlight, float3(SpecularIntensity, SpecularPower, 0), renderQuality); - } - else*/ if (IsPixelCut(input.BaseOutput.TexCoordAndViewDistance.w)) { discard; @@ -393,60 +281,7 @@ MyGbufferPixelShaderOutput PixelShaderFunction_DNS(VertexShaderOutput_DNS input) return PixelShaderFunction_DNS_Base(input, DiffuseColor, float3(SpecularIntensity, SpecularPower, Emissivity), Highlight); } } - /* -MyGbufferPixelShaderOutput PixelShaderFunction_DNS_Instanced(VertexShaderOutput_DNS_Instanced input) -{ - float3 si_sp_e = input.InstanceOutput.SpecularIntensity_SpecularPower_Emisivity_None.xyz; - return PixelShaderFunction_DNS_Base(input.BaseOutput, input.InstanceOutput.Diffuse, si_sp_e, input.InstanceOutput.Highlight); -} */ - /* -// Rounds normal, return vector where most significant component is 1, others are 0 -float3 RoundNormal(float3 normal) -{ - normal = abs(normal); - float3 normalShift = float3(normal.z, normal.x, normal.y); - float3 normalStep = step(normal, normalShift); // return 1 where shift is more - return float3(normalStep.y * (1 - normalStep.x), normalStep.z * (1 - normalStep.y), normalStep.x * (1 - normalStep.z)); -} - -float4 AddChannels(float4 diffuseAndSpecular, float2 maskCoord, float3 worldPos, float3 normal) -{ - worldPos /= CHANNEL_TEXTURE_SCALE; - - normal = RoundNormal(normal); - float2 chanCoord = normal.x * worldPos.zy + normal.y * worldPos.xz + normal.z * worldPos.xy; - float4 mask = tex2D(TextureMaskSampler, maskCoord); - - float4 chan0 = float4(0,0,0,1) * (1 - mask.x); - float4 chan1 = tex2D(TextureChannel1Sampler, chanCoord) * (1 - mask.x); - - chan0.a *= Channel0Intensity; - chan1.a *= Channel1Intensity; - - // Channel 1 is on the top of channel 0 - float4 blend; - blend.rgb = lerp(chan0.rgb, chan1.rgb, chan1.a); - - // Combine alpha, example: 0.6 & 0.6 = 0.84 - blend.a = (1 - (1 - chan0.a) * (1 - chan1.a)); - - float power = 3; - float v = saturate((blend.a) + 0.5f - pow(0.5f, power)); - float lerpCoef = pow(v, power); - - float4 res = lerp(diffuseAndSpecular, float4(blend.rgb, diffuseAndSpecular.a * 0.25f), lerpCoef); //we blend to zero spec - return res; - -} - -MyGbufferPixelShaderOutput PixelShaderFunction_DNS_Channels(VertexShaderOutput_DNS_Channels input) -{ - MyGbufferPixelShaderOutput output = PixelShaderFunction_DNS(input.Output); - output.DiffuseAndSpecIntensity = AddChannels(output.DiffuseAndSpecIntensity.rgba * float4(DiffuseColor.xyz, 1) , input.MaskCoord, input.Output.BaseOutput.WorldPos, input.Output.BaseOutput.Normal); - return output; -} - */ MyGbufferPixelShaderOutput CalculateValuesBlended(VertexShaderOutputLow_DNS input, float4 normal) { float4 diffuseTexture = tex2D(TextureDiffuseSampler, input.TexCoordAndViewDistance.xy); @@ -519,15 +354,8 @@ float4 PixelShaderFunction_Holo_Forward(VertexShaderOutputForward_DNS input) : C MyGbufferPixelShaderOutput PixelShaderFunction_Holo(VertexShaderOutput_DNS input) { float2 texCoord = GetScreenSpaceTextureCoord(input.BaseOutput.ScreenPosition, HalfPixel) * Scale; - /*float nearDepth = DecodeFloatRGBA(tex2D(DepthTextureNearSampler, texCoord)); - float farDepth = DecodeFloatRGBA(tex2D(DepthTextureFarSampler, texCoord)); - - float depth = min(nearDepth, farDepth) * FAR_PLANE_DISTANCE; - if (depth + 0.01f < input.BaseOutput.TexCoordAndViewDistance.z) - discard;*/ float4 diffuseTexture = tex2D(TextureDiffuseSampler, input.BaseOutput.TexCoordAndViewDistance.xy); - input.TangentToWorld[0] = normalize(input.TangentToWorld[0]); input.TangentToWorld[1] = normalize(input.TangentToWorld[1]); @@ -585,16 +413,6 @@ MyGbufferPixelShaderOutput PixelShaderFunction_Stencil_Low(VertexShaderOutputLow { return GetGbufferPixelShaderOutput(float3(0,0,0), float3(0,0,0), input.TexCoordAndViewDistance.z); } - /* -MyGbufferPixelShaderOutput PixelShaderFunction_Stencil_Instanced(VertexShaderOutput_DNS_Instanced input) -{ - return GetGbufferPixelShaderOutput(float3(0,0,0), float3(0,0,0), input.BaseOutput.BaseOutput.TexCoordAndViewDistance.z); -} - -MyGbufferPixelShaderOutput PixelShaderFunction_Stencil_Low_Instanced(VertexShaderOutputLow_DNS_Instanced input) -{ - return GetGbufferPixelShaderOutput(float3(0,0,0), float3(0,0,0), input.BaseOutput.TexCoordAndViewDistance.z); -} */ technique Technique_RenderQualityLow_Forward { diff --git a/MinerWars2081.sln b/MinerWars2081.sln index da03009..343cdb6 100644 --- a/MinerWars2081.sln +++ b/MinerWars2081.sln @@ -1,6 +1,8 @@  -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.30723.0 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MinerWars.GameLib", "Sources\MinerWars.GameLib\MinerWars.GameLib.csproj", "{F2AA32D9-F560-4DEF-BBF2-3DCCF4B17320}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MinerWarsCommonLIB", "Sources\CommonLIB\MinerWarsCommonLIB.csproj", "{2C96F0AB-7962-4B73-A075-B0E0B09F6195}" diff --git a/Sources/MinerWars.GameLib/AppCode/App/MyMinerGame.cs b/Sources/MinerWars.GameLib/AppCode/App/MyMinerGame.cs index 8a8423f..bb67b34 100644 --- a/Sources/MinerWars.GameLib/AppCode/App/MyMinerGame.cs +++ b/Sources/MinerWars.GameLib/AppCode/App/MyMinerGame.cs @@ -1,1121 +1,1121 @@ -#region Using - -using System; -using System.Collections.Concurrent; -using System.Diagnostics; -using System.Reflection; -using System.Security.Principal; -using System.Threading; -using SysUtils; -using SysUtils.Utils; -using ParallelTasks; - -using MinerWars.AppCode.Game.Audio; -using MinerWars.AppCode.Game.Audio.Dialogues; -using MinerWars.AppCode.Game.Entities; -using MinerWars.AppCode.Game.Entities.FoundationFactory; -using MinerWars.AppCode.Game.Gameplay; -using MinerWars.AppCode.Game.GUI; -using MinerWars.AppCode.Game.GUI.Core; -using MinerWars.AppCode.Game.Localization; -using MinerWars.AppCode.Game.Managers; -using MinerWars.AppCode.Game.Models; -using MinerWars.AppCode.Game.Prefabs; -using MinerWars.AppCode.Game.Render; -using MinerWars.AppCode.Game.Sessions; -using MinerWars.AppCode.Game.Sessions.Multiplayer; -using MinerWars.AppCode.Game.Textures; -using MinerWars.AppCode.Game.TransparentGeometry; -using MinerWars.AppCode.Game.TransparentGeometry.Particles; -using MinerWars.AppCode.Game.Utils; -using MinerWars.AppCode.Game.VideoMode; -using MinerWars.AppCode.Game.Voxels; -using MinerWars.AppCode.Game.World.Global; -using MinerWars.AppCode.Networking; -using MinerWars.AppCode.Networking.SectorService; -using MinerWars.CommonLIB.AppCode.ObjectBuilders; -using MinerWars.CommonLIB.AppCode.Utils; - -//using MinerWarsMath; -//using MinerWarsMath.Graphics; - -using SharpDX; -using SharpDX.Toolkit; -using SharpDX.Direct3D; -using SharpDX.Direct3D9; -using System.Drawing; -using SharpDX.Toolkit.Graphics; -using MinerWars.AppCode.Toolkit.Input; -using System.IO; -using MinerWars.GameServices; - -#endregion - -namespace MinerWars.AppCode.App -{ - public delegate void OnInitEvent(SharpDX.Toolkit.Game game); - public delegate void OnDrawEvent(GameTime gt); - - public enum SetDepthTargetEnum - { - NoChange, - RestoreDefault, - } - - public class MyMinerGame : SharpDX.Toolkit.Game - { - public const string ContentDir = "Content"; - - public static MyMinerGame Static; - public static MyMwcVector2Int ScreenSize; - public static MyMwcVector2Int ScreenSizeHalf; - public static bool IsGameReady = true; - public static bool IsDeviceResetted = false; - - //events for external editors/scripts - internal static event OnInitEvent OnGameInit; - internal static event OnDrawEvent OnGameUpdate; - internal static event OnDrawEvent OnGameDraw; - - SharpDX.Direct3D9.Font m_debugFont; - - public string RootDirectory; - public string RootDirectoryDebug; - public string RootDirectoryEffects; - public static Surface DefaultSurface { get; private set; } - public static Surface DefaultDepth { get; private set; } - - public static ServiceContainer Services { get; private set; } - - // Total GAME-PLAY time in milliseconds. It doesn't change while game is paused. Use it only for game-play - // stuff (e.g. game logic, particles, etc). Do not use it for GUI or not game-play stuff. - public static int TotalGamePlayTimeInMilliseconds; - - // Total time independent of whether game is paused. It increments all the time, no matter if game is paused. - public static int TotalTimeInMilliseconds; - - // Helpers for knowing when pauses started and total time spent in pause mode (even if there were many pauses) - static int m_pauseStartTimeInMilliseconds; - static int m_totalPauseTimeInMilliseconds = 0; - static bool m_pauseActive; - - public static int NumberOfCores; - - private bool m_isGraphicsSupported; - - private static string m_gameDir; - - // Properties - public static string GameDir - { - get - { - if (m_gameDir == null) - { - m_gameDir = Services.AppDir; - } - return m_gameDir; - } - } - - protected override void EndRun() - { - base.EndRun(); - -#if DEBUG - var o = SharpDX.Diagnostics.ObjectTracker.FindActiveObjects(); - System.Diagnostics.Debug.Assert(o.Count == 0, "Unreleased DX objects!"); - Console.WriteLine(SharpDX.Diagnostics.ObjectTracker.ReportActiveObjects()); -#endif - } - - - /// - /// Queue of actions to be invoked on xna game thread. - /// - private readonly ConcurrentQueue> m_InvokeQueue; - - /// - /// Main xna init thread. - /// - private readonly Thread m_MainThread; - - #region Properties - - public static MyCustomGraphicsDeviceManagerDX GraphicsDeviceManager { get; private set; } - - public static bool IsGpuSupported() - { - foreach (int deviceId in MyMwcFinalBuildConstants.UNSUPPORTED_GPU_DEVICE_IDS) - { - //if (GraphicsDeviceManager.GraphicsDevice.id .Adapter.Description.DeviceId == deviceId) - { - // return false; - } - } - return true; - } - - /// - /// Gets a value indicating whether [invoke is required]. - /// - /// - /// true if [invoke required]; otherwise, false. - /// - public bool InvokeRequired - { - get - { - return Thread.CurrentThread != m_MainThread; - } - } - - #endregion - - public MyMinerGame(ServiceContainer services) - { - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyMinerGame()::constructor"); - MyMwcLog.WriteLine("MyMinerGame.Constructor() - START"); - MyMwcLog.IncreaseIndent(); - - Services = services; - - // we want check objectbuilders, prefab's configurations, gameplay constants and building specifications - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("Checks"); - MyMwcObjectBuilder_Base.Check(); - MyPrefabConstants.Check(); - MyGameplayConstants.Check(); - MyBuildingSpecifications.Check(); - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("Preallocate"); - - Preallocate(); - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("IsAdmin"); - WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent(); - WindowsPrincipal windowsPrincipal = new WindowsPrincipal(windowsIdentity); - bool IsAdmin = windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator); - MyMwcLog.WriteLine("IsAdmin " + IsAdmin.ToString()); - MyMwcLog.WriteLine("Game dir: " + GameDir); - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyCustomGraphicsDeviceManagerDX"); -#if !DEBUG - try - { -#endif - - this.Exiting += MyMinerGame_Exiting; - this.Activated += MyMinerGame_OnActivated; - this.Deactivated += MyMinerGame_OnDeactivated; - this.m_InvokeQueue = new ConcurrentQueue>(); - this.m_MainThread = Thread.CurrentThread; - - GraphicsDeviceManager = new MyCustomGraphicsDeviceManagerDX(this); - - m_isGraphicsSupported = GraphicsDeviceManager.ChangeProfileSupport(); - m_isGraphicsSupported = true; - - if (m_isGraphicsSupported) - { - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyVideoModeManager.HookEventHandlers"); - - MyVideoModeManager.HookEventHandlers(); - - //Content = new MyCustomContentManager(Services, ContentDir); - // Content = new SharpDX.Toolkit.Content.ContentManager(Services); - - RootDirectory = Path.Combine(GameDir, "Content"); - RootDirectoryDebug = Path.GetFullPath(System.IO.Path.Combine(GameDir, "..\\..\\..\\Content")); - - RootDirectoryEffects = RootDirectory; - - Static = this; - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("InitNumberOfCores"); - InitNumberOfCores(); - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyVideoModeManager.LogApplicationInformation"); - - - MyVideoModeManager.LogApplicationInformation(); - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyVideoModeManager.LogInformation"); - - MyVideoModeManager.LogInformation(); - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyVideoModeManager.LogEnvironmentInformation"); - - MyVideoModeManager.LogEnvironmentInformation(); - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyPlugins.LoadContent"); - - MyPlugins.LoadContent(); - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyConfig.Load"); - - MyConfig.Load(); - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyMath.Init"); - - MyMath.Init(); - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyTextsWrapper.Init"); - - MyTextsWrapper.Init(); - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyDialoguesWrapper.Init"); - - MyDialoguesWrapper.Init(); - - // If I don't set TargetElapsedTime, default value will be used, which is 60 times per second, and it will be more precise than if I calculate - // it like below - SO I MUST BE DOING THE WRONG CALCULATION !!! - // We use fixed timestep. Update() is called at this precise timesteps. If Update or Draw takes more time, Update will be called more time. Draw is called only after Update. -#if RENDER_PROFILING || GPU_PROFILING - IsFixedTimeStep = false; - MyMinerGame.GraphicsDeviceManager.SynchronizeWithVerticalRetrace = false; -#else - IsFixedTimeStep = MyFakes.FIXED_TIMESTEP; -#endif - - } - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("InitMultithreading"); - - InitMultithreading(); -#if !DEBUG - } - catch (Exception ex) - { - // We are catching exceptions in constructor, because if error occures here, it app will start unloading - // so we skip to UnloadContent and there we will get another exception (because app wasn't really loaded when unload started) - // So we want original exception in log. - MyMwcLog.WriteLine(ex); - throw; - } -#endif - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); - - MyMwcLog.DecreaseIndent(); - MyMwcLog.WriteLine("MyMinerGame.Constructor() - END"); - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); - } - - static void InitNumberOfCores() - { - // Get number of cores of local machine. As I don't know what values it can return, I clamp it to <1..4> (min 1 core, max 4 cores). That are tested values. I can't test eight cores... - NumberOfCores = Environment.ProcessorCount; - MyMwcLog.WriteLine("Found processor count: " + NumberOfCores); // What we found - NumberOfCores = MyMwcUtils.GetClampInt(NumberOfCores, 1, 16); - MyMwcLog.WriteLine("Using processor count: " + NumberOfCores); // What are we really going use - } - - /// - /// Inits the multithreading. - /// - private void InitMultithreading() - { - Parallel.Scheduler = new WorkStealingScheduler(NumberOfCores); - //Parallel.Scheduler = new SimpleScheduler(NumberOfCores); - } - - /// - /// Inicializes the quick launche. - /// - private void InitQuickLaunch() - { - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyMinerGame()::InitQuickLaunch"); - - MyMwcQuickLaunchType? quickLaunch = MyMwcFinalBuildConstants.QUICK_LAUNCH; - -#if AUTOBUILD - quickLaunch = MyMwcQuickLaunchType.NEW_STORY; -#endif - // This will work as auto-login, but it will not depend on auto-login config variable - // It just always tries to auto-login. If auto-login fails, normal login screen will be displayed. - string username = MyConfig.Username; - string password = MyConfig.Password; - - if (quickLaunch != null) - { - switch (quickLaunch.Value) - { - case MyMwcQuickLaunchType.EDITOR_SANDBOX: - { - MyGuiManager.AddScreen(new MyGuiScreenLoginProgress(username, password, - new MyGuiScreenStartQuickLaunch( - quickLaunch.Value, MyTextsWrapperEnum.StartEditorInProgressPleaseWait), null)); - } - break; - case MyMwcQuickLaunchType.LAST_SANDBOX: - case MyMwcQuickLaunchType.NEW_STORY: - { - MyGuiManager.AddScreen(new MyGuiScreenLoginProgress(username, password, - new MyGuiScreenStartQuickLaunch( - quickLaunch.Value, MyTextsWrapperEnum.StartGameInProgressPleaseWait), null)); - - } - break; - case MyMwcQuickLaunchType.LOAD_CHECKPOINT: - { - MyGuiManager.AddScreen(new MyGuiScreenLoginProgress(username, password, - new MyGuiScreenStartQuickLaunch( - quickLaunch.Value, MyTextsWrapperEnum.StartGameInProgressPleaseWait), null)); - } - break; - case MyMwcQuickLaunchType.SANDBOX_RANDOM: - { - MyGuiManager.AddScreen(new MyGuiScreenLoginProgress(username, password, - new MyGuiScreenStartQuickLaunch( - quickLaunch.Value, MyTextsWrapperEnum.StartGameInProgressPleaseWait), null)); - } - break; - default: - { - throw new MyMwcExceptionApplicationShouldNotGetHere(); - } - } - - } - else - { - if (MyFakes.MWBUILDER) - { - MyGuiManager.AddScreen(new MyGuiScreenLoginProgress(username, password, - new MyGuiScreenStartQuickLaunch( - MyMwcQuickLaunchType.EDITOR_SANDBOX, MyTextsWrapperEnum.StartEditorInProgressPleaseWait), null)); - } - else - { - if (MyFakes.ENABLE_LOGOS) - { - MyGuiManager.BackToIntroLogos(new Action(AfterLogos)); - } - else - { - AfterLogos(); - } - } - } - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); - } - - public static void AfterLogos() - { - MyGuiManager.BackToMainMenu(); - - if (MySteam.IsActive) - { - MyGuiScreenMainMenu.AddLoginScreenDrmFree((MyGuiScreenBase)null); - } - else - { - MyGuiScreenMainMenu.AddAutologinScreen(); - } - } - - public bool IsGraphicsSupported() - { - return m_isGraphicsSupported; - } - - // Allows the game to perform any initialization it needs to before starting to run. - // This is where it can query for any required services and load any non-graphic - // related content. Calling base.Initialize will enumerate through any components - // and initialize them as well. - protected override void Initialize() - { - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyMinerGame::Initialize"); - MyMwcLog.WriteLine("MyMinerGame.Initialize() - START"); - MyMwcLog.IncreaseIndent(); - - Window.NativeWindow.Text = "MinerWars 2081"; - ((System.Windows.Forms.Form)Window.NativeWindow).Icon = new System.Drawing.Icon("MinerWars.ico"); - - if (OnGameInit != null) - OnGameInit(this); - - MyVideoModeManager.Initialize(); - -#if !DEBUG - try - { -#endif - // Load data - LoadData(); - - // Load content - base.Initialize(); - - InitQuickLaunch(); - -#if !DEBUG - } - catch (Exception ex) - { - // We are catching exceptions in LoadContent, because if error occures here, it app will start unloading - // so we skip to UnloadContent and there we will get another exception (because app wasn't really loaded when unload started) - // So we want original exception in log. - MyMwcLog.WriteLine(ex); - throw; - } -#endif - - MyMwcLog.DecreaseIndent(); - MyMwcLog.WriteLine("MyMinerGame.Initialize() - END"); - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); - } - - public static void UpdateScreenSize() - { - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyMinerGame::UpdateScreenSize"); - - ScreenSize = new MyMwcVector2Int((int)MyMinerGame.Static.GraphicsDevice.Viewport.Width, (int)MyMinerGame.Static.GraphicsDevice.Viewport.Height); - ScreenSizeHalf = new MyMwcVector2Int(ScreenSize.X / 2, ScreenSize.Y / 2); - - if (MyGuiManager.GetScreenshot() != null) - { - ScreenSize.X = (int)(ScreenSize.X * MyGuiManager.GetScreenshot().SizeMultiplier); - ScreenSize.Y = (int)(ScreenSize.Y * MyGuiManager.GetScreenshot().SizeMultiplier); - ScreenSizeHalf = new MyMwcVector2Int(ScreenSize.X / 2, ScreenSize.Y / 2); - } - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); - } - - /// - /// Decrease fragmentation of the Large Object Heap by forcing static class constructors to run. - /// - private static void Preallocate() - { - Type[] typesToForceStaticCtor = - { - typeof(MyEntities), - typeof(MyMwcObjectBuilder_Base), - typeof(MyPrefabConstants), - typeof(MyGameplayConstants), - typeof(MyBuildingSpecifications), - typeof(MyVoxelCacheCellRenderHelper), - typeof(MyTransparentGeometry), - typeof(MyExplosionDebrisModel), - typeof(Physics.MyContactInfoCache), - typeof(Physics.MyTriangleCache), - typeof(Physics.MyContactConstraintModule), - typeof(Physics.MySensorModule), - typeof(Physics.MySensorInteractionModule), - typeof(Physics.MyRBInteractionModule), - typeof(Physics.MyRigidBodyModule), - }; - foreach (var type in typesToForceStaticCtor) - { - // this won't call the static ctor if it was already called - System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(type.TypeHandle); - } - } - - /// - /// Loads the data. - /// - private void LoadData() - { - int block1 = -1; - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyMinerGame::LoadData", ref block1); - MyMwcLog.WriteLine("MyMinerGame.LoadData() - START"); - MyMwcLog.IncreaseIndent(); - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyPerformanceTimer.LoadData"); - MyPerformanceTimer.LoadData(); - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyVoxelFiles.LoadData"); - MyVoxelFiles.LoadData(); - // Not using now - //MyClientServer.LoadData(); - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyAudio.LoadData"); - MyAudio.LoadData(); - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyGuiManager.LoadData"); - MyGuiManager.LoadData(); - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyGameplayCheats.LoadData"); - MyGameplayCheats.LoadData(); - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); - - MyMwcLog.DecreaseIndent(); - MyMwcLog.WriteLine("MyMinerGame.LoadData() - END"); - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(block1); - } - - - /// - /// Unloads the data. - /// - private void UnloadData() - { - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyMinerGame::UnloadData"); - MyMwcLog.WriteLine("MyMinerGame.UnloadData() - START"); - MyMwcLog.IncreaseIndent(); - - // TODO: Unload data probably not necessery because all data are loaded at start and dies at the end. No partial unload. - - // We must unload XACT sounds here, not in the background thread, because on Windows XP every XACT sound loaded in - // not-main thread is then not player (I can't hear it). - MyAudio.UnloadData(); - - MyGameplayCheats.UnloadData(); - - // Not using now - //MyClientServer.UnloadData(); - MyPerformanceTimer.UnloadData(); - - MyMwcLog.DecreaseIndent(); - MyMwcLog.WriteLine("MyMinerGame.UnloadData() - END"); - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); - } - - /// - /// Load graphics resources content. - /// - public override void LoadContent() - { - - - int block1 = -1; - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyMinerGame::LoadContent", ref block1); - base.LoadContent(); - - DefaultSurface = MyMinerGame.Static.GraphicsDevice.GetRenderTarget(0); - DefaultSurface.DebugName = "DefaultSurface"; - DefaultDepth = MyMinerGame.Static.GraphicsDevice.DepthStencilSurface; - DefaultDepth.DebugName = "DefaultDepth"; - - MyMwcLog.WriteLine("MyMinerGame.LoadContent() - START"); - MyMwcLog.IncreaseIndent(); - - MyVideoModeManager.UpdateScreenSize(); - - System.Drawing.Font systemfont = new System.Drawing.Font("Tahoma", 12f, FontStyle.Regular); - m_debugFont = new SharpDX.Direct3D9.Font(GraphicsDevice, systemfont); - - // GUI - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyGuiManager.LoadContent()"); - MyGuiManager.LoadContent(); - - // Models - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyModels.LoadContent()"); - MyModels.LoadContent(); - - // Render - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyRender.LoadContent();"); - MyRender.LoadContent(); - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyDebugDraw.LoadContent();"); - MyDebugDraw.LoadContent(); - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyDebugDrawCachedLines.LoadContent()"); - MyDebugDrawCachedLines.LoadContent(); - - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MySunGlare.LoadContent()"); - MySunGlare.LoadContent(); - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); - - MyMwcLog.DecreaseIndent(); - MyMwcLog.WriteLine("MyMinerGame.LoadContent() - END"); - - GC.Collect(); - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(block1); - } - - /// - /// Called when graphics resources need to be unloaded. Override this method to unload any game-specific graphics resources. - /// - public override void UnloadContent() - { - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyMinerGame::UnloadContent"); - MyMwcLog.WriteLine("MyMinerGame.UnloadContent() - START"); - MyMwcLog.IncreaseIndent(); - - if (m_debugFont != null) - { - m_debugFont.Dispose(); - m_debugFont = null; - } - - if (DefaultSurface != null) - { - DefaultSurface.Dispose(); - DefaultSurface = null; - } - if (DefaultDepth != null) - { - DefaultDepth.Dispose(); - DefaultDepth = null; - } - - // GUI - MyGuiManager.UnloadContent(); - - MyRender.UnloadContent(); - - MyTextureManager.UnloadContent(); - MyModels.UnloadContent(); - - // Global content - //Content.Unload(); - - // Render - MySunGlare.UnloadContent(); - - MyDebugDrawCachedLines.UnloadContent(); - MyDebugDraw.UnloadContent(); - - //MyRender.UnloadContent(); //it is unloaded in gui gameplay screen - - MyMwcLog.DecreaseIndent(); - MyMwcLog.WriteLine("MyMinerGame.UnloadContent() - END"); - - GraphicsDevice.SetStreamSource(0, null, 0, 0); - GraphicsDevice.Indices = null; - GraphicsDevice.VertexDeclaration = null; - GraphicsDevice.PixelShader = null; - GraphicsDevice.VertexShader = null; - for (int i = 0; i < 16; i++) - { - GraphicsDevice.SetTexture(i, null); - } - - base.UnloadContent(); - - GC.Collect(); - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); - } - - static void UpdateTimes(GameTime gameTime) - { - if (!IsPaused()) - { - TotalGamePlayTimeInMilliseconds = ((int) gameTime.TotalGameTime.TotalMilliseconds) - m_totalPauseTimeInMilliseconds; - } - TotalTimeInMilliseconds = (int)gameTime.TotalGameTime.TotalMilliseconds; - } - - // Switch pause on or off, depending on what mode is now - public static void SwitchPause() - { - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyMinerGame::SwitchPause"); - if (m_pauseActive) - { - // Going from PAUSED game to non-paused game - m_totalPauseTimeInMilliseconds += TotalTimeInMilliseconds - m_pauseStartTimeInMilliseconds; - m_pauseActive = false; - MyAudio.Resume(); - } - else - { - // Going from non-paused game to PAUSED game - m_pauseStartTimeInMilliseconds = TotalTimeInMilliseconds; - m_pauseActive = true; - MyAudio.Pause(); - } - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); - } - - // Set pause on/off - public static void SetPause(bool set) - { - m_pauseActive = set; - } - - // True if pause is active right now (game-play is paused) - public static bool IsPaused() - { - return m_pauseActive && MyMultiplayerGameplay.CanPauseGame; - } - - // Allows the game to run logic such as updating the world, checking for collisions, gathering input, and playing audio. - protected override void Update(GameTime gameTime) - { - if (m_debugFont == null) - return; - - // Apply video mode changes. - MyVideoModeManager.ApplyChanges(); - - // Update times in static member variables - UpdateTimes(gameTime); - - //if (MyMinerGame.IsDeviceResetted) - // MyVideoModeManager.UpdateAfterDeviceReset(); - - MyRender.GetRenderProfiler().StartProfilingBlock("Particles wait"); - MyParticlesManager.WaitUntilUpdateCompleted(); - MyRender.GetRenderProfiler().EndProfilingBlock(); - - MyRender.GetRenderProfiler().StartProfilingBlock("Receive Multiplayer Messages"); - MyMultiplayerPeers.Static.Update(); - MyRender.GetRenderProfiler().EndProfilingBlock(); - - int updateBlock = -1; - MyRender.GetRenderProfiler().StartProfilingBlock("Update", ref updateBlock); - - if (MyMwcFinalBuildConstants.EnableLoggingInDrawAndUpdateAndGuiLoops == true) - { - MyMwcLog.WriteLine("MyMinerGame.Update() - START"); - MyMwcLog.IncreaseIndent(); - MyMwcLog.WriteLine("Update - gameTime.ElapsedGameTime: " + gameTime.ElapsedGameTime.ToString()); - MyMwcLog.WriteLine("Update - gameTime.TotalGameTime: " + gameTime.TotalGameTime.ToString()); - - MyMwcLog.WriteLine("Max Garbage Generation: " + GC.MaxGeneration.ToString()); - for (int i = 0; i <= GC.MaxGeneration; ++i) - { - MyMwcLog.WriteLine("Generation " + i.ToString() + ": " + GC.CollectionCount(i).ToString() + - " collections"); - } - MyMwcLog.WriteLine("Total Memory: " + MyValueFormatter.GetFormatedLong(GC.GetTotalMemory(false)) + - " bytes"); - } - - // Inform us if there were some garbage collection - if (MyMwcFinalBuildConstants.EnableLoggingGarbageCollectionCalls) - { - int newGc = MyGarbageCollectionManager.GetGarbageCollectionsCountFromLastCall(); - if (newGc > 0) - { - MyMwcLog.WriteLine("####### Garbage collections from the last call: " + newGc + " #######"); - } - } - - - int updateManagersBlock = -1; - MyRender.GetRenderProfiler().StartProfilingBlock("UpdateManagers", ref updateManagersBlock); - - MyRender.GetRenderProfiler().EndProfilingBlock(updateManagersBlock); - - // Now I think that it's better if HandleInput is called after Update, because then input methods - // such as Shot() have up-to-date values such as position, forward vector, etc - int guiManagerBlock = -1; - MyRender.GetRenderProfiler().StartProfilingBlock("GuiManager", ref guiManagerBlock); - MyGuiManager.Update(); - MyRender.GetRenderProfiler().EndProfilingBlock(guiManagerBlock); - - //After guimanager update because of object world matrices updates of objects - MyParticlesManager.Update(); - - int inputBlock = -1; - MyRender.GetRenderProfiler().StartProfilingBlock("Input", ref inputBlock); - MyGuiManager.HandleInput(); - MyRender.GetRenderProfiler().EndProfilingBlock(inputBlock); - - int serverUpdateBlock = -1; - MyRender.GetRenderProfiler().StartProfilingBlock("MyClientServer.Update", ref serverUpdateBlock); - //MyClientServer.Update(); ti - MyRender.GetRenderProfiler().EndProfilingBlock(serverUpdateBlock); - - if (MyMwcFinalBuildConstants.SimulateSlowUpdate) - { - System.Threading.Thread.Sleep(7); - } - - int audioUpdateBlock = -1; - MyRender.GetRenderProfiler().StartProfilingBlock("MyAudio.Update", ref audioUpdateBlock); - MyAudio.Update(); - MyDialogues.Update(); - MyRender.GetRenderProfiler().EndProfilingBlock(audioUpdateBlock); - - int othersBlock = -1; - MyRender.GetRenderProfiler().StartProfilingBlock("Others", ref othersBlock); - - if (MyMwcFinalBuildConstants.EnableLoggingInDrawAndUpdateAndGuiLoops == true) - { - if (MyMwcLog.IsIndentKeyIncreased()) - { - MyMwcLog.DecreaseIndent(); - } - MyMwcLog.WriteLine("MyMinerGame.Update() - END"); - } - - ProcessInvoke(); - - if (OnGameUpdate != null) - OnGameUpdate(gameTime); - - base.Update(gameTime); - - MyRender.GetRenderProfiler().EndProfilingBlock(othersBlock); - - MyRender.GetRenderProfiler().EndProfilingBlock(updateBlock); - } - - - public static int ResetSleep = 0; - - protected override void Draw(GameTime gameTime) - { - if (m_debugFont == null) - return; - -// MyRender.GetRenderProfiler().StartProfilingBlock("MyMinerGame::Draw"); - - // if (MyMinerGame.IsDeviceResetted) - // return; - /* - if (ResetSleep > 0) - { - ResetSleep--; - GraphicsDevice.Clear(Color.Black); - if (ResetSleep == 0) - { - MyMwcLog.WriteLine("Reset sleep - START"); - MyTextureManager.ReloadTextures(false); - MyGuiManager.UpdateAfterDeviceReset(); - MyMwcLog.WriteLine("Reset sleep - END"); - } - return; - } */ - - if (MyMwcFinalBuildConstants.EnableLoggingInDrawAndUpdateAndGuiLoops) - { - MyMwcLog.WriteLine("MyMinerGame.Draw() - START"); - MyMwcLog.IncreaseIndent(); - MyMwcLog.WriteLine("Draw - gameTime.ElapsedGameTime: " + gameTime.ElapsedGameTime); - MyMwcLog.WriteLine("Draw - gameTime.TotalGameTime: " + gameTime.TotalGameTime); - } - - UpdateTimes(gameTime); - MyFpsManager.Update(); - - GraphicsDevice.Clear(ClearFlags.Target, new ColorBGRA(0.0f), 1, 0); - - if (GraphicsDevice.IsDisposed ) - { - //MyMwcLog.WriteLine("MyMinerGame.Draw() - MyFakes.ALLOW_RENDER_HACK == false... skipping Draw"); - //MyRender.GetRenderProfiler().EndProfilingBlock(); - return; - } - /* - // This hack is for PerfHUD. It will allow us to see correct PerfHUD GUI (not corrupted by some error), so we will see colors on graph menu. - if (MyMwcFinalBuildConstants.ENABLE_PERFHUD == true) - { - GraphicsDevice.DepthStencilState = DepthStencilState.Default; - } */ - - if (MyMwcFinalBuildConstants.SimulateSlowDraw == true) - { - System.Threading.Thread.Sleep(60); - } - - // MyRender.ResetStates(); - - MyGuiManager.Draw(); - - // This hack is for PerfHUD. It will allow us to see correct PerfHUD GUI (not corrupted by some error), so we will see colors on graph menu. - /*if (MyMwcFinalBuildConstants.ENABLE_PERFHUD == true) - { - GraphicsDevice.DepthStencilState = DepthStencilState.None; - } */ - - - DepthStencilState.None.Apply(); - RasterizerState.CullNone.Apply(); - BlendState.Opaque.Apply(); - - //m_debugFont.DrawText(null, MyFpsManager.GetFps().ToString() + " (" + MyFpsManager.FrameTimeAvg.ToString() + "ms) ", 0, 0, new ColorBGRA(1.0f, 1.0f, 1.0f, 1.0f)); - - - if (MyMwcFinalBuildConstants.EnableLoggingInDrawAndUpdateAndGuiLoops == true) - { - MyMwcLog.DecreaseIndent(); - MyMwcLog.WriteLine("MyMinerGame.Draw() - END"); - } - - base.Draw(gameTime); - - if (OnGameDraw != null) - OnGameDraw(gameTime); - } - - protected override bool BeginDraw() - { - MyRender.GetRenderProfiler().StartProfilingBlock("BeginDraw"); - bool ret = base.BeginDraw(); - MyRender.GetRenderProfiler().EndProfilingBlock(); - return ret; - } - - protected override void EndDraw() - { - MyRender.GetRenderProfiler().StartProfilingBlock("EndDraw"); - base.EndDraw(); - MyRender.GetRenderProfiler().EndProfilingBlock(); - } - - - /// - /// Invokes the specified action on main xna game thread and block until it is completed. - /// - /// The action. - public void Invoke(Action action, bool waitForInvoke) - { - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyMinerGame::Invoke"); - - var waiter = new ManualResetEvent(false); - - this.m_InvokeQueue.Enqueue(new Tuple(waiter, action)); - - if (waitForInvoke) - waiter.WaitOne(); - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); - } - - /// - /// Processes the invoke queue. - /// - private void ProcessInvoke() - { - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyMinerGame::ProcessInvoke"); - Tuple result; - while (this.m_InvokeQueue.TryDequeue(out result)) - { - result.Item2(); - result.Item1.Set(); - } - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); - } - - static void MyMinerGame_OnDeactivated(object sender, EventArgs e) - { - MyMwcLog.WriteLine("MyMinerGame.MyMinerGame_OnDeactivated"); - } - - static void MyMinerGame_OnActivated(object sender, EventArgs e) - { - MyMwcLog.WriteLine("MyMinerGame.MyMinerGame_OnActivated"); - } - - // We are unloading the game here (in this event), because when player presses Alt+F4 during loading phase, sometimes - // graphic device is disposed during we are unloading - with is weird. But this event finishes always before even - // graphic device disposing starts, so it's safe. - // Add any code that must execute before the game ends (e.g. when player suddenly presses Alt+F4) - void MyMinerGame_Exiting(object sender, EventArgs e) - { - MyMwcLog.WriteLine("MyMinerGame.MyMinerGame_Exiting"); - MySectorServiceClient.ClearAndClose(); // In case of exception on different thread - IsMouseVisible = true; - UnloadData(); - -// MinerWars.AppCode.Game.Render.MyOcclusionQuery.UnloadAllQueries(); - } - - static int m_renderTargetsCount = 0; - - public void SetDeviceViewport(Viewport viewport) - { - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyMinerGame::SetDeviceViewport"); - if (m_renderTargetsCount == 0) - { - if ((MyMinerGame.Static.GraphicsManager.PreferredBackBufferHeight >= (viewport.Height + viewport.Y)) - && (MyMinerGame.Static.GraphicsManager.PreferredBackBufferWidth >= (viewport.Width + viewport.X))) - { - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("set viewport"); - MyMinerGame.Static.GraphicsDevice.Viewport = viewport; - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); - } - else - { - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("change screen size"); - MyVideoModeManager.UpdateScreenSize(); - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); - } - } - else - { - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("set viewport"); - MyMinerGame.Static.GraphicsDevice.Viewport = viewport; - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); - } - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); - - } - - - private static void RestoreDefaultTargets() - { - MyMinerGame.Static.GraphicsDevice.SetRenderTarget(0, DefaultSurface); - MyMinerGame.Static.GraphicsDevice.SetRenderTarget(1, null); - MyMinerGame.Static.GraphicsDevice.SetRenderTarget(2, null); - MyMinerGame.Static.GraphicsDevice.DepthStencilSurface = DefaultDepth; - m_renderTargetsCount = 0; - } - - public static void SetRenderTarget(Texture rt, Texture depth, SetDepthTargetEnum depthOp = SetDepthTargetEnum.NoChange) - { - if (rt == null) - { - RestoreDefaultTargets(); - } - else - { - Surface surface = rt.GetSurfaceLevel(0); - MyMinerGame.Static.GraphicsDevice.SetRenderTarget(0, surface); - surface.Dispose(); - MyMinerGame.Static.GraphicsDevice.SetRenderTarget(1, null); - MyMinerGame.Static.GraphicsDevice.SetRenderTarget(2, null); - if (depth != null) - { - Surface dsurface = depth.GetSurfaceLevel(0); - MyMinerGame.Static.GraphicsDevice.DepthStencilSurface = dsurface; - dsurface.Dispose(); - } - else if (depthOp == SetDepthTargetEnum.RestoreDefault) - { - MyMinerGame.Static.GraphicsDevice.DepthStencilSurface = DefaultDepth; - } - - m_renderTargetsCount = 1; - } - } - - public static void SetRenderTargets(Texture[] rts, Texture depth, SetDepthTargetEnum depthOp = SetDepthTargetEnum.NoChange) - { - if (rts == null) - { - RestoreDefaultTargets(); - } - else - { - for (int i = 0; i < 3; i++) - { - if (i < rts.Length) - { - Surface surface = rts[i].GetSurfaceLevel(0); - MyMinerGame.Static.GraphicsDevice.SetRenderTarget(i, surface); - surface.Dispose(); - } - else - MyMinerGame.Static.GraphicsDevice.SetRenderTarget(i, null); - } - if (depth != null) - { - Surface surface = depth.GetSurfaceLevel(0); - MyMinerGame.Static.GraphicsDevice.DepthStencilSurface = surface; - surface.Dispose(); - } - else if (depthOp == SetDepthTargetEnum.RestoreDefault) - { - MyMinerGame.Static.GraphicsDevice.DepthStencilSurface = DefaultDepth; - } - - m_renderTargetsCount = rts.Length; - } - } - - public static bool IsMainThread() - { - return Thread.CurrentThread == Static.m_MainThread; - } - } -} +#region Using + +using System; +using System.Collections.Concurrent; +using System.Diagnostics; +using System.Reflection; +using System.Security.Principal; +using System.Threading; +using SysUtils; +using SysUtils.Utils; +using ParallelTasks; + +using MinerWars.AppCode.Game.Audio; +using MinerWars.AppCode.Game.Audio.Dialogues; +using MinerWars.AppCode.Game.Entities; +using MinerWars.AppCode.Game.Entities.FoundationFactory; +using MinerWars.AppCode.Game.Gameplay; +using MinerWars.AppCode.Game.GUI; +using MinerWars.AppCode.Game.GUI.Core; +using MinerWars.AppCode.Game.Localization; +using MinerWars.AppCode.Game.Managers; +using MinerWars.AppCode.Game.Models; +using MinerWars.AppCode.Game.Prefabs; +using MinerWars.AppCode.Game.Render; +using MinerWars.AppCode.Game.Sessions; +using MinerWars.AppCode.Game.Sessions.Multiplayer; +using MinerWars.AppCode.Game.Textures; +using MinerWars.AppCode.Game.TransparentGeometry; +using MinerWars.AppCode.Game.TransparentGeometry.Particles; +using MinerWars.AppCode.Game.Utils; +using MinerWars.AppCode.Game.VideoMode; +using MinerWars.AppCode.Game.Voxels; +using MinerWars.AppCode.Game.World.Global; +using MinerWars.AppCode.Networking; +using MinerWars.AppCode.Networking.SectorService; +using MinerWars.CommonLIB.AppCode.ObjectBuilders; +using MinerWars.CommonLIB.AppCode.Utils; + +//using MinerWarsMath; +//using MinerWarsMath.Graphics; + +using SharpDX; +using SharpDX.Toolkit; +using SharpDX.Direct3D; +using SharpDX.Direct3D9; +using System.Drawing; +using SharpDX.Toolkit.Graphics; +using MinerWars.AppCode.Toolkit.Input; +using System.IO; +using MinerWars.GameServices; + +#endregion + +namespace MinerWars.AppCode.App +{ + public delegate void OnInitEvent(SharpDX.Toolkit.Game game); + public delegate void OnDrawEvent(GameTime gt); + + public enum SetDepthTargetEnum + { + NoChange, + RestoreDefault, + } + + public class MyMinerGame : SharpDX.Toolkit.Game + { + public const string ContentDir = "Content"; + + public static MyMinerGame Static; + public static MyMwcVector2Int ScreenSize; + public static MyMwcVector2Int ScreenSizeHalf; + public static bool IsGameReady = true; + public static bool IsDeviceResetted = false; + + //events for external editors/scripts + internal static event OnInitEvent OnGameInit; + internal static event OnDrawEvent OnGameUpdate; + internal static event OnDrawEvent OnGameDraw; + + SharpDX.Direct3D9.Font m_debugFont; + + public string RootDirectory; + public string RootDirectoryDebug; + public string RootDirectoryEffects; + public static Surface DefaultSurface { get; private set; } + public static Surface DefaultDepth { get; private set; } + + public static ServiceContainer Services { get; private set; } + + // Total GAME-PLAY time in milliseconds. It doesn't change while game is paused. Use it only for game-play + // stuff (e.g. game logic, particles, etc). Do not use it for GUI or not game-play stuff. + public static int TotalGamePlayTimeInMilliseconds; + + // Total time independent of whether game is paused. It increments all the time, no matter if game is paused. + public static int TotalTimeInMilliseconds; + + // Helpers for knowing when pauses started and total time spent in pause mode (even if there were many pauses) + static int m_pauseStartTimeInMilliseconds; + static int m_totalPauseTimeInMilliseconds = 0; + static bool m_pauseActive; + + public static int NumberOfCores; + + private bool m_isGraphicsSupported; + + private static string m_gameDir; + + // Properties + public static string GameDir + { + get + { + if (m_gameDir == null) + { + m_gameDir = Services.AppDir; + } + return m_gameDir; + } + } + + protected override void EndRun() + { + base.EndRun(); + +#if DEBUG + var o = SharpDX.Diagnostics.ObjectTracker.FindActiveObjects(); + System.Diagnostics.Debug.Assert(o.Count == 0, "Unreleased DX objects!"); + Console.WriteLine(SharpDX.Diagnostics.ObjectTracker.ReportActiveObjects()); +#endif + } + + + /// + /// Queue of actions to be invoked on xna game thread. + /// + private readonly ConcurrentQueue> m_InvokeQueue; + + /// + /// Main xna init thread. + /// + private readonly Thread m_MainThread; + + #region Properties + + public static MyCustomGraphicsDeviceManagerDX GraphicsDeviceManager { get; private set; } + + public static bool IsGpuSupported() + { + foreach (int deviceId in MyMwcFinalBuildConstants.UNSUPPORTED_GPU_DEVICE_IDS) + { + //if (GraphicsDeviceManager.GraphicsDevice.id .Adapter.Description.DeviceId == deviceId) + { + // return false; + } + } + return true; + } + + /// + /// Gets a value indicating whether [invoke is required]. + /// + /// + /// true if [invoke required]; otherwise, false. + /// + public bool InvokeRequired + { + get + { + return Thread.CurrentThread != m_MainThread; + } + } + + #endregion + + public MyMinerGame(ServiceContainer services) + { + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyMinerGame()::constructor"); + MyMwcLog.WriteLine("MyMinerGame.Constructor() - START"); + MyMwcLog.IncreaseIndent(); + + Services = services; + + // we want check objectbuilders, prefab's configurations, gameplay constants and building specifications + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("Checks"); + MyMwcObjectBuilder_Base.Check(); + MyPrefabConstants.Check(); + MyGameplayConstants.Check(); + MyBuildingSpecifications.Check(); + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("Preallocate"); + + Preallocate(); + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("IsAdmin"); + WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent(); + WindowsPrincipal windowsPrincipal = new WindowsPrincipal(windowsIdentity); + bool IsAdmin = windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator); + MyMwcLog.WriteLine("IsAdmin " + IsAdmin.ToString()); + MyMwcLog.WriteLine("Game dir: " + GameDir); + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyCustomGraphicsDeviceManagerDX"); +#if !DEBUG + try + { +#endif + + this.Exiting += MyMinerGame_Exiting; + this.Activated += MyMinerGame_OnActivated; + this.Deactivated += MyMinerGame_OnDeactivated; + this.m_InvokeQueue = new ConcurrentQueue>(); + this.m_MainThread = Thread.CurrentThread; + + GraphicsDeviceManager = new MyCustomGraphicsDeviceManagerDX(this); + + m_isGraphicsSupported = GraphicsDeviceManager.ChangeProfileSupport(); + m_isGraphicsSupported = true; + + if (m_isGraphicsSupported) + { + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyVideoModeManager.HookEventHandlers"); + + MyVideoModeManager.HookEventHandlers(); + + //Content = new MyCustomContentManager(Services, ContentDir); + // Content = new SharpDX.Toolkit.Content.ContentManager(Services); + + RootDirectory = Path.Combine(GameDir, "Content"); + RootDirectoryDebug = Path.GetFullPath(System.IO.Path.Combine(GameDir, "..\\..\\..\\Content")); + + RootDirectoryEffects = RootDirectory; + + Static = this; + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("InitNumberOfCores"); + InitNumberOfCores(); + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyVideoModeManager.LogApplicationInformation"); + + + MyVideoModeManager.LogApplicationInformation(); + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyVideoModeManager.LogInformation"); + + MyVideoModeManager.LogInformation(); + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyVideoModeManager.LogEnvironmentInformation"); + + MyVideoModeManager.LogEnvironmentInformation(); + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyPlugins.LoadContent"); + + MyPlugins.LoadContent(); + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyConfig.Load"); + + MyConfig.Load(); + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyMath.Init"); + + MyMath.Init(); + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyTextsWrapper.Init"); + + MyTextsWrapper.Init(); + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyDialoguesWrapper.Init"); + + MyDialoguesWrapper.Init(); + + // If I don't set TargetElapsedTime, default value will be used, which is 60 times per second, and it will be more precise than if I calculate + // it like below - SO I MUST BE DOING THE WRONG CALCULATION !!! + // We use fixed timestep. Update() is called at this precise timesteps. If Update or Draw takes more time, Update will be called more time. Draw is called only after Update. +#if RENDER_PROFILING || GPU_PROFILING + IsFixedTimeStep = false; + MyMinerGame.GraphicsDeviceManager.SynchronizeWithVerticalRetrace = false; +#else + IsFixedTimeStep = MyFakes.FIXED_TIMESTEP; +#endif + + } + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("InitMultithreading"); + + InitMultithreading(); +#if !DEBUG + } + catch (Exception ex) + { + // We are catching exceptions in constructor, because if error occures here, it app will start unloading + // so we skip to UnloadContent and there we will get another exception (because app wasn't really loaded when unload started) + // So we want original exception in log. + MyMwcLog.WriteLine(ex); + throw; + } +#endif + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); + + MyMwcLog.DecreaseIndent(); + MyMwcLog.WriteLine("MyMinerGame.Constructor() - END"); + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); + } + + static void InitNumberOfCores() + { + // Get number of cores of local machine. As I don't know what values it can return, I clamp it to <1..4> (min 1 core, max 4 cores). That are tested values. I can't test eight cores... + NumberOfCores = Environment.ProcessorCount; + MyMwcLog.WriteLine("Found processor count: " + NumberOfCores); // What we found + NumberOfCores = MyMwcUtils.GetClampInt(NumberOfCores, 1, 16); + MyMwcLog.WriteLine("Using processor count: " + NumberOfCores); // What are we really going use + } + + /// + /// Inits the multithreading. + /// + private void InitMultithreading() + { + Parallel.Scheduler = new WorkStealingScheduler(NumberOfCores); + //Parallel.Scheduler = new SimpleScheduler(NumberOfCores); + } + + /// + /// Inicializes the quick launche. + /// + private void InitQuickLaunch() + { + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyMinerGame()::InitQuickLaunch"); + + MyMwcQuickLaunchType? quickLaunch = MyMwcFinalBuildConstants.QUICK_LAUNCH; + +#if AUTOBUILD + quickLaunch = MyMwcQuickLaunchType.NEW_STORY; +#endif + // This will work as auto-login, but it will not depend on auto-login config variable + // It just always tries to auto-login. If auto-login fails, normal login screen will be displayed. + string username = MyConfig.Username; + string password = MyConfig.Password; + + if (quickLaunch != null) + { + switch (quickLaunch.Value) + { + case MyMwcQuickLaunchType.EDITOR_SANDBOX: + { + MyGuiManager.AddScreen(new MyGuiScreenLoginProgress(username, password, + new MyGuiScreenStartQuickLaunch( + quickLaunch.Value, MyTextsWrapperEnum.StartEditorInProgressPleaseWait), null)); + } + break; + case MyMwcQuickLaunchType.LAST_SANDBOX: + case MyMwcQuickLaunchType.NEW_STORY: + { + MyGuiManager.AddScreen(new MyGuiScreenLoginProgress(username, password, + new MyGuiScreenStartQuickLaunch( + quickLaunch.Value, MyTextsWrapperEnum.StartGameInProgressPleaseWait), null)); + + } + break; + case MyMwcQuickLaunchType.LOAD_CHECKPOINT: + { + MyGuiManager.AddScreen(new MyGuiScreenLoginProgress(username, password, + new MyGuiScreenStartQuickLaunch( + quickLaunch.Value, MyTextsWrapperEnum.StartGameInProgressPleaseWait), null)); + } + break; + case MyMwcQuickLaunchType.SANDBOX_RANDOM: + { + MyGuiManager.AddScreen(new MyGuiScreenLoginProgress(username, password, + new MyGuiScreenStartQuickLaunch( + quickLaunch.Value, MyTextsWrapperEnum.StartGameInProgressPleaseWait), null)); + } + break; + default: + { + throw new MyMwcExceptionApplicationShouldNotGetHere(); + } + } + + } + else + { + if (MyFakes.MWBUILDER) + { + MyGuiManager.AddScreen(new MyGuiScreenLoginProgress(username, password, + new MyGuiScreenStartQuickLaunch( + MyMwcQuickLaunchType.EDITOR_SANDBOX, MyTextsWrapperEnum.StartEditorInProgressPleaseWait), null)); + } + else + { + if (MyFakes.ENABLE_LOGOS) + { + MyGuiManager.BackToIntroLogos(new Action(AfterLogos)); + } + else + { + AfterLogos(); + } + } + } + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); + } + + public static void AfterLogos() + { + MyGuiManager.BackToMainMenu(); + + if (MySteam.IsActive) + { + MyGuiScreenMainMenu.AddLoginScreenDrmFree((MyGuiScreenBase)null); + } + else + { + MyGuiScreenMainMenu.AddAutologinScreen(); + } + } + + public bool IsGraphicsSupported() + { + return m_isGraphicsSupported; + } + + // Allows the game to perform any initialization it needs to before starting to run. + // This is where it can query for any required services and load any non-graphic + // related content. Calling base.Initialize will enumerate through any components + // and initialize them as well. + protected override void Initialize() + { + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyMinerGame::Initialize"); + MyMwcLog.WriteLine("MyMinerGame.Initialize() - START"); + MyMwcLog.IncreaseIndent(); + + Window.NativeWindow.Text = "MinerWars 2081"; + ((System.Windows.Forms.Form)Window.NativeWindow).Icon = new System.Drawing.Icon("MinerWars.ico"); + + if (OnGameInit != null) + OnGameInit(this); + + MyVideoModeManager.Initialize(); + +#if !DEBUG + try + { +#endif + // Load data + LoadData(); + + // Load content + base.Initialize(); + + InitQuickLaunch(); + +#if !DEBUG + } + catch (Exception ex) + { + // We are catching exceptions in LoadContent, because if error occures here, it app will start unloading + // so we skip to UnloadContent and there we will get another exception (because app wasn't really loaded when unload started) + // So we want original exception in log. + MyMwcLog.WriteLine(ex); + throw; + } +#endif + + MyMwcLog.DecreaseIndent(); + MyMwcLog.WriteLine("MyMinerGame.Initialize() - END"); + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); + } + + public static void UpdateScreenSize() + { + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyMinerGame::UpdateScreenSize"); + + ScreenSize = new MyMwcVector2Int((int)MyMinerGame.Static.GraphicsDevice.Viewport.Width, (int)MyMinerGame.Static.GraphicsDevice.Viewport.Height); + ScreenSizeHalf = new MyMwcVector2Int(ScreenSize.X / 2, ScreenSize.Y / 2); + + if (MyGuiManager.GetScreenshot() != null) + { + ScreenSize.X = (int)(ScreenSize.X * MyGuiManager.GetScreenshot().SizeMultiplier); + ScreenSize.Y = (int)(ScreenSize.Y * MyGuiManager.GetScreenshot().SizeMultiplier); + ScreenSizeHalf = new MyMwcVector2Int(ScreenSize.X / 2, ScreenSize.Y / 2); + } + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); + } + + /// + /// Decrease fragmentation of the Large Object Heap by forcing static class constructors to run. + /// + private static void Preallocate() + { + Type[] typesToForceStaticCtor = + { + typeof(MyEntities), + typeof(MyMwcObjectBuilder_Base), + typeof(MyPrefabConstants), + typeof(MyGameplayConstants), + typeof(MyBuildingSpecifications), + typeof(MyVoxelCacheCellRenderHelper), + typeof(MyTransparentGeometry), + typeof(MyExplosionDebrisModel), + typeof(Physics.MyContactInfoCache), + typeof(Physics.MyTriangleCache), + typeof(Physics.MyContactConstraintModule), + typeof(Physics.MySensorModule), + typeof(Physics.MySensorInteractionModule), + typeof(Physics.MyRBInteractionModule), + typeof(Physics.MyRigidBodyModule), + }; + foreach (var type in typesToForceStaticCtor) + { + // this won't call the static ctor if it was already called + System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(type.TypeHandle); + } + } + + /// + /// Loads the data. + /// + private void LoadData() + { + int block1 = -1; + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyMinerGame::LoadData", ref block1); + MyMwcLog.WriteLine("MyMinerGame.LoadData() - START"); + MyMwcLog.IncreaseIndent(); + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyPerformanceTimer.LoadData"); + MyPerformanceTimer.LoadData(); + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyVoxelFiles.LoadData"); + MyVoxelFiles.LoadData(); + // Not using now + //MyClientServer.LoadData(); + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyAudio.LoadData"); + MyAudio.LoadData(); + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyGuiManager.LoadData"); + MyGuiManager.LoadData(); + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyGameplayCheats.LoadData"); + MyGameplayCheats.LoadData(); + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); + + MyMwcLog.DecreaseIndent(); + MyMwcLog.WriteLine("MyMinerGame.LoadData() - END"); + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(block1); + } + + + /// + /// Unloads the data. + /// + private void UnloadData() + { + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyMinerGame::UnloadData"); + MyMwcLog.WriteLine("MyMinerGame.UnloadData() - START"); + MyMwcLog.IncreaseIndent(); + + // TODO: Unload data probably not necessery because all data are loaded at start and dies at the end. No partial unload. + + // We must unload XACT sounds here, not in the background thread, because on Windows XP every XACT sound loaded in + // not-main thread is then not player (I can't hear it). + MyAudio.UnloadData(); + + MyGameplayCheats.UnloadData(); + + // Not using now + //MyClientServer.UnloadData(); + MyPerformanceTimer.UnloadData(); + + MyMwcLog.DecreaseIndent(); + MyMwcLog.WriteLine("MyMinerGame.UnloadData() - END"); + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); + } + + /// + /// Load graphics resources content. + /// + public override void LoadContent() + { + + + int block1 = -1; + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyMinerGame::LoadContent", ref block1); + base.LoadContent(); + + DefaultSurface = MyMinerGame.Static.GraphicsDevice.GetRenderTarget(0); + DefaultSurface.DebugName = "DefaultSurface"; + DefaultDepth = MyMinerGame.Static.GraphicsDevice.DepthStencilSurface; + DefaultDepth.DebugName = "DefaultDepth"; + + MyMwcLog.WriteLine("MyMinerGame.LoadContent() - START"); + MyMwcLog.IncreaseIndent(); + + MyVideoModeManager.UpdateScreenSize(); + + System.Drawing.Font systemfont = new System.Drawing.Font("Tahoma", 12f, FontStyle.Regular); + m_debugFont = new SharpDX.Direct3D9.Font(GraphicsDevice, systemfont); + + // GUI + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyGuiManager.LoadContent()"); + MyGuiManager.LoadContent(); + + // Models + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyModels.LoadContent()"); + MyModels.LoadContent(); + + // Render + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyRender.LoadContent();"); + MyRender.LoadContent(); + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyDebugDraw.LoadContent();"); + MyDebugDraw.LoadContent(); + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MyDebugDrawCachedLines.LoadContent()"); + MyDebugDrawCachedLines.LoadContent(); + + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartNextBlock("MySunGlare.LoadContent()"); + MySunGlare.LoadContent(); + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); + + MyMwcLog.DecreaseIndent(); + MyMwcLog.WriteLine("MyMinerGame.LoadContent() - END"); + + GC.Collect(); + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(block1); + } + + /// + /// Called when graphics resources need to be unloaded. Override this method to unload any game-specific graphics resources. + /// + public override void UnloadContent() + { + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyMinerGame::UnloadContent"); + MyMwcLog.WriteLine("MyMinerGame.UnloadContent() - START"); + MyMwcLog.IncreaseIndent(); + + if (m_debugFont != null) + { + m_debugFont.Dispose(); + m_debugFont = null; + } + + if (DefaultSurface != null) + { + DefaultSurface.Dispose(); + DefaultSurface = null; + } + if (DefaultDepth != null) + { + DefaultDepth.Dispose(); + DefaultDepth = null; + } + + // GUI + MyGuiManager.UnloadContent(); + + MyRender.UnloadContent(); + + MyTextureManager.UnloadContent(); + MyModels.UnloadContent(); + + // Global content + //Content.Unload(); + + // Render + MySunGlare.UnloadContent(); + + MyDebugDrawCachedLines.UnloadContent(); + MyDebugDraw.UnloadContent(); + + //MyRender.UnloadContent(); //it is unloaded in gui gameplay screen + + MyMwcLog.DecreaseIndent(); + MyMwcLog.WriteLine("MyMinerGame.UnloadContent() - END"); + + GraphicsDevice.SetStreamSource(0, null, 0, 0); + GraphicsDevice.Indices = null; + GraphicsDevice.VertexDeclaration = null; + GraphicsDevice.PixelShader = null; + GraphicsDevice.VertexShader = null; + for (int i = 0; i < 16; i++) + { + GraphicsDevice.SetTexture(i, null); + } + + base.UnloadContent(); + + GC.Collect(); + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); + } + + static void UpdateTimes(GameTime gameTime) + { + if (!IsPaused()) + { + TotalGamePlayTimeInMilliseconds = ((int) gameTime.TotalGameTime.TotalMilliseconds) - m_totalPauseTimeInMilliseconds; + } + TotalTimeInMilliseconds = (int)gameTime.TotalGameTime.TotalMilliseconds; + } + + // Switch pause on or off, depending on what mode is now + public static void SwitchPause() + { + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyMinerGame::SwitchPause"); + if (m_pauseActive) + { + // Going from PAUSED game to non-paused game + m_totalPauseTimeInMilliseconds += TotalTimeInMilliseconds - m_pauseStartTimeInMilliseconds; + m_pauseActive = false; + MyAudio.Resume(); + } + else + { + // Going from non-paused game to PAUSED game + m_pauseStartTimeInMilliseconds = TotalTimeInMilliseconds; + m_pauseActive = true; + MyAudio.Pause(); + } + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); + } + + // Set pause on/off + public static void SetPause(bool set) + { + m_pauseActive = set; + } + + // True if pause is active right now (game-play is paused) + public static bool IsPaused() + { + return m_pauseActive && MyMultiplayerGameplay.CanPauseGame; + } + + // Allows the game to run logic such as updating the world, checking for collisions, gathering input, and playing audio. + protected override void Update(GameTime gameTime) + { + if (m_debugFont == null) + return; + + // Apply video mode changes. + MyVideoModeManager.ApplyChanges(); + + // Update times in static member variables + UpdateTimes(gameTime); + + //if (MyMinerGame.IsDeviceResetted) + // MyVideoModeManager.UpdateAfterDeviceReset(); + + MyRender.GetRenderProfiler().StartProfilingBlock("Particles wait"); + MyParticlesManager.WaitUntilUpdateCompleted(); + MyRender.GetRenderProfiler().EndProfilingBlock(); + + MyRender.GetRenderProfiler().StartProfilingBlock("Receive Multiplayer Messages"); + MyMultiplayerPeers.Static.Update(); + MyRender.GetRenderProfiler().EndProfilingBlock(); + + int updateBlock = -1; + MyRender.GetRenderProfiler().StartProfilingBlock("Update", ref updateBlock); + + if (MyMwcFinalBuildConstants.EnableLoggingInDrawAndUpdateAndGuiLoops == true) + { + MyMwcLog.WriteLine("MyMinerGame.Update() - START"); + MyMwcLog.IncreaseIndent(); + MyMwcLog.WriteLine("Update - gameTime.ElapsedGameTime: " + gameTime.ElapsedGameTime.ToString()); + MyMwcLog.WriteLine("Update - gameTime.TotalGameTime: " + gameTime.TotalGameTime.ToString()); + + MyMwcLog.WriteLine("Max Garbage Generation: " + GC.MaxGeneration.ToString()); + for (int i = 0; i <= GC.MaxGeneration; ++i) + { + MyMwcLog.WriteLine("Generation " + i.ToString() + ": " + GC.CollectionCount(i).ToString() + + " collections"); + } + MyMwcLog.WriteLine("Total Memory: " + MyValueFormatter.GetFormatedLong(GC.GetTotalMemory(false)) + + " bytes"); + } + + // Inform us if there were some garbage collection + if (MyMwcFinalBuildConstants.EnableLoggingGarbageCollectionCalls) + { + int newGc = MyGarbageCollectionManager.GetGarbageCollectionsCountFromLastCall(); + if (newGc > 0) + { + MyMwcLog.WriteLine("####### Garbage collections from the last call: " + newGc + " #######"); + } + } + + + int updateManagersBlock = -1; + MyRender.GetRenderProfiler().StartProfilingBlock("UpdateManagers", ref updateManagersBlock); + + MyRender.GetRenderProfiler().EndProfilingBlock(updateManagersBlock); + + // Now I think that it's better if HandleInput is called after Update, because then input methods + // such as Shot() have up-to-date values such as position, forward vector, etc + int guiManagerBlock = -1; + MyRender.GetRenderProfiler().StartProfilingBlock("GuiManager", ref guiManagerBlock); + MyGuiManager.Update(); + MyRender.GetRenderProfiler().EndProfilingBlock(guiManagerBlock); + + //After guimanager update because of object world matrices updates of objects + MyParticlesManager.Update(); + + int inputBlock = -1; + MyRender.GetRenderProfiler().StartProfilingBlock("Input", ref inputBlock); + MyGuiManager.HandleInput(); + MyRender.GetRenderProfiler().EndProfilingBlock(inputBlock); + + int serverUpdateBlock = -1; + MyRender.GetRenderProfiler().StartProfilingBlock("MyClientServer.Update", ref serverUpdateBlock); + //MyClientServer.Update(); ti + MyRender.GetRenderProfiler().EndProfilingBlock(serverUpdateBlock); + + if (MyMwcFinalBuildConstants.SimulateSlowUpdate) + { + System.Threading.Thread.Sleep(7); + } + + int audioUpdateBlock = -1; + MyRender.GetRenderProfiler().StartProfilingBlock("MyAudio.Update", ref audioUpdateBlock); + MyAudio.Update(); + MyDialogues.Update(); + MyRender.GetRenderProfiler().EndProfilingBlock(audioUpdateBlock); + + int othersBlock = -1; + MyRender.GetRenderProfiler().StartProfilingBlock("Others", ref othersBlock); + + if (MyMwcFinalBuildConstants.EnableLoggingInDrawAndUpdateAndGuiLoops == true) + { + if (MyMwcLog.IsIndentKeyIncreased()) + { + MyMwcLog.DecreaseIndent(); + } + MyMwcLog.WriteLine("MyMinerGame.Update() - END"); + } + + ProcessInvoke(); + + if (OnGameUpdate != null) + OnGameUpdate(gameTime); + + base.Update(gameTime); + + MyRender.GetRenderProfiler().EndProfilingBlock(othersBlock); + + MyRender.GetRenderProfiler().EndProfilingBlock(updateBlock); + } + + + public static int ResetSleep = 0; + + protected override void Draw(GameTime gameTime) + { + if (m_debugFont == null) + return; + +// MyRender.GetRenderProfiler().StartProfilingBlock("MyMinerGame::Draw"); + + // if (MyMinerGame.IsDeviceResetted) + // return; + /* + if (ResetSleep > 0) + { + ResetSleep--; + GraphicsDevice.Clear(Color.Black); + if (ResetSleep == 0) + { + MyMwcLog.WriteLine("Reset sleep - START"); + MyTextureManager.ReloadTextures(false); + MyGuiManager.UpdateAfterDeviceReset(); + MyMwcLog.WriteLine("Reset sleep - END"); + } + return; + } */ + + if (MyMwcFinalBuildConstants.EnableLoggingInDrawAndUpdateAndGuiLoops) + { + MyMwcLog.WriteLine("MyMinerGame.Draw() - START"); + MyMwcLog.IncreaseIndent(); + MyMwcLog.WriteLine("Draw - gameTime.ElapsedGameTime: " + gameTime.ElapsedGameTime); + MyMwcLog.WriteLine("Draw - gameTime.TotalGameTime: " + gameTime.TotalGameTime); + } + + UpdateTimes(gameTime); + MyFpsManager.Update(); + + GraphicsDevice.Clear(ClearFlags.Target, new ColorBGRA(0.0f), 1, 0); + + if (GraphicsDevice.IsDisposed ) + { + //MyMwcLog.WriteLine("MyMinerGame.Draw() - MyFakes.ALLOW_RENDER_HACK == false... skipping Draw"); + //MyRender.GetRenderProfiler().EndProfilingBlock(); + return; + } + /* + // This hack is for PerfHUD. It will allow us to see correct PerfHUD GUI (not corrupted by some error), so we will see colors on graph menu. + if (MyMwcFinalBuildConstants.ENABLE_PERFHUD == true) + { + GraphicsDevice.DepthStencilState = DepthStencilState.Default; + } */ + + if (MyMwcFinalBuildConstants.SimulateSlowDraw == true) + { + System.Threading.Thread.Sleep(60); + } + + // MyRender.ResetStates(); + + MyGuiManager.Draw(); + + // This hack is for PerfHUD. It will allow us to see correct PerfHUD GUI (not corrupted by some error), so we will see colors on graph menu. + /*if (MyMwcFinalBuildConstants.ENABLE_PERFHUD == true) + { + GraphicsDevice.DepthStencilState = DepthStencilState.None; + } */ + + + DepthStencilState.None.Apply(); + RasterizerState.CullNone.Apply(); + BlendState.Opaque.Apply(); + + //m_debugFont.DrawText(null, MyFpsManager.GetFps().ToString() + " (" + MyFpsManager.FrameTimeAvg.ToString() + "ms) ", 0, 0, new ColorBGRA(1.0f, 1.0f, 1.0f, 1.0f)); + + + if (MyMwcFinalBuildConstants.EnableLoggingInDrawAndUpdateAndGuiLoops == true) + { + MyMwcLog.DecreaseIndent(); + MyMwcLog.WriteLine("MyMinerGame.Draw() - END"); + } + + base.Draw(gameTime); + + if (OnGameDraw != null) + OnGameDraw(gameTime); + } + + protected override bool BeginDraw() + { + MyRender.GetRenderProfiler().StartProfilingBlock("BeginDraw"); + bool ret = base.BeginDraw(); + MyRender.GetRenderProfiler().EndProfilingBlock(); + return ret; + } + + protected override void EndDraw() + { + MyRender.GetRenderProfiler().StartProfilingBlock("EndDraw"); + base.EndDraw(); + MyRender.GetRenderProfiler().EndProfilingBlock(); + } + + + /// + /// Invokes the specified action on main xna game thread and block until it is completed. + /// + /// The action. + public void Invoke(Action action, bool waitForInvoke) + { + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyMinerGame::Invoke"); + + var waiter = new ManualResetEvent(false); + + this.m_InvokeQueue.Enqueue(new Tuple(waiter, action)); + + if (waitForInvoke) + waiter.WaitOne(); + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); + } + + /// + /// Processes the invoke queue. + /// + private void ProcessInvoke() + { + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyMinerGame::ProcessInvoke"); + Tuple result; + while (this.m_InvokeQueue.TryDequeue(out result)) + { + result.Item2(); + result.Item1.Set(); + } + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); + } + + static void MyMinerGame_OnDeactivated(object sender, EventArgs e) + { + MyMwcLog.WriteLine("MyMinerGame.MyMinerGame_OnDeactivated"); + } + + static void MyMinerGame_OnActivated(object sender, EventArgs e) + { + MyMwcLog.WriteLine("MyMinerGame.MyMinerGame_OnActivated"); + } + + // We are unloading the game here (in this event), because when player presses Alt+F4 during loading phase, sometimes + // graphic device is disposed during we are unloading - with is weird. But this event finishes always before even + // graphic device disposing starts, so it's safe. + // Add any code that must execute before the game ends (e.g. when player suddenly presses Alt+F4) + void MyMinerGame_Exiting(object sender, EventArgs e) + { + MyMwcLog.WriteLine("MyMinerGame.MyMinerGame_Exiting"); + MySectorServiceClient.ClearAndClose(); // In case of exception on different thread + IsMouseVisible = true; + UnloadData(); + +// MinerWars.AppCode.Game.Render.MyOcclusionQuery.UnloadAllQueries(); + } + + static int m_renderTargetsCount = 0; + + public void SetDeviceViewport(Viewport viewport) + { + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyMinerGame::SetDeviceViewport"); + if (m_renderTargetsCount == 0) + { + if ((MyMinerGame.Static.GraphicsManager.PreferredBackBufferHeight >= (viewport.Height + viewport.Y)) + && (MyMinerGame.Static.GraphicsManager.PreferredBackBufferWidth >= (viewport.Width + viewport.X))) + { + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("set viewport"); + MyMinerGame.Static.GraphicsDevice.Viewport = viewport; + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); + } + else + { + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("change screen size"); + MyVideoModeManager.UpdateScreenSize(); + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); + } + } + else + { + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("set viewport"); + MyMinerGame.Static.GraphicsDevice.Viewport = viewport; + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); + } + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); + + } + + + private static void RestoreDefaultTargets() + { + MyMinerGame.Static.GraphicsDevice.SetRenderTarget(0, DefaultSurface); + MyMinerGame.Static.GraphicsDevice.SetRenderTarget(1, null); + MyMinerGame.Static.GraphicsDevice.SetRenderTarget(2, null); + MyMinerGame.Static.GraphicsDevice.DepthStencilSurface = DefaultDepth; + m_renderTargetsCount = 0; + } + + public static void SetRenderTarget(Texture rt, Texture depth, SetDepthTargetEnum depthOp = SetDepthTargetEnum.NoChange) + { + if (rt == null) + { + RestoreDefaultTargets(); + } + else + { + Surface surface = rt.GetSurfaceLevel(0); + MyMinerGame.Static.GraphicsDevice.SetRenderTarget(0, surface); + surface.Dispose(); + MyMinerGame.Static.GraphicsDevice.SetRenderTarget(1, null); + MyMinerGame.Static.GraphicsDevice.SetRenderTarget(2, null); + if (depth != null) + { + Surface dsurface = depth.GetSurfaceLevel(0); + MyMinerGame.Static.GraphicsDevice.DepthStencilSurface = dsurface; + dsurface.Dispose(); + } + else if (depthOp == SetDepthTargetEnum.RestoreDefault) + { + MyMinerGame.Static.GraphicsDevice.DepthStencilSurface = DefaultDepth; + } + + m_renderTargetsCount = 1; + } + } + + public static void SetRenderTargets(Texture[] rts, Texture depth, SetDepthTargetEnum depthOp = SetDepthTargetEnum.NoChange) + { + if (rts == null) + { + RestoreDefaultTargets(); + } + else + { + for (int i = 0; i < 3; i++) + { + if (i < rts.Length) + { + Surface surface = rts[i].GetSurfaceLevel(0); + MyMinerGame.Static.GraphicsDevice.SetRenderTarget(i, surface); + surface.Dispose(); + } + else + MyMinerGame.Static.GraphicsDevice.SetRenderTarget(i, null); + } + if (depth != null) + { + Surface surface = depth.GetSurfaceLevel(0); + MyMinerGame.Static.GraphicsDevice.DepthStencilSurface = surface; + surface.Dispose(); + } + else if (depthOp == SetDepthTargetEnum.RestoreDefault) + { + MyMinerGame.Static.GraphicsDevice.DepthStencilSurface = DefaultDepth; + } + + m_renderTargetsCount = rts.Length; + } + } + + public static bool IsMainThread() + { + return Thread.CurrentThread == Static.m_MainThread; + } + } +} diff --git a/Sources/MinerWars.GameLib/AppCode/Game/Effects/BaseEffects/MyEffectBase.cs b/Sources/MinerWars.GameLib/AppCode/Game/Effects/BaseEffects/MyEffectBase.cs index 38934c6..47a40ae 100644 --- a/Sources/MinerWars.GameLib/AppCode/Game/Effects/BaseEffects/MyEffectBase.cs +++ b/Sources/MinerWars.GameLib/AppCode/Game/Effects/BaseEffects/MyEffectBase.cs @@ -16,7 +16,8 @@ namespace MinerWars.AppCode.Game.Effects using Vector2 = MinerWarsMath.Vector2; using Vector3 = MinerWarsMath.Vector3; using Matrix = MinerWarsMath.Matrix; - using System; + using System; + using System.Diagnostics; // Base class for all effects public abstract class MyEffectBase : IDisposable @@ -40,34 +41,36 @@ protected MyEffectBase(Effect xnaEffect) } protected MyEffectBase(string asset) - { - string curdir = System.IO.Directory.GetCurrentDirectory(); - System.IO.Directory.SetCurrentDirectory(System.IO.Path.GetDirectoryName(MyMinerGame.Static.RootDirectoryEffects + "\\" + asset)); - - string sourceFX = Path.GetFileName(asset + ".fx"); - string compiledFX = Path.GetFileName(asset + ".fxo"); - - bool needRecompile = false; - if (File.Exists(compiledFX)) - { - if (File.Exists(sourceFX)) - { - DateTime compiledTime = File.GetLastWriteTime(compiledFX); - DateTime sourceTime = File.GetLastWriteTime(sourceFX); - if (sourceTime > compiledTime) - needRecompile = true; - } + { + string curdir = System.IO.Directory.GetCurrentDirectory(); + bool needRecompile = false; + + System.IO.Directory.SetCurrentDirectory(System.IO.Path.GetDirectoryName(MyMinerGame.Static.RootDirectoryEffects + "\\" + asset)); + + SetEffectInDebug(asset); + + string sourceFX = Path.GetFileName(asset + ".fx"); + string compiledFX = Path.GetFileName(asset + ".fxo"); + + if (File.Exists(compiledFX)) + { + if (File.Exists(sourceFX)) + { + DateTime compiledTime = File.GetLastWriteTime(compiledFX); + DateTime sourceTime = File.GetLastWriteTime(sourceFX); + if (sourceTime > compiledTime) + needRecompile = true; + } + } + else + { + if (File.Exists(sourceFX)) + needRecompile = true; + else + { + throw new FileNotFoundException("Effect not found: " + asset); + } } - else - { - if (File.Exists(sourceFX)) - needRecompile = true; - else - { - throw new FileNotFoundException("Effect not found: " + asset); - } - } - //Nepouzivat ShaderFlags.PartialPrecision, kurvi to na GeForce6600 ShaderFlags flags = ShaderFlags.OptimizationLevel3 | ShaderFlags.SkipValidation; @@ -76,9 +79,10 @@ protected MyEffectBase(string asset) //#if DEBUG // flags |= ShaderFlags.Debug; //#endif - //m_D3DEffect = Effect.FromFile(MyMinerGameDX.Static.GraphicsDevice, sourceFX, flags); - - ShaderBytecode shaderByteCode = ShaderBytecode.CompileFromFile(sourceFX, "fx_2_0", flags); + //m_D3DEffect = Effect.FromFile(MyMinerGameDX.Static.GraphicsDevice, sourceFX, flags); + + ShaderBytecode shaderByteCode = ShaderBytecode.CompileFromFile(sourceFX, "fx_2_0", flags); + System.IO.Directory.SetCurrentDirectory(System.IO.Path.GetDirectoryName(MyMinerGame.Static.RootDirectoryEffects + "\\" + asset)); shaderByteCode.Save(compiledFX); shaderByteCode.Dispose(); } @@ -94,6 +98,13 @@ protected MyEffectBase(string asset) System.IO.Directory.SetCurrentDirectory(curdir); Init(); + } + + [Conditional("DEBUG")] + private static void SetEffectInDebug(string asset) + { + string sourcePath = @"D:\Github\Miner-Wars-2081\"; + System.IO.Directory.SetCurrentDirectory(System.IO.Path.GetDirectoryName(sourcePath + "\\" + asset.Replace("Effects2", "Effects"))); } private void Init() diff --git a/Sources/MinerWars.GameLib/AppCode/Game/Effects/MyEffectModelsDNS.cs b/Sources/MinerWars.GameLib/AppCode/Game/Effects/MyEffectModelsDNS.cs index 39a8b3b..3d519d5 100644 --- a/Sources/MinerWars.GameLib/AppCode/Game/Effects/MyEffectModelsDNS.cs +++ b/Sources/MinerWars.GameLib/AppCode/Game/Effects/MyEffectModelsDNS.cs @@ -1,425 +1,427 @@ using MinerWars.AppCode.Game.Utils; using MinerWars.AppCode.Game.Render; -using SharpDX.Direct3D9; - -namespace MinerWars.AppCode.Game.Effects -{ - using Vector2 = MinerWarsMath.Vector2; - using Vector3 = MinerWarsMath.Vector3; - using Matrix = MinerWarsMath.Matrix; - - class MyEffectModelsDNS : MyEffectBase - { - public enum MyEffectModelsDNSTechniqueEnum - { - Low, - //LowInstanced, - LowBlended, - LowMasked, - - Normal, - //Normalnstanced, - NormalBlended, - NormalMasked, - - High, - //HighInstanced, - HighBlended, - HighMasked, - //HighChannels, - - Extreme, - //ExtremeInstanced, - ExtremeBlended, - ExtremeMasked, - //ExtremeChannels, - - Holo, - HoloForward, - HoloIgnoreDepth, - - Stencil, - StencilLow, - - //StencilInstanced, - //StencilLowInstanced, - - LowForward, - LowBlendedForward, - } - - readonly EffectHandle m_viewMatrix; - readonly EffectHandle m_worldMatrix; - readonly EffectHandle m_projectionMatrix; - readonly EffectHandle m_textureDiffuse; - readonly EffectHandle m_textureNormal; - readonly EffectHandle m_emissivity; - readonly EffectHandle m_emissivityOffset; - readonly EffectHandle m_emissivityUVAnim; - readonly EffectHandle m_diffuseUVAnim; - readonly EffectHandle m_diffuseColor; - readonly EffectHandle m_specularIntensity; - readonly EffectHandle m_specularPower; - readonly EffectHandle m_highlightColor; - - readonly EffectHandle m_depthTextureNear; - readonly EffectHandle m_depthTextureFar; - readonly EffectHandle m_halfPixel; - readonly EffectHandle m_scale; - - //readonly EffectHandle m_maskTexture; - //readonly EffectHandle[] m_channelTexture; - //readonly EffectHandle[] m_channelIntensities; - - public MyEffectDynamicLightingBase DynamicLights { get; private set; } - public MyEffectReflectorBase Reflector { get; private set; } - - bool m_diffuseTextureSet = false; - bool m_normalTextureSet = false; - bool m_specularTextureSet = false; - - //Techniques - EffectHandle m_lowTechnique; - //EffectHandle m_lowInstancedTechnique; - EffectHandle m_lowBlendedTechnique; - EffectHandle m_lowMaskedTechnique; - - EffectHandle m_normalTechnique; - //EffectHandle m_normalInstancedTechnique; - EffectHandle m_normalBlendedTechnique; - EffectHandle m_normalMaskedTechnique; - - EffectHandle m_highTechnique; - //EffectHandle m_highInstancedTechnique; - EffectHandle m_highBlendedTechnique; - EffectHandle m_highMaskedTechnique; - //EffectHandle m_highChannelsTechnique; - - EffectHandle m_extremeTechnique; - //EffectHandle m_extremeInstancedTechnique; - EffectHandle m_extremeBlendedTechnique; - EffectHandle m_extremeMaskedTechnique; - //EffectHandle m_extremeChannelsTechnique; - - EffectHandle m_holoTechnique; - EffectHandle m_holoForwardTechnique; - EffectHandle m_holoIgnoreDepthTechnique; - - EffectHandle m_stencilTechnique; - EffectHandle m_stencilLowTechnique; - - //EffectHandle m_stencilTechniqueInstanced; - //EffectHandle m_stencilLowTechniqueInstanced; - - EffectHandle m_forwardTechnique; - EffectHandle m_lowBlendedForwardTechnique; - - - float m_emissivityLocal; - float m_emissivityOffsetLocal; - Vector2 m_emissivityUVAnimLocal; - Vector2 m_diffuseUVAnimLocal; - Vector3 m_diffuseColorLocal; - float m_specularIntensityLocal; - float m_specularPowerLocal; - Vector3 m_highlightColorLocal; - int m_screenSizeXLocal; - int m_screenSizeYLocal; - Vector2 m_scaleLocal; - - - public MyEffectModelsDNS() - : base("Effects2\\Models\\MyEffectModelsDNS") - { - m_viewMatrix = m_D3DEffect.GetParameter(null, "ViewMatrix"); - m_worldMatrix = m_D3DEffect.GetParameter(null, "WorldMatrix"); - m_projectionMatrix = m_D3DEffect.GetParameter(null, "ProjectionMatrix"); - - m_textureDiffuse = m_D3DEffect.GetParameter(null, "TextureDiffuse"); - m_textureNormal = m_D3DEffect.GetParameter(null, "TextureNormal"); - m_diffuseColor = m_D3DEffect.GetParameter(null, "DiffuseColor"); - m_emissivity = m_D3DEffect.GetParameter(null, "Emissivity"); - m_emissivityOffset = m_D3DEffect.GetParameter(null, "EmissivityOffset"); - m_emissivityUVAnim = m_D3DEffect.GetParameter(null, "EmissivityUVAnim"); - m_diffuseUVAnim = m_D3DEffect.GetParameter(null, "DiffuseUVAnim"); - m_specularIntensity = m_D3DEffect.GetParameter(null, "SpecularIntensity"); - m_specularPower = m_D3DEffect.GetParameter(null, "SpecularPower"); - m_highlightColor = m_D3DEffect.GetParameter(null, "Highlight"); - - m_depthTextureNear = m_D3DEffect.GetParameter(null, "DepthTextureNear"); - m_depthTextureFar = m_D3DEffect.GetParameter(null, "DepthTextureFar"); - m_halfPixel = m_D3DEffect.GetParameter(null, "HalfPixel"); - m_scale = m_D3DEffect.GetParameter(null, "Scale"); - - m_lowTechnique = m_D3DEffect.GetTechnique("Technique_RenderQualityLow"); - //m_lowInstancedTechnique = m_xnaEffect.GetTechnique("Technique_RenderQualityLowInstanced"); - m_lowBlendedTechnique = m_D3DEffect.GetTechnique("Technique_RenderQualityLowBlended"); - m_lowMaskedTechnique = m_D3DEffect.GetTechnique("Technique_RenderQualityLowMasked"); - - m_normalTechnique = m_D3DEffect.GetTechnique("Technique_RenderQualityNormal"); - //m_normalInstancedTechnique = m_xnaEffect.GetTechnique("Technique_RenderQualityNormalInstanced"); - m_normalBlendedTechnique = m_D3DEffect.GetTechnique("Technique_RenderQualityNormalBlended"); - m_normalMaskedTechnique = m_D3DEffect.GetTechnique("Technique_RenderQualityNormalMasked"); - - m_highTechnique = m_D3DEffect.GetTechnique("Technique_RenderQualityHigh"); - //m_highInstancedTechnique = m_xnaEffect.GetTechnique("Technique_RenderQualityHighInstanced"); - m_highBlendedTechnique = m_D3DEffect.GetTechnique("Technique_RenderQualityHighBlended"); - m_highMaskedTechnique = m_D3DEffect.GetTechnique("Technique_RenderQualityHighMasked"); - //m_highChannelsTechnique = m_xnaEffect.GetTechnique("Technique_RenderQualityHighChannels"); - - m_extremeTechnique = m_D3DEffect.GetTechnique("Technique_RenderQualityHigh"); - //m_extremeInstancedTechnique = m_xnaEffect.GetTechnique("Technique_RenderQualityExtremeInstanced"); - m_extremeBlendedTechnique = m_D3DEffect.GetTechnique("Technique_RenderQualityHighBlended"); - m_extremeMaskedTechnique = m_D3DEffect.GetTechnique("Technique_RenderQualityHighMasked"); - //m_extremeChannelsTechnique = m_xnaEffect.GetTechnique("Technique_RenderQualityHighChannels"); - - m_holoTechnique = m_D3DEffect.GetTechnique("Technique_Holo"); - m_holoForwardTechnique = m_D3DEffect.GetTechnique("Technique_HoloForward"); - m_holoIgnoreDepthTechnique = m_D3DEffect.GetTechnique("Technique_Holo_IgnoreDepth"); - - m_stencilTechnique = m_D3DEffect.GetTechnique("Technique_Stencil"); - m_stencilLowTechnique = m_D3DEffect.GetTechnique("Technique_StencilLow"); - - //m_stencilTechniqueInstanced = m_xnaEffect.GetTechnique("Technique_StencilInstanced"); - //m_stencilLowTechniqueInstanced = m_xnaEffect.GetTechnique("Technique_StencilLowInstanced"); - - m_forwardTechnique = m_D3DEffect.GetTechnique("Technique_RenderQualityLow_Forward"); - m_lowBlendedForwardTechnique = m_D3DEffect.GetTechnique("Technique_RenderQualityLowBlended_Forward"); - - DynamicLights = new MyEffectDynamicLightingBase(m_D3DEffect); - Reflector = new MyEffectReflectorBase(m_D3DEffect); - } - - public void SetWorldMatrix(Matrix worldMatrix) - { - m_D3DEffect.SetValue(m_worldMatrix, worldMatrix); - } - - public override void SetViewMatrix(ref Matrix viewMatrix) - { - m_D3DEffect.SetValue(m_viewMatrix, viewMatrix); - } - - public override void SetProjectionMatrix(ref Matrix projectionMatrix) - { - m_D3DEffect.SetValue(m_projectionMatrix, projectionMatrix); - } - - public override void SetTextureDiffuse(Texture texture2D) - { - m_D3DEffect.SetTexture(m_textureDiffuse, texture2D); - m_diffuseTextureSet = texture2D != null; - } - - public override void SetTextureNormal(Texture texture2D) - { - m_D3DEffect.SetTexture(m_textureNormal, texture2D); - m_normalTextureSet = texture2D != null; - } - - public override bool IsTextureDiffuseSet() - { - return m_diffuseTextureSet; - } - - public override bool IsTextureSpecularSet() - { - return m_specularTextureSet; - } - - public override bool IsTextureNormalSet() - { - return m_normalTextureSet; - } - - public override void SetDiffuseColor(Vector3 diffuseColor) - { - m_D3DEffect.SetValue(m_diffuseColor, diffuseColor); - } - public override void SetEmissivity(float emissivity) - { - if (m_emissivityLocal != emissivity) - { - m_D3DEffect.SetValue(m_emissivity, emissivity); - m_emissivityLocal = emissivity; - } - } - public override void SetEmissivityOffset(float emissivityOffset) - { - if (m_emissivityOffsetLocal != emissivityOffset) - { - m_D3DEffect.SetValue(m_emissivityOffset, emissivityOffset); - m_emissivityOffsetLocal = emissivityOffset; - } - } - public override void SetEmissivityUVAnim(Vector2 uvAnim) - { - if (m_emissivityUVAnimLocal != uvAnim) - { - m_D3DEffect.SetValue(m_emissivityUVAnim, uvAnim); - m_emissivityUVAnimLocal = uvAnim; - } - } - - public override void SetDiffuseUVAnim(Vector2 uvAnim) - { - if (m_diffuseUVAnimLocal != uvAnim) - { - m_D3DEffect.SetValue(m_diffuseUVAnim, uvAnim); - m_diffuseUVAnimLocal = uvAnim; - } - } - - - public override void SetSpecularIntensity(float specularIntensity) - { - if (m_specularIntensityLocal != specularIntensity) - { - m_D3DEffect.SetValue(m_specularIntensity, specularIntensity); - m_specularIntensityLocal = specularIntensity; - } - } - public override void SetSpecularPower(float specularPower) - { - if (m_specularPowerLocal != specularPower) - { - m_D3DEffect.SetValue(m_specularPower, specularPower); - m_specularPowerLocal = specularPower; - } - } - - public override void SetHighlightColor(Vector3 highlightColor) - { - if (m_highlightColorLocal != highlightColor) - { - m_D3DEffect.SetValue(m_highlightColor, highlightColor); - m_highlightColorLocal = highlightColor; - } - } - - public void SetDepthTextureNear(Texture depthTextureNear) - { - m_D3DEffect.SetTexture(m_depthTextureNear, depthTextureNear); - } - - public void SetDepthTextureFar(Texture depthTextureFar) - { - m_D3DEffect.SetTexture(m_depthTextureFar, depthTextureFar); - } - - public void SetHalfPixel(int screenSizeX, int screenSizeY) - { - if (m_screenSizeXLocal != screenSizeX || m_screenSizeYLocal != screenSizeY) - { - m_D3DEffect.SetValue(m_halfPixel, MyUtils.GetHalfPixel(screenSizeX, screenSizeY)); - m_screenSizeXLocal = screenSizeX; - m_screenSizeYLocal = screenSizeY; - } - } - - public void SetScale(Vector2 scale) - { - if (m_scaleLocal != scale) - { - m_D3DEffect.SetValue(m_scale, scale); - m_scaleLocal = scale; - } - } - - - public void SetTechnique(MyEffectModelsDNSTechniqueEnum technique) - { - if (MyRenderConstants.RenderQualityProfile.ForwardRender) - { - switch (technique) - { - case MyEffectModelsDNSTechniqueEnum.Holo: - case MyEffectModelsDNSTechniqueEnum.HoloIgnoreDepth: - m_D3DEffect.Technique = m_holoForwardTechnique; - return; - break; - case MyEffectModelsDNSTechniqueEnum.Low: - case MyEffectModelsDNSTechniqueEnum.LowMasked: - m_D3DEffect.Technique = m_forwardTechnique; - return; - break; - } - } - - switch (technique) - { - case MyEffectModelsDNSTechniqueEnum.Low: - case MyEffectModelsDNSTechniqueEnum.LowBlended: - m_D3DEffect.Technique = m_lowTechnique; - break; - //case MyEffectModelsDNSTechniqueEnum.LowInstanced: - // m_xnaEffect.Technique = m_lowInstancedTechnique; - // break; - //case MyEffectModelsDNSTechniqueEnum.LowBlended: - //m_xnaEffect.Technique = m_lowBlendedTechnique; - // break; - case MyEffectModelsDNSTechniqueEnum.LowMasked: - m_D3DEffect.Technique = m_lowMaskedTechnique; - break; - - case MyEffectModelsDNSTechniqueEnum.Normal: - m_D3DEffect.Technique = m_normalTechnique; - break; - //case MyEffectModelsDNSTechniqueEnum.Normalnstanced: - //m_xnaEffect.Technique = m_normalInstancedTechnique; - // break; - case MyEffectModelsDNSTechniqueEnum.NormalBlended: - m_D3DEffect.Technique = m_normalBlendedTechnique; - break; - case MyEffectModelsDNSTechniqueEnum.NormalMasked: - m_D3DEffect.Technique = m_normalMaskedTechnique; - break; - - case MyEffectModelsDNSTechniqueEnum.High: - m_D3DEffect.Technique = m_highTechnique; - break; - //case MyEffectModelsDNSTechniqueEnum.HighInstanced: - // m_xnaEffect.Technique = m_highInstancedTechnique; - // break; - case MyEffectModelsDNSTechniqueEnum.HighBlended: - m_D3DEffect.Technique = m_highBlendedTechnique; - break; - case MyEffectModelsDNSTechniqueEnum.HighMasked: - m_D3DEffect.Technique = m_highMaskedTechnique; +using SharpDX.Direct3D9; + +namespace MinerWars.AppCode.Game.Effects +{ + using Vector2 = MinerWarsMath.Vector2; + using Vector3 = MinerWarsMath.Vector3; + using Matrix = MinerWarsMath.Matrix; + + class MyEffectModelsDNS : MyEffectBase + { + public enum MyEffectModelsDNSTechniqueEnum + { + Low, + //LowInstanced, + LowBlended, + LowMasked, + + Normal, + //Normalnstanced, + NormalBlended, + NormalMasked, + + High, + //HighInstanced, + HighBlended, + HighMasked, + //HighChannels, + + Extreme, + //ExtremeInstanced, + ExtremeBlended, + ExtremeMasked, + //ExtremeChannels, + + Holo, + HoloForward, + HoloIgnoreDepth, + + Stencil, + StencilLow, + + //StencilInstanced, + //StencilLowInstanced, + + LowForward, + LowBlendedForward, + } + + readonly EffectHandle m_viewMatrix; + readonly EffectHandle m_worldMatrix; + readonly EffectHandle m_projectionMatrix; + readonly EffectHandle m_textureDiffuse; + readonly EffectHandle m_textureNormal; + readonly EffectHandle m_emissivity; + readonly EffectHandle m_emissivityOffset; + readonly EffectHandle m_emissivityUVAnim; + readonly EffectHandle m_diffuseUVAnim; + readonly EffectHandle m_diffuseColor; + readonly EffectHandle m_specularIntensity; + readonly EffectHandle m_specularPower; + readonly EffectHandle m_highlightColor; + + readonly EffectHandle m_depthTextureNear; + readonly EffectHandle m_depthTextureFar; + readonly EffectHandle m_halfPixel; + readonly EffectHandle m_scale; + + //readonly EffectHandle m_maskTexture; + //readonly EffectHandle[] m_channelTexture; + //readonly EffectHandle[] m_channelIntensities; + + public MyEffectDynamicLightingBase DynamicLights { get; private set; } + public MyEffectReflectorBase Reflector { get; private set; } + + bool m_diffuseTextureSet = false; + bool m_normalTextureSet = false; + bool m_specularTextureSet = false; + + //Techniques + EffectHandle m_lowTechnique; + //EffectHandle m_lowInstancedTechnique; + EffectHandle m_lowBlendedTechnique; + EffectHandle m_lowMaskedTechnique; + + EffectHandle m_normalTechnique; + //EffectHandle m_normalInstancedTechnique; + EffectHandle m_normalBlendedTechnique; + EffectHandle m_normalMaskedTechnique; + + EffectHandle m_highTechnique; + //EffectHandle m_highInstancedTechnique; + EffectHandle m_highBlendedTechnique; + EffectHandle m_highMaskedTechnique; + //EffectHandle m_highChannelsTechnique; + + EffectHandle m_extremeTechnique; + //EffectHandle m_extremeInstancedTechnique; + EffectHandle m_extremeBlendedTechnique; + EffectHandle m_extremeMaskedTechnique; + //EffectHandle m_extremeChannelsTechnique; + + EffectHandle m_holoTechnique; + EffectHandle m_holoForwardTechnique; + EffectHandle m_holoIgnoreDepthTechnique; + + EffectHandle m_stencilTechnique; + EffectHandle m_stencilLowTechnique; + + //EffectHandle m_stencilTechniqueInstanced; + //EffectHandle m_stencilLowTechniqueInstanced; + + EffectHandle m_forwardTechnique; + EffectHandle m_lowBlendedForwardTechnique; + + + float m_emissivityLocal; + float m_emissivityOffsetLocal; + Vector2 m_emissivityUVAnimLocal; + Vector2 m_diffuseUVAnimLocal; + Vector3 m_diffuseColorLocal; + float m_specularIntensityLocal; + float m_specularPowerLocal; + Vector3 m_highlightColorLocal; + int m_screenSizeXLocal; + int m_screenSizeYLocal; + + Vector2 m_scaleLocal; + + public MyEffectModelsDNS() + : base("Effects2\\Models\\MyEffectModelsDNS") + { + m_viewMatrix = m_D3DEffect.GetParameter(null, "ViewMatrix"); + m_worldMatrix = m_D3DEffect.GetParameter(null, "WorldMatrix"); + m_projectionMatrix = m_D3DEffect.GetParameter(null, "ProjectionMatrix"); + + m_textureDiffuse = m_D3DEffect.GetParameter(null, "TextureDiffuse"); + + m_textureNormal = m_D3DEffect.GetParameter(null, "TextureNormal"); + + m_diffuseColor = m_D3DEffect.GetParameter(null, "DiffuseColor"); + m_emissivity = m_D3DEffect.GetParameter(null, "Emissivity"); + m_emissivityOffset = m_D3DEffect.GetParameter(null, "EmissivityOffset"); + m_emissivityUVAnim = m_D3DEffect.GetParameter(null, "EmissivityUVAnim"); + m_diffuseUVAnim = m_D3DEffect.GetParameter(null, "DiffuseUVAnim"); + m_specularIntensity = m_D3DEffect.GetParameter(null, "SpecularIntensity"); + m_specularPower = m_D3DEffect.GetParameter(null, "SpecularPower"); + + m_highlightColor = m_D3DEffect.GetParameter(null, "Highlight"); + m_depthTextureNear = m_D3DEffect.GetParameter(null, "DepthTextureNear"); + m_depthTextureFar = m_D3DEffect.GetParameter(null, "DepthTextureFar"); + m_halfPixel = m_D3DEffect.GetParameter(null, "HalfPixel"); + m_scale = m_D3DEffect.GetParameter(null, "Scale"); + + m_lowTechnique = m_D3DEffect.GetTechnique("Technique_RenderQualityLow"); + //m_lowInstancedTechnique = m_xnaEffect.GetTechnique("Technique_RenderQualityLowInstanced"); + m_lowBlendedTechnique = m_D3DEffect.GetTechnique("Technique_RenderQualityLowBlended"); + m_lowMaskedTechnique = m_D3DEffect.GetTechnique("Technique_RenderQualityLowMasked"); + + m_normalTechnique = m_D3DEffect.GetTechnique("Technique_RenderQualityNormal"); + //m_normalInstancedTechnique = m_xnaEffect.GetTechnique("Technique_RenderQualityNormalInstanced"); + m_normalBlendedTechnique = m_D3DEffect.GetTechnique("Technique_RenderQualityNormalBlended"); + m_normalMaskedTechnique = m_D3DEffect.GetTechnique("Technique_RenderQualityNormalMasked"); + + m_highTechnique = m_D3DEffect.GetTechnique("Technique_RenderQualityHigh"); + //m_highInstancedTechnique = m_xnaEffect.GetTechnique("Technique_RenderQualityHighInstanced"); + m_highBlendedTechnique = m_D3DEffect.GetTechnique("Technique_RenderQualityHighBlended"); + m_highMaskedTechnique = m_D3DEffect.GetTechnique("Technique_RenderQualityHighMasked"); + //m_highChannelsTechnique = m_xnaEffect.GetTechnique("Technique_RenderQualityHighChannels"); + + m_extremeTechnique = m_D3DEffect.GetTechnique("Technique_RenderQualityHigh"); + //m_extremeInstancedTechnique = m_xnaEffect.GetTechnique("Technique_RenderQualityExtremeInstanced"); + m_extremeBlendedTechnique = m_D3DEffect.GetTechnique("Technique_RenderQualityHighBlended"); + m_extremeMaskedTechnique = m_D3DEffect.GetTechnique("Technique_RenderQualityHighMasked"); + //m_extremeChannelsTechnique = m_xnaEffect.GetTechnique("Technique_RenderQualityHighChannels"); + + m_holoTechnique = m_D3DEffect.GetTechnique("Technique_Holo"); + m_holoForwardTechnique = m_D3DEffect.GetTechnique("Technique_HoloForward"); + m_holoIgnoreDepthTechnique = m_D3DEffect.GetTechnique("Technique_Holo_IgnoreDepth"); + + m_stencilTechnique = m_D3DEffect.GetTechnique("Technique_Stencil"); + m_stencilLowTechnique = m_D3DEffect.GetTechnique("Technique_StencilLow"); + + //m_stencilTechniqueInstanced = m_xnaEffect.GetTechnique("Technique_StencilInstanced"); + //m_stencilLowTechniqueInstanced = m_xnaEffect.GetTechnique("Technique_StencilLowInstanced"); + + m_forwardTechnique = m_D3DEffect.GetTechnique("Technique_RenderQualityLow_Forward"); + m_lowBlendedForwardTechnique = m_D3DEffect.GetTechnique("Technique_RenderQualityLowBlended_Forward"); + + DynamicLights = new MyEffectDynamicLightingBase(m_D3DEffect); + Reflector = new MyEffectReflectorBase(m_D3DEffect); + } + + public void SetWorldMatrix(Matrix worldMatrix) + { + m_D3DEffect.SetValue(m_worldMatrix, worldMatrix); + } + + public override void SetViewMatrix(ref Matrix viewMatrix) + { + m_D3DEffect.SetValue(m_viewMatrix, viewMatrix); + } + + public override void SetProjectionMatrix(ref Matrix projectionMatrix) + { + m_D3DEffect.SetValue(m_projectionMatrix, projectionMatrix); + } + + public override void SetTextureDiffuse(Texture texture2D) + { + m_D3DEffect.SetTexture(m_textureDiffuse, texture2D); + m_diffuseTextureSet = texture2D != null; + } + + public override void SetTextureNormal(Texture texture2D) + { + m_D3DEffect.SetTexture(m_textureNormal, texture2D); + m_normalTextureSet = texture2D != null; + } + + public override bool IsTextureDiffuseSet() + { + return m_diffuseTextureSet; + } + + public override bool IsTextureSpecularSet() + { + return m_specularTextureSet; + } + + public override bool IsTextureNormalSet() + { + return m_normalTextureSet; + } + + public override void SetDiffuseColor(Vector3 diffuseColor) + { + m_D3DEffect.SetValue(m_diffuseColor, diffuseColor); + } + public override void SetEmissivity(float emissivity) + { + if (m_emissivityLocal != emissivity) + { + m_D3DEffect.SetValue(m_emissivity, emissivity); + m_emissivityLocal = emissivity; + } + } + public override void SetEmissivityOffset(float emissivityOffset) + { + if (m_emissivityOffsetLocal != emissivityOffset) + { + m_D3DEffect.SetValue(m_emissivityOffset, emissivityOffset); + m_emissivityOffsetLocal = emissivityOffset; + } + } + public override void SetEmissivityUVAnim(Vector2 uvAnim) + { + if (m_emissivityUVAnimLocal != uvAnim) + { + m_D3DEffect.SetValue(m_emissivityUVAnim, uvAnim); + m_emissivityUVAnimLocal = uvAnim; + } + } + + public override void SetDiffuseUVAnim(Vector2 uvAnim) + { + if (m_diffuseUVAnimLocal != uvAnim) + { + m_D3DEffect.SetValue(m_diffuseUVAnim, uvAnim); + m_diffuseUVAnimLocal = uvAnim; + } + } + + + public override void SetSpecularIntensity(float specularIntensity) + { + if (m_specularIntensityLocal != specularIntensity) + { + m_D3DEffect.SetValue(m_specularIntensity, specularIntensity); + m_specularIntensityLocal = specularIntensity; + } + } + public override void SetSpecularPower(float specularPower) + { + if (m_specularPowerLocal != specularPower) + { + m_D3DEffect.SetValue(m_specularPower, specularPower); + m_specularPowerLocal = specularPower; + } + } + + public override void SetHighlightColor(Vector3 highlightColor) + { + if (m_highlightColorLocal != highlightColor) + { + m_D3DEffect.SetValue(m_highlightColor, highlightColor); + m_highlightColorLocal = highlightColor; + } + } + + public void SetDepthTextureNear(Texture depthTextureNear) + { + m_D3DEffect.SetTexture(m_depthTextureNear, depthTextureNear); + } + + public void SetDepthTextureFar(Texture depthTextureFar) + { + m_D3DEffect.SetTexture(m_depthTextureFar, depthTextureFar); + } + + public void SetHalfPixel(int screenSizeX, int screenSizeY) + { + if (m_screenSizeXLocal != screenSizeX || m_screenSizeYLocal != screenSizeY) + { + m_D3DEffect.SetValue(m_halfPixel, MyUtils.GetHalfPixel(screenSizeX, screenSizeY)); + m_screenSizeXLocal = screenSizeX; + m_screenSizeYLocal = screenSizeY; + } + } + + public void SetScale(Vector2 scale) + { + if (m_scaleLocal != scale) + { + m_D3DEffect.SetValue(m_scale, scale); + m_scaleLocal = scale; + } + } + + + public void SetTechnique(MyEffectModelsDNSTechniqueEnum technique) + { + if (MyRenderConstants.RenderQualityProfile.ForwardRender) + { + switch (technique) + { + case MyEffectModelsDNSTechniqueEnum.Holo: + case MyEffectModelsDNSTechniqueEnum.HoloIgnoreDepth: + m_D3DEffect.Technique = m_holoForwardTechnique; + return; + break; + case MyEffectModelsDNSTechniqueEnum.Low: + case MyEffectModelsDNSTechniqueEnum.LowMasked: + m_D3DEffect.Technique = m_forwardTechnique; + return; + break; + } + } + + switch (technique) + { + case MyEffectModelsDNSTechniqueEnum.Low: + case MyEffectModelsDNSTechniqueEnum.LowBlended: + m_D3DEffect.Technique = m_lowTechnique; + break; + //case MyEffectModelsDNSTechniqueEnum.LowInstanced: + // m_xnaEffect.Technique = m_lowInstancedTechnique; + // break; + //case MyEffectModelsDNSTechniqueEnum.LowBlended: + //m_xnaEffect.Technique = m_lowBlendedTechnique; + // break; + case MyEffectModelsDNSTechniqueEnum.LowMasked: + m_D3DEffect.Technique = m_lowMaskedTechnique; + break; + + case MyEffectModelsDNSTechniqueEnum.Normal: + m_D3DEffect.Technique = m_normalTechnique; + break; + //case MyEffectModelsDNSTechniqueEnum.Normalnstanced: + //m_xnaEffect.Technique = m_normalInstancedTechnique; + // break; + case MyEffectModelsDNSTechniqueEnum.NormalBlended: + m_D3DEffect.Technique = m_normalBlendedTechnique; + break; + case MyEffectModelsDNSTechniqueEnum.NormalMasked: + m_D3DEffect.Technique = m_normalMaskedTechnique; + break; + + case MyEffectModelsDNSTechniqueEnum.High: + m_D3DEffect.Technique = m_highTechnique; + break; + //case MyEffectModelsDNSTechniqueEnum.HighInstanced: + // m_xnaEffect.Technique = m_highInstancedTechnique; + // break; + case MyEffectModelsDNSTechniqueEnum.HighBlended: + m_D3DEffect.Technique = m_highBlendedTechnique; + break; + case MyEffectModelsDNSTechniqueEnum.HighMasked: + m_D3DEffect.Technique = m_highMaskedTechnique; break; /* case MyEffectModelsDNSTechniqueEnum.HighChannels: m_xnaEffect.Technique = m_highChannelsTechnique; - break; */ - - case MyEffectModelsDNSTechniqueEnum.Extreme: - m_D3DEffect.Technique = m_extremeTechnique; - break; - //case MyEffectModelsDNSTechniqueEnum.ExtremeInstanced: - // m_xnaEffect.Technique = m_extremeInstancedTechnique; - // break; - case MyEffectModelsDNSTechniqueEnum.ExtremeBlended: - m_D3DEffect.Technique = m_extremeBlendedTechnique; - break; - case MyEffectModelsDNSTechniqueEnum.ExtremeMasked: - m_D3DEffect.Technique = m_extremeMaskedTechnique; + break; */ + + case MyEffectModelsDNSTechniqueEnum.Extreme: + m_D3DEffect.Technique = m_extremeTechnique; + break; + //case MyEffectModelsDNSTechniqueEnum.ExtremeInstanced: + // m_xnaEffect.Technique = m_extremeInstancedTechnique; + // break; + case MyEffectModelsDNSTechniqueEnum.ExtremeBlended: + m_D3DEffect.Technique = m_extremeBlendedTechnique; + break; + case MyEffectModelsDNSTechniqueEnum.ExtremeMasked: + m_D3DEffect.Technique = m_extremeMaskedTechnique; break; /* case MyEffectModelsDNSTechniqueEnum.ExtremeChannels: m_xnaEffect.Technique = m_extremeChannelsTechnique; - break; */ - - case MyEffectModelsDNSTechniqueEnum.Holo: - m_D3DEffect.Technique = m_holoTechnique; - break; - case MyEffectModelsDNSTechniqueEnum.HoloIgnoreDepth: - m_D3DEffect.Technique = m_holoIgnoreDepthTechnique; - break; - - case MyEffectModelsDNSTechniqueEnum.Stencil: - m_D3DEffect.Technique = m_stencilTechnique; - break; - case MyEffectModelsDNSTechniqueEnum.StencilLow: - m_D3DEffect.Technique = m_stencilLowTechnique; - break; + break; */ + + case MyEffectModelsDNSTechniqueEnum.Holo: + m_D3DEffect.Technique = m_holoTechnique; + break; + case MyEffectModelsDNSTechniqueEnum.HoloIgnoreDepth: + m_D3DEffect.Technique = m_holoIgnoreDepthTechnique; + break; + + case MyEffectModelsDNSTechniqueEnum.Stencil: + m_D3DEffect.Technique = m_stencilTechnique; + break; + case MyEffectModelsDNSTechniqueEnum.StencilLow: + m_D3DEffect.Technique = m_stencilLowTechnique; + break; /* case MyEffectModelsDNSTechniqueEnum.StencilInstanced: m_xnaEffect.Technique = m_stencilTechniqueInstanced; @@ -427,64 +429,64 @@ public void SetTechnique(MyEffectModelsDNSTechniqueEnum technique) case MyEffectModelsDNSTechniqueEnum.StencilLowInstanced: m_xnaEffect.Technique = m_stencilLowTechniqueInstanced; break; - */ - case MyEffectModelsDNSTechniqueEnum.LowForward: - m_D3DEffect.Technique = m_forwardTechnique; - break; - - case MyEffectModelsDNSTechniqueEnum.LowBlendedForward: - m_D3DEffect.Technique = m_lowBlendedForwardTechnique; - break; - } - } - - - - public override void Begin(int pass, FX fx) + */ + case MyEffectModelsDNSTechniqueEnum.LowForward: + m_D3DEffect.Technique = m_forwardTechnique; + break; + + case MyEffectModelsDNSTechniqueEnum.LowBlendedForward: + m_D3DEffect.Technique = m_lowBlendedForwardTechnique; + break; + } + } + + + + public override void Begin(int pass, FX fx) { /* if (UseChannels && m_maskTexture != null) { SetTechnique(MyRenderConstants.RenderQualityProfile.ModelsChannelsTechnique); } - else */ - //{ - //SetTechnique(MyRenderConstants.RenderQualityProfile.ModelsRenderTechnique); - //} - - base.Begin(pass); - } - - - public void BeginBlended() - { - SetTechnique(MyRenderConstants.RenderQualityProfile.ModelsBlendedRenderTechnique); - } - - public void ApplyHolo(bool ignoreDepth) - { - if (!ignoreDepth) - SetTechnique(MyRenderConstants.RenderQualityProfile.ModelsHoloRenderTechnique); - else - SetTechnique(MyEffectModelsDNSTechniqueEnum.HoloIgnoreDepth); - } - - - public void ApplyMasked() - { - SetTechnique(MyRenderConstants.RenderQualityProfile.ModelsMaskedRenderTechnique); - } - - public void ApplyStencil() - { - SetTechnique(MyRenderConstants.RenderQualityProfile.ModelsStencilTechnique); - } - - public override void Dispose() - { - DynamicLights.Dispose(); - Reflector.Dispose(); - base.Dispose(); - } - } - + else */ + //{ + //SetTechnique(MyRenderConstants.RenderQualityProfile.ModelsRenderTechnique); + //} + + base.Begin(pass); + } + + + public void BeginBlended() + { + SetTechnique(MyRenderConstants.RenderQualityProfile.ModelsBlendedRenderTechnique); + } + + public void ApplyHolo(bool ignoreDepth) + { + if (!ignoreDepth) + SetTechnique(MyRenderConstants.RenderQualityProfile.ModelsHoloRenderTechnique); + else + SetTechnique(MyEffectModelsDNSTechniqueEnum.HoloIgnoreDepth); + } + + + public void ApplyMasked() + { + SetTechnique(MyRenderConstants.RenderQualityProfile.ModelsMaskedRenderTechnique); + } + + public void ApplyStencil() + { + SetTechnique(MyRenderConstants.RenderQualityProfile.ModelsStencilTechnique); + } + + public override void Dispose() + { + DynamicLights.Dispose(); + Reflector.Dispose(); + base.Dispose(); + + } + } } \ No newline at end of file diff --git a/Sources/MinerWars.GameLib/AppCode/Game/Entities/CargoBox/MyCargoBox.cs b/Sources/MinerWars.GameLib/AppCode/Game/Entities/CargoBox/MyCargoBox.cs index cd50610..df9b6d5 100644 --- a/Sources/MinerWars.GameLib/AppCode/Game/Entities/CargoBox/MyCargoBox.cs +++ b/Sources/MinerWars.GameLib/AppCode/Game/Entities/CargoBox/MyCargoBox.cs @@ -1,421 +1,421 @@ -using System; -using System.Text; -using MinerWars.AppCode.Game.Inventory; -using MinerWarsMath; -using MinerWars.AppCode.Game.TransparentGeometry.Particles; -using MinerWars.CommonLIB.AppCode.ObjectBuilders.Object3D; -using MinerWars.CommonLIB.AppCode.ObjectBuilders; -using MinerWars.AppCode.Game.Models; -using MinerWars.AppCode.Game.Utils; -using MinerWars.AppCode.Physics; -using MinerWars.AppCode.Game.HUD; -using MinerWars.AppCode.Game.Audio; -using MinerWars.CommonLIB.AppCode.ObjectBuilders.SubObjects; -using MinerWars.AppCode.Game.Sessions; -using MinerWars.AppCode.Game.GUI; -using MinerWars.AppCode.Game.Localization; - -namespace MinerWars.AppCode.Game.Entities.CargoBox -{ - class MyCargoBox : MyEntity, IMyInventory, IResetable - { - public MyInventory Inventory { get; set; } - - private float m_elapsedTime; - public TimeSpan? RespawnTime; - private bool m_shouldRespawn; - - /// - /// Indicates whether this cargo box should disappear after all items have been taken from it. - /// - public bool CloseAfterEmptied - { - get { return m_cargoBoxType == MyMwcObjectBuilder_CargoBox_TypesEnum.DroppedItems; } - } - - private MyMwcObjectBuilder_CargoBox_TypesEnum m_cargoBoxType; - public MyMwcObjectBuilder_CargoBox_TypesEnum CargoBoxType - { - get { return m_cargoBoxType; } - set - { - m_cargoBoxType = value; - ChangeModelLod0(value); - } - } - - public MyCargoBox() - : base(true) - { - Inventory = new MyInventory(); - Inventory.OnInventoryContentChange += Inventory_OnInventoryContentChange; - } - - void Inventory_OnInventoryContentChange(MyInventory sender) - { - UpdateState(); - - if (RespawnTime.HasValue && MyMultiplayerGameplay.IsRunning && !MyGuiScreenGamePlay.Static.IsGameStoryActive()) - { - if (Inventory.GetInventoryItems().Count < m_inventoryTemplate.InventoryItems.Count) - { - m_shouldRespawn = NeedsUpdate = true; - } - } - - if (sender.IsInventoryEmpty() && CloseAfterEmptied) - { - MarkForClose(); - } - } - - private void UpdateState() - { - if (IsNotEmpty()) - { - m_diffuseColor = Vector3.One * 2f; - m_enableEmissivity = true; - } - else - { - m_diffuseColor = Vector3.One; - m_enableEmissivity = false; - } - SetHudMarker(); - } - - public override void UpdateBeforeSimulation() - { - base.UpdateBeforeSimulation(); - - if (m_shouldRespawn) - { - m_elapsedTime += MyConstants.PHYSICS_STEP_SIZE_IN_MILLISECONDS; - if (m_elapsedTime > RespawnTime.Value.TotalMilliseconds) - { - Respawn(); - } - } - } - - public bool IsNotEmpty() - { - return Inventory != null && Inventory.GetInventoryItems().Count > 0; - } - - private MyMwcObjectBuilder_Inventory m_inventoryTemplate; - - public void Init(string hudLabelText, MyMwcObjectBuilder_CargoBox objectBuilder, Matrix matrix) - { - Flags |= EntityFlags.EditableInEditor; - - StringBuilder hudLabelTextSb = (hudLabelText == null) ? MyTextsWrapper.Get(MyTextsWrapperEnum.CargoBox) : new StringBuilder(hudLabelText); - - // We want to make cargo box "lazy" to prevent rapid movement - const float cargoBoxMass = 5000.0f; - const float cargoAngularDamping = 0.5f; - - var modelLod0Enum = GetModelLod0EnumFromType(objectBuilder.CargoBoxType); - - base.Init(hudLabelTextSb, modelLod0Enum, null, null, null, objectBuilder); - base.InitBoxPhysics(MyMaterialType.METAL, ModelLod0, cargoBoxMass, cargoAngularDamping, MyConstants.COLLISION_LAYER_DEFAULT, RigidBodyFlag.RBF_RBO_STATIC); - this.Physics.LinearDamping = 0.7f; - this.Physics.MaxLinearVelocity = 350; - this.Physics.MaxAngularVelocity = 5; - - m_inventoryTemplate = objectBuilder.Inventory; - if (m_inventoryTemplate != null) - { - Inventory.Init(m_inventoryTemplate); - } - CargoBoxType = objectBuilder.CargoBoxType; - - SetWorldMatrix(matrix); - - Save = true; - this.Physics.Enabled = true; - UpdateState(); - } - - public void Respawn() - { - // Dummy entities won't respawn; - if (!IsDummy) - { - NeedsUpdate = false; - m_shouldRespawn = false; - m_elapsedTime = 0; - if (m_inventoryTemplate != null) - { - Inventory.Init(m_inventoryTemplate); - } - if (MyMultiplayerGameplay.IsRunning) - { - MyMultiplayerGameplay.Static.ResetEntity(this); - } - } - } - - public string GetCorrectDisplayName(ref MyHudMaxDistanceMultiplerTypes? maxDistanceMultiplerType) - { - string displayName = GetCorrectDisplayName(); - - switch (m_cargoBoxType) - { - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type7: - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type3: - maxDistanceMultiplerType = MyHudMaxDistanceMultiplerTypes.CargoBoxMedkit; - break; - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type8: - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type6: - maxDistanceMultiplerType = MyHudMaxDistanceMultiplerTypes.CargoBoxAmmo; - break; - case MyMwcObjectBuilder_CargoBox_TypesEnum.TypeProp_A: - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type9: - maxDistanceMultiplerType = MyHudMaxDistanceMultiplerTypes.CargoBoxOxygen; - break; - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type5: - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type11: - maxDistanceMultiplerType = MyHudMaxDistanceMultiplerTypes.CargoBoxFuel; - break; - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type2: - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type12: - maxDistanceMultiplerType = MyHudMaxDistanceMultiplerTypes.CargoBoxRepair; - break; - default: - maxDistanceMultiplerType = null; - break; - } - - return displayName; - } - - public override string GetCorrectDisplayName() - { - string displayName = DisplayName; - - switch (m_cargoBoxType) - { - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type7: - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type3: - if (DisplayName == "Medikit") - displayName = MyTextsWrapper.Get(MyTextsWrapperEnum.CargoBoxMedikit).ToString(); - break; - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type8: - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type6: - if (DisplayName == "Ammo") - displayName = MyTextsWrapper.Get(MyTextsWrapperEnum.CargoBoxAmmo).ToString(); - break; - case MyMwcObjectBuilder_CargoBox_TypesEnum.TypeProp_A: - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type9: - if (DisplayName == "Oxygen") - displayName = MyTextsWrapper.Get(MyTextsWrapperEnum.CargoBoxOxygen).ToString(); - break; - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type5: - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type11: - if (DisplayName == "Fuel") - displayName = MyTextsWrapper.Get(MyTextsWrapperEnum.CargoBoxFuel).ToString(); - break; - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type2: - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type12: - if (DisplayName == "Repair") - displayName = MyTextsWrapper.Get(MyTextsWrapperEnum.CargoBoxRepair).ToString(); - break; - default: - - break; - } - - if (DisplayName == "Health") - displayName = MyTextsWrapper.Get(MyTextsWrapperEnum.Health).ToString(); - - - return displayName; - } - - protected override void SetHudMarker() - { - if (IsNotEmpty()) - { - MyHudMaxDistanceMultiplerTypes? maxDistanceMultiplerType = null; - - if (m_cargoBoxType == 0) - m_cargoBoxType = GetTypeFromModelLod0Enum(m_modelLod0.ModelEnum); - - string displayName = GetCorrectDisplayName(ref maxDistanceMultiplerType); - - MyHud.ChangeText(this, new StringBuilder(displayName), MyGuitargetMode.CargoBox, 200f, MyHudIndicatorFlagsEnum.SHOW_BORDER_INDICATORS | MyHudIndicatorFlagsEnum.SHOW_DISTANCE | MyHudIndicatorFlagsEnum.SHOW_TEXT, maxDistanceMultiplerType: maxDistanceMultiplerType); - } - else - { - MyHud.RemoveText(this); - } - } - - private static MyMwcObjectBuilder_CargoBox_TypesEnum GetTypeFromModelLod0Enum(MyModelsEnum model) - { - switch (model) - { - case MyModelsEnum.cargo_box_1: - return MyMwcObjectBuilder_CargoBox_TypesEnum.Type1; - case MyModelsEnum.cargo_box_2: - return MyMwcObjectBuilder_CargoBox_TypesEnum.Type2; - case MyModelsEnum.cargo_box_3: - return MyMwcObjectBuilder_CargoBox_TypesEnum.Type3; - case MyModelsEnum.cargo_box_4: - return MyMwcObjectBuilder_CargoBox_TypesEnum.Type4; - case MyModelsEnum.cargo_box_5: - return MyMwcObjectBuilder_CargoBox_TypesEnum.Type5; - case MyModelsEnum.cargo_box_6: - return MyMwcObjectBuilder_CargoBox_TypesEnum.Type6; - case MyModelsEnum.cargo_box_7: - return MyMwcObjectBuilder_CargoBox_TypesEnum.Type7; - case MyModelsEnum.cargo_box_8: - return MyMwcObjectBuilder_CargoBox_TypesEnum.Type8; - case MyModelsEnum.cargo_box_9: - return MyMwcObjectBuilder_CargoBox_TypesEnum.Type9; - case MyModelsEnum.cargo_box_10: - return MyMwcObjectBuilder_CargoBox_TypesEnum.Type10; - case MyModelsEnum.cargo_box_11: - return MyMwcObjectBuilder_CargoBox_TypesEnum.Type11; - case MyModelsEnum.cargo_box_12: - return MyMwcObjectBuilder_CargoBox_TypesEnum.Type12; - case MyModelsEnum.CargoBox_prop_A: - return MyMwcObjectBuilder_CargoBox_TypesEnum.TypeProp_A; - case MyModelsEnum.CargoBox_prop_B: - return MyMwcObjectBuilder_CargoBox_TypesEnum.TypeProp_B; - case MyModelsEnum.CargoBox_prop_C: - return MyMwcObjectBuilder_CargoBox_TypesEnum.TypeProp_C; - case MyModelsEnum.CargoBox_prop_D: - return MyMwcObjectBuilder_CargoBox_TypesEnum.TypeProp_D; - case MyModelsEnum.cargo_box_small: - return MyMwcObjectBuilder_CargoBox_TypesEnum.DroppedItems; - default: - return (MyMwcObjectBuilder_CargoBox_TypesEnum)0; - } - } - - public static MyModelsEnum GetModelLod0EnumFromType(MyMwcObjectBuilder_CargoBox_TypesEnum cargoBoxType) - { - switch (cargoBoxType) - { - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type1: - return MyModelsEnum.cargo_box_1; - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type2: - return MyModelsEnum.cargo_box_2; - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type3: - return MyModelsEnum.cargo_box_3; - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type4: - return MyModelsEnum.cargo_box_4; - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type5: - return MyModelsEnum.cargo_box_5; - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type6: - return MyModelsEnum.cargo_box_6; - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type7: - return MyModelsEnum.cargo_box_7; - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type8: - return MyModelsEnum.cargo_box_8; - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type9: - return MyModelsEnum.cargo_box_9; - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type10: - return MyModelsEnum.cargo_box_10; - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type11: - return MyModelsEnum.cargo_box_11; - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type12: - return MyModelsEnum.cargo_box_12; - case MyMwcObjectBuilder_CargoBox_TypesEnum.TypeProp_A: - return MyModelsEnum.CargoBox_prop_A; - case MyMwcObjectBuilder_CargoBox_TypesEnum.TypeProp_B: - return MyModelsEnum.CargoBox_prop_B; - case MyMwcObjectBuilder_CargoBox_TypesEnum.TypeProp_C: - return MyModelsEnum.CargoBox_prop_C; - case MyMwcObjectBuilder_CargoBox_TypesEnum.TypeProp_D: - return MyModelsEnum.CargoBox_prop_D; - case MyMwcObjectBuilder_CargoBox_TypesEnum.DroppedItems: - return MyModelsEnum.cargo_box_small; - default: - throw new ArgumentOutOfRangeException("cargoBoxType"); - } - } - - public MySoundCuesEnum GetTakeAllSound() - { - switch (CargoBoxType) - { - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type1: - case MyMwcObjectBuilder_CargoBox_TypesEnum.TypeProp_B: - case MyMwcObjectBuilder_CargoBox_TypesEnum.TypeProp_C: - case MyMwcObjectBuilder_CargoBox_TypesEnum.TypeProp_D: - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type4: - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type10: - case MyMwcObjectBuilder_CargoBox_TypesEnum.DroppedItems: - return MySoundCuesEnum.SfxTakeAllUniversal; - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type6: - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type8: - return MySoundCuesEnum.SfxTakeAllAmmo; - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type5: - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type11: - return MySoundCuesEnum.SfxTakeAllFuel; - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type3: - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type7: - return MySoundCuesEnum.SfxTakeAllMedkit; - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type9: - case MyMwcObjectBuilder_CargoBox_TypesEnum.TypeProp_A: - return MySoundCuesEnum.SfxTakeAllOxygen; - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type2: - case MyMwcObjectBuilder_CargoBox_TypesEnum.Type12: - return MySoundCuesEnum.SfxTakeAllRepair; - default: - return MySoundCuesEnum.SfxTakeAllUniversal; - } - } - - private void ChangeModelLod0(MyMwcObjectBuilder_CargoBox_TypesEnum cargoBoxType) - { - var modelLod0Enum = GetModelLod0EnumFromType(cargoBoxType); - var modelLod0 = MyModels.GetModelForDraw(modelLod0Enum); - m_modelLod0 = modelLod0; - } - - protected override MyMwcObjectBuilder_Base GetObjectBuilderInternal(bool getExactCopy) - { - var builder = (MyMwcObjectBuilder_CargoBox)base.GetObjectBuilderInternal(getExactCopy); - builder.Inventory = Inventory.GetObjectBuilder(getExactCopy); - builder.DisplayName = DisplayName; - builder.CargoBoxType = CargoBoxType; - - return builder; - } - - public override void Close() - { - Inventory.OnInventoryContentChange -= Inventory_OnInventoryContentChange; - Inventory.Close(); - base.Close(); - } - - public override string GetFriendlyName() - { - return "MyCargoBox"; - } - - public void Reset() - { - Respawn(); - } - - protected override void DoDamageInternal(float playerDamage, float damage, float empDamage, MyDamageType damageType, MyAmmoType ammoType, MyEntity damageSource, bool justDeactivate) - { - base.DoDamageInternal(playerDamage, damage, empDamage, damageType, ammoType, damageSource, justDeactivate); - - if (IsDead()) - { - MarkForClose(); - - var effect = MyParticlesManager.CreateParticleEffect((int)MyParticleEffectsIDEnum.Explosion_SmallPrefab); - effect.WorldMatrix = WorldMatrix; - effect.UserScale = 0.5f; - } - } - } +using System; +using System.Text; +using MinerWars.AppCode.Game.Inventory; +using MinerWarsMath; +using MinerWars.AppCode.Game.TransparentGeometry.Particles; +using MinerWars.CommonLIB.AppCode.ObjectBuilders.Object3D; +using MinerWars.CommonLIB.AppCode.ObjectBuilders; +using MinerWars.AppCode.Game.Models; +using MinerWars.AppCode.Game.Utils; +using MinerWars.AppCode.Physics; +using MinerWars.AppCode.Game.HUD; +using MinerWars.AppCode.Game.Audio; +using MinerWars.CommonLIB.AppCode.ObjectBuilders.SubObjects; +using MinerWars.AppCode.Game.Sessions; +using MinerWars.AppCode.Game.GUI; +using MinerWars.AppCode.Game.Localization; + +namespace MinerWars.AppCode.Game.Entities.CargoBox +{ + class MyCargoBox : MyEntity, IMyInventory, IResetable + { + public MyInventory Inventory { get; set; } + + private float m_elapsedTime; + public TimeSpan? RespawnTime; + private bool m_shouldRespawn; + + /// + /// Indicates whether this cargo box should disappear after all items have been taken from it. + /// + public bool CloseAfterEmptied + { + get { return m_cargoBoxType == MyMwcObjectBuilder_CargoBox_TypesEnum.DroppedItems; } + } + + private MyMwcObjectBuilder_CargoBox_TypesEnum m_cargoBoxType; + public MyMwcObjectBuilder_CargoBox_TypesEnum CargoBoxType + { + get { return m_cargoBoxType; } + set + { + m_cargoBoxType = value; + ChangeModelLod0(value); + } + } + + public MyCargoBox() + : base(true) + { + Inventory = new MyInventory(); + Inventory.OnInventoryContentChange += Inventory_OnInventoryContentChange; + } + + void Inventory_OnInventoryContentChange(MyInventory sender) + { + UpdateState(); + + if (RespawnTime.HasValue && MyMultiplayerGameplay.IsRunning && !MyGuiScreenGamePlay.Static.IsGameStoryActive()) + { + if (Inventory.GetInventoryItems().Count < m_inventoryTemplate.InventoryItems.Count) + { + m_shouldRespawn = NeedsUpdate = true; + } + } + + if (sender.IsInventoryEmpty() && CloseAfterEmptied) + { + MarkForClose(); + } + } + + private void UpdateState() + { + if (IsNotEmpty()) + { + m_diffuseColor = Vector3.One * 2f; + m_enableEmissivity = true; + } + else + { + m_diffuseColor = Vector3.One; + m_enableEmissivity = false; + } + SetHudMarker(); + } + + public override void UpdateBeforeSimulation() + { + base.UpdateBeforeSimulation(); + + if (m_shouldRespawn) + { + m_elapsedTime += MyConstants.PHYSICS_STEP_SIZE_IN_MILLISECONDS; + if (m_elapsedTime > RespawnTime.Value.TotalMilliseconds) + { + Respawn(); + } + } + } + + public bool IsNotEmpty() + { + return Inventory != null && Inventory.GetInventoryItems().Count > 0; + } + + private MyMwcObjectBuilder_Inventory m_inventoryTemplate; + + public void Init(string hudLabelText, MyMwcObjectBuilder_CargoBox objectBuilder, Matrix matrix) + { + Flags |= EntityFlags.EditableInEditor; + + StringBuilder hudLabelTextSb = (hudLabelText == null) ? MyTextsWrapper.Get(MyTextsWrapperEnum.CargoBox) : new StringBuilder(hudLabelText); + + // We want to make cargo box "lazy" to prevent rapid movement + const float cargoBoxMass = 5000.0f; + const float cargoAngularDamping = 0.5f; + + var modelLod0Enum = GetModelLod0EnumFromType(objectBuilder.CargoBoxType); + + base.Init(hudLabelTextSb, modelLod0Enum, null, null, null, objectBuilder); + base.InitBoxPhysics(MyMaterialType.METAL, ModelLod0, cargoBoxMass, cargoAngularDamping, MyConstants.COLLISION_LAYER_DEFAULT, RigidBodyFlag.RBF_RBO_STATIC); + this.Physics.LinearDamping = 0.7f; + this.Physics.MaxLinearVelocity = 350; + this.Physics.MaxAngularVelocity = 5; + + m_inventoryTemplate = objectBuilder.Inventory; + if (m_inventoryTemplate != null) + { + Inventory.Init(m_inventoryTemplate); + } + CargoBoxType = objectBuilder.CargoBoxType; + + SetWorldMatrix(matrix); + + Save = true; + this.Physics.Enabled = true; + UpdateState(); + } + + public void Respawn() + { + // Dummy entities won't respawn; + if (!IsDummy) + { + NeedsUpdate = false; + m_shouldRespawn = false; + m_elapsedTime = 0; + if (m_inventoryTemplate != null) + { + Inventory.Init(m_inventoryTemplate); + } + if (MyMultiplayerGameplay.IsRunning) + { + MyMultiplayerGameplay.Static.ResetEntity(this); + } + } + } + + public string GetCorrectDisplayName(ref MyHudMaxDistanceMultiplerTypes? maxDistanceMultiplerType) + { + string displayName = GetCorrectDisplayName(); + + switch (m_cargoBoxType) + { + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type7: + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type3: + maxDistanceMultiplerType = MyHudMaxDistanceMultiplerTypes.CargoBoxMedkit; + break; + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type8: + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type6: + maxDistanceMultiplerType = MyHudMaxDistanceMultiplerTypes.CargoBoxAmmo; + break; + case MyMwcObjectBuilder_CargoBox_TypesEnum.TypeProp_A: + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type9: + maxDistanceMultiplerType = MyHudMaxDistanceMultiplerTypes.CargoBoxOxygen; + break; + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type5: + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type11: + maxDistanceMultiplerType = MyHudMaxDistanceMultiplerTypes.CargoBoxFuel; + break; + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type2: + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type12: + maxDistanceMultiplerType = MyHudMaxDistanceMultiplerTypes.CargoBoxRepair; + break; + default: + maxDistanceMultiplerType = null; + break; + } + + return displayName; + } + + public override string GetCorrectDisplayName() + { + string displayName = DisplayName; + + switch (m_cargoBoxType) + { + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type7: + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type3: + if (DisplayName == "Medikit") + displayName = MyTextsWrapper.Get(MyTextsWrapperEnum.CargoBoxMedikit).ToString(); + break; + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type8: + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type6: + if (DisplayName == "Ammo") + displayName = MyTextsWrapper.Get(MyTextsWrapperEnum.CargoBoxAmmo).ToString(); + break; + case MyMwcObjectBuilder_CargoBox_TypesEnum.TypeProp_A: + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type9: + if (DisplayName == "Oxygen") + displayName = MyTextsWrapper.Get(MyTextsWrapperEnum.CargoBoxOxygen).ToString(); + break; + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type5: + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type11: + if (DisplayName == "Fuel") + displayName = MyTextsWrapper.Get(MyTextsWrapperEnum.CargoBoxFuel).ToString(); + break; + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type2: + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type12: + if (DisplayName == "Repair") + displayName = MyTextsWrapper.Get(MyTextsWrapperEnum.CargoBoxRepair).ToString(); + break; + default: + + break; + } + + if (DisplayName == "Health") + displayName = MyTextsWrapper.Get(MyTextsWrapperEnum.Health).ToString(); + + + return displayName; + } + + protected override void SetHudMarker() + { + if (IsNotEmpty()) + { + MyHudMaxDistanceMultiplerTypes? maxDistanceMultiplerType = null; + + if (m_cargoBoxType == 0) + m_cargoBoxType = GetTypeFromModelLod0Enum(m_modelLod0.ModelEnum); + + string displayName = GetCorrectDisplayName(ref maxDistanceMultiplerType); + + MyHud.ChangeText(this, new StringBuilder(displayName), MyGuitargetMode.CargoBox, 200f, MyHudIndicatorFlagsEnum.SHOW_BORDER_INDICATORS | MyHudIndicatorFlagsEnum.SHOW_DISTANCE | MyHudIndicatorFlagsEnum.SHOW_TEXT, maxDistanceMultiplerType: maxDistanceMultiplerType); + } + else + { + MyHud.RemoveText(this); + } + } + + private static MyMwcObjectBuilder_CargoBox_TypesEnum GetTypeFromModelLod0Enum(MyModelsEnum model) + { + switch (model) + { + case MyModelsEnum.cargo_box_1: + return MyMwcObjectBuilder_CargoBox_TypesEnum.Type1; + case MyModelsEnum.cargo_box_2: + return MyMwcObjectBuilder_CargoBox_TypesEnum.Type2; + case MyModelsEnum.cargo_box_3: + return MyMwcObjectBuilder_CargoBox_TypesEnum.Type3; + case MyModelsEnum.cargo_box_4: + return MyMwcObjectBuilder_CargoBox_TypesEnum.Type4; + case MyModelsEnum.cargo_box_5: + return MyMwcObjectBuilder_CargoBox_TypesEnum.Type5; + case MyModelsEnum.cargo_box_6: + return MyMwcObjectBuilder_CargoBox_TypesEnum.Type6; + case MyModelsEnum.cargo_box_7: + return MyMwcObjectBuilder_CargoBox_TypesEnum.Type7; + case MyModelsEnum.cargo_box_8: + return MyMwcObjectBuilder_CargoBox_TypesEnum.Type8; + case MyModelsEnum.cargo_box_9: + return MyMwcObjectBuilder_CargoBox_TypesEnum.Type9; + case MyModelsEnum.cargo_box_10: + return MyMwcObjectBuilder_CargoBox_TypesEnum.Type10; + case MyModelsEnum.cargo_box_11: + return MyMwcObjectBuilder_CargoBox_TypesEnum.Type11; + case MyModelsEnum.cargo_box_12: + return MyMwcObjectBuilder_CargoBox_TypesEnum.Type12; + case MyModelsEnum.CargoBox_prop_A: + return MyMwcObjectBuilder_CargoBox_TypesEnum.TypeProp_A; + case MyModelsEnum.CargoBox_prop_B: + return MyMwcObjectBuilder_CargoBox_TypesEnum.TypeProp_B; + case MyModelsEnum.CargoBox_prop_C: + return MyMwcObjectBuilder_CargoBox_TypesEnum.TypeProp_C; + case MyModelsEnum.CargoBox_prop_D: + return MyMwcObjectBuilder_CargoBox_TypesEnum.TypeProp_D; + case MyModelsEnum.cargo_box_small: + return MyMwcObjectBuilder_CargoBox_TypesEnum.DroppedItems; + default: + return (MyMwcObjectBuilder_CargoBox_TypesEnum)0; + } + } + + public static MyModelsEnum GetModelLod0EnumFromType(MyMwcObjectBuilder_CargoBox_TypesEnum cargoBoxType) + { + switch (cargoBoxType) + { + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type1: + return MyModelsEnum.cargo_box_1; + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type2: + return MyModelsEnum.cargo_box_2; + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type3: + return MyModelsEnum.cargo_box_3; + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type4: + return MyModelsEnum.cargo_box_4; + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type5: + return MyModelsEnum.cargo_box_5; + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type6: + return MyModelsEnum.cargo_box_6; + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type7: + return MyModelsEnum.cargo_box_7; + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type8: + return MyModelsEnum.cargo_box_8; + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type9: + return MyModelsEnum.cargo_box_9; + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type10: + return MyModelsEnum.cargo_box_10; + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type11: + return MyModelsEnum.cargo_box_11; + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type12: + return MyModelsEnum.cargo_box_12; + case MyMwcObjectBuilder_CargoBox_TypesEnum.TypeProp_A: + return MyModelsEnum.CargoBox_prop_A; + case MyMwcObjectBuilder_CargoBox_TypesEnum.TypeProp_B: + return MyModelsEnum.CargoBox_prop_B; + case MyMwcObjectBuilder_CargoBox_TypesEnum.TypeProp_C: + return MyModelsEnum.CargoBox_prop_C; + case MyMwcObjectBuilder_CargoBox_TypesEnum.TypeProp_D: + return MyModelsEnum.CargoBox_prop_D; + case MyMwcObjectBuilder_CargoBox_TypesEnum.DroppedItems: + return MyModelsEnum.cargo_box_small; + default: + throw new ArgumentOutOfRangeException("cargoBoxType"); + } + } + + public MySoundCuesEnum GetTakeAllSound() + { + switch (CargoBoxType) + { + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type1: + case MyMwcObjectBuilder_CargoBox_TypesEnum.TypeProp_B: + case MyMwcObjectBuilder_CargoBox_TypesEnum.TypeProp_C: + case MyMwcObjectBuilder_CargoBox_TypesEnum.TypeProp_D: + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type4: + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type10: + case MyMwcObjectBuilder_CargoBox_TypesEnum.DroppedItems: + return MySoundCuesEnum.SfxTakeAllUniversal; + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type6: + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type8: + return MySoundCuesEnum.SfxTakeAllAmmo; + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type5: + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type11: + return MySoundCuesEnum.SfxTakeAllFuel; + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type3: + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type7: + return MySoundCuesEnum.SfxTakeAllMedkit; + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type9: + case MyMwcObjectBuilder_CargoBox_TypesEnum.TypeProp_A: + return MySoundCuesEnum.SfxTakeAllOxygen; + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type2: + case MyMwcObjectBuilder_CargoBox_TypesEnum.Type12: + return MySoundCuesEnum.SfxTakeAllRepair; + default: + return MySoundCuesEnum.SfxTakeAllUniversal; + } + } + + private void ChangeModelLod0(MyMwcObjectBuilder_CargoBox_TypesEnum cargoBoxType) + { + var modelLod0Enum = GetModelLod0EnumFromType(cargoBoxType); + var modelLod0 = MyModels.GetModelForDraw(modelLod0Enum); + m_modelLod0 = modelLod0; + } + + protected override MyMwcObjectBuilder_Base GetObjectBuilderInternal(bool getExactCopy) + { + var builder = (MyMwcObjectBuilder_CargoBox)base.GetObjectBuilderInternal(getExactCopy); + builder.Inventory = Inventory.GetObjectBuilder(getExactCopy); + builder.DisplayName = DisplayName; + builder.CargoBoxType = CargoBoxType; + + return builder; + } + + public override void Close() + { + Inventory.OnInventoryContentChange -= Inventory_OnInventoryContentChange; + Inventory.Close(); + base.Close(); + } + + public override string GetFriendlyName() + { + return "MyCargoBox"; + } + + public void Reset() + { + Respawn(); + } + + protected override void DoDamageInternal(float playerDamage, float damage, float empDamage, MyDamageType damageType, MyAmmoType ammoType, MyEntity damageSource, bool justDeactivate) + { + base.DoDamageInternal(playerDamage, damage, empDamage, damageType, ammoType, damageSource, justDeactivate); + + if (IsDead()) + { + MarkForClose(); + + var effect = MyParticlesManager.CreateParticleEffect((int)MyParticleEffectsIDEnum.Explosion_SmallPrefab); + effect.WorldMatrix = WorldMatrix; + effect.UserScale = 0.5f; + } + } + } } \ No newline at end of file diff --git a/Sources/MinerWars.GameLib/AppCode/Game/GUI/MyGuiScreenJoinGame.cs b/Sources/MinerWars.GameLib/AppCode/Game/GUI/MyGuiScreenJoinGame.cs index 2b42eb6..d3e96f0 100644 --- a/Sources/MinerWars.GameLib/AppCode/Game/GUI/MyGuiScreenJoinGame.cs +++ b/Sources/MinerWars.GameLib/AppCode/Game/GUI/MyGuiScreenJoinGame.cs @@ -1,648 +1,648 @@ -using System; -using System.Diagnostics; -using System.Text; -using System.Collections.Generic; -using MinerWarsMath; -using MinerWars.AppCode.Game.GUI.Core; -using MinerWars.AppCode.Game.Localization; -using MinerWars.AppCode.Game.Utils; -using MinerWars.CommonLIB.AppCode.Utils; -using MinerWars.AppCode.Game.Sessions; -using MinerWars.CommonLIB.AppCode.Networking.Multiplayer; -using MinerWars.AppCode.Game.Textures; -using MinerWars.CommonLIB.AppCode.ObjectBuilders; -using MinerWars.AppCode.Game.Managers.Session; -using MinerWars.CommonLIB.AppCode.ObjectBuilders.Object3D; -using MinerWars.AppCode.Game.HUD; -using MinerWars.AppCode.Game.Sessions.Multiplayer; -using SysUtils.Utils; -using MinerWars.CommonLIB.AppCode.Networking; -using MinerWars.AppCode.Game.Gameplay; -using MinerWars.AppCode.Game.World; -using MinerWars.AppCode.Networking; - -namespace MinerWars.AppCode.Game.GUI -{ - class MyGuiScreenJoinGame : MyGuiScreenBase - { - enum MyGameTableHeaderEnum - { - //Ping, - HostName, - SectorName, - GameType, - PlayerCount, - //JoinMode, - } - - static readonly MyGameTableHeaderEnum[] m_gameTableHeaders = (MyGameTableHeaderEnum[])Enum.GetValues(typeof(MyGameTableHeaderEnum)); - - static int HeaderCount - { - get { return m_gameTableHeaders.Length; } - } - - enum MySectorType - { - Official, - Players, - Friends, - } - - - - struct MyGameExtendedInfo - { - public readonly MyGameInfo GameInfo; - public int Ping; - public MySectorType SectorType; - public MyGameTypes GameType; - - public MyGameExtendedInfo(MyGameInfo gameInfo) - { - GameInfo = gameInfo; - Ping = MyMwcUtils.GetRandomInt(10, 20); - SectorType = MySectorType.Official; - GameType = gameInfo.GameType; - } - } - - MyGuiScreenBase m_closeAfterSuccessfulEnter; - - readonly MyGuiControlListbox m_gameList; - readonly MyGuiControlTextbox m_searchTextbox; - readonly List m_games; - readonly MyGuiControlCheckbox m_deathCheck; - readonly MyGuiControlCheckbox m_storyCheck; - - - int? m_selectRow = null; - int? m_selectColumn = null; - - MyGameTableHeaderEnum m_orderByHeader = MyGameTableHeaderEnum.PlayerCount; - bool m_orderAsc = false; - - int m_selectedGameIndex; - - /// - /// Locker used for populating the listbox with games. - /// - private readonly object m_repopulateLocker = new object(); - - MyGuiScreenWaiting m_waitingScreen; - - private MyGameTypes m_gameTypeFilter; - - private ConnectionHandler m_serverDisconnectedHandler; - private MyGuiScreenWaiting m_waitDialog; - - public MyGuiScreenJoinGame(MyGuiScreenBase closeAfterSuccessfulEnter, MyGameTypes gameTypeFilter) - : base(new Vector2(0.5f, 0.5f), MyGuiConstants.SCREEN_BACKGROUND_COLOR, new Vector2(0.95f, 0.8f)) - { - m_size = new Vector2(0.95f, 0.85f); - m_serverDisconnectedHandler = new ConnectionHandler(Static_ServerDisconnected); - - m_gameTypeFilter = gameTypeFilter; - m_backgroundTexture = MyTextureManager.GetTexture("Textures\\GUI\\BackgroundScreen\\VideoBackground", flags: TextureFlags.IgnoreQuality); - - m_closeAfterSuccessfulEnter = closeAfterSuccessfulEnter; - m_enableBackgroundFade = true; - m_games = new List(); - AddCaption(MyTextsWrapperEnum.JoinGame, new Vector2(0, 0.0075f)); - - Vector2 menuPositionOrigin = new Vector2(-0.31f, -m_size.Value.Y / 2.0f + 0.15f); - Vector2 buttonDelta = new Vector2(0.22f, 0); - const MyGuiControlButtonTextAlignment menuButtonTextAlignement = MyGuiControlButtonTextAlignment.CENTERED; - - Controls.Add(new MyGuiControlLabel(this, menuPositionOrigin, null, MyTextsWrapperEnum.SearchGameToJoin, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER)); - - m_searchTextbox = new MyGuiControlTextbox(this, menuPositionOrigin + buttonDelta, MyGuiControlPreDefinedSize.LARGE, "", 40, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, MyGuiControlTextboxType.NORMAL); - m_searchTextbox.TextChanged += OnSearchTextChanged; - Controls.Add(m_searchTextbox); - - menuPositionOrigin += new Vector2(0.395f, 0); - - var refreshButton = new MyGuiControlButton( - this, - menuPositionOrigin + buttonDelta, - MyGuiConstants.BACK_BUTTON_SIZE, - MyGuiConstants.BUTTON_BACKGROUND_COLOR, - MyTextsWrapperEnum.Refresh, - MyGuiConstants.BUTTON_TEXT_COLOR, - MyGuiConstants.BUTTON_TEXT_SCALE, - OnRefreshButtonClick, - menuButtonTextAlignement, - true, - MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, - true); - Controls.Add(refreshButton); - - menuPositionOrigin.Y += 0.052f; - menuPositionOrigin.X = -0.33f; - - var storyLabel = new MyGuiControlLabel(this, menuPositionOrigin, null, MyTextsWrapperEnum.Story, Vector4.One, 1.0f, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_CENTER); - Controls.Add(storyLabel); - - menuPositionOrigin.X = -0.35f; - m_storyCheck = new MyGuiControlCheckbox(this, menuPositionOrigin, true, Vector4.One, null); - m_storyCheck.OnCheck = CheckChanged; - Controls.Add(m_storyCheck); - - menuPositionOrigin.X = -0.2f; - var deathLabel = new MyGuiControlLabel(this, menuPositionOrigin, null, MyTextsWrapperEnum.Deathmatch, Vector4.One, 1.0f, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_CENTER); - Controls.Add(deathLabel); - - menuPositionOrigin.X = -0.22f; - m_deathCheck = new MyGuiControlCheckbox(this, menuPositionOrigin, true, Vector4.One, null); - m_deathCheck.OnCheck = CheckChanged; - Controls.Add(m_deathCheck); - - //var storyButton = new MyGuiControlButton(this, menuPositionOrigin, null, Vector4.One, MyTextsWrapperEnum.Story, Vector4.One, 1.0f, - - menuPositionOrigin.Y += 0.25f; - menuPositionOrigin.X = 0; - m_gameList = new MyGuiControlListbox(this, - menuPositionOrigin, - new Vector2(0.22f, 0.04f), - MyGuiConstants.LISTBOX_BACKGROUND_COLOR, - MyTextsWrapper.Get(MyTextsWrapperEnum.JoinGame), - MyGuiConstants.LABEL_TEXT_SCALE, - HeaderCount, 10, HeaderCount, - true, true, false, - null, null, MyGuiManager.GetScrollbarSlider(), MyGuiManager.GetHorizontalScrollbarSlider(), 2, 1, MyGuiConstants.LISTBOX_BACKGROUND_COLOR_BLUE, 0f, 0f, 0f, 0f, 0, 0, -0.01f, -0.01f, -0.02f, 0.02f); - m_gameList.ItemSelect += OnGamesItemSelect; - m_gameList.DisplayHighlight = true; - m_gameList.MultipleSelection = true; - m_gameList.ItemDoubleClick += GameListOnItemDoubleClick; - m_gameList.HighlightHeadline = true; - m_gameList.EnableAllRowHighlightWhileMouseOver(true, true); - m_gameList.SetCustomCollumnsWidths(new List() - { - 0.15f, 0.30f, 0.15f, 0.10f - }); - Controls.Add(m_gameList); - - buttonDelta = new Vector2(0.1f, m_size.Value.Y / 2.0f - MyGuiConstants.MESSAGE_BOX_BORDER_AREA_Y - MyGuiConstants.MESSAGE_BOX_BUTTON_SIZE.Y / 2.0f - 0.06f); - Controls.Add(new MyGuiControlButton(this, new Vector2(-buttonDelta.X, buttonDelta.Y), MyGuiConstants.MESSAGE_BOX_BUTTON_SIZE, - MyGuiConstants.BUTTON_BACKGROUND_COLOR, MyTextsWrapperEnum.Ok, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, - OnOkClick, MyGuiControlButtonTextAlignment.CENTERED, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); - Controls.Add(new MyGuiControlButton(this, new Vector2(+buttonDelta.X, buttonDelta.Y), MyGuiConstants.MESSAGE_BOX_BUTTON_SIZE, - MyGuiConstants.BUTTON_BACKGROUND_COLOR, MyTextsWrapperEnum.Cancel, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, - OnCancelClick, MyGuiControlButtonTextAlignment.CENTERED, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); - - AddHeaders(); - } - - public void CheckChanged(MyGuiControlCheckbox sender) - { - m_gameTypeFilter &= ~MyGameTypes.Deathmatch; - m_gameTypeFilter &= ~MyGameTypes.Story; - - if (m_deathCheck.Checked) - m_gameTypeFilter |= MyGameTypes.Deathmatch; - - if (m_storyCheck.Checked) - m_gameTypeFilter |= MyGameTypes.Story; - - GetDataFromServer(true); - } - - public override void LoadContent() - { - base.LoadContent(); - - GetDataFromServer(true); - } - - void OnRefreshButtonClick(MyGuiControlButton sender) - { - GetDataFromServer(true); - } - - public override string GetFriendlyName() - { - return "MyGuiScreenJoinGame"; - } - - void OnOkClick(MyGuiControlButton sender) - { - TryJoinGame(); - } - - void GameListOnItemDoubleClick(object sender, MyGuiControlListboxItemEventArgs eventArgs) - { - if (eventArgs.RowIndex > 0) - { - TryJoinGame(); - } - } - - void TryJoinGame() - { - if (m_selectedGameIndex < m_games.Count) - { - var gameInfo = m_games[m_selectedGameIndex].GameInfo; - - if (!MinerWars.AppCode.Game.World.MyClientServer.MW25DEnabled && (gameInfo.Name.ToUpper().Contains("2,5D") || gameInfo.Name.ToUpper().Contains("2.5D"))) - { - MyGuiManager.AddScreen(new MyGuiScreenMessageBox(MyMessageBoxType.MESSAGE, MyTextsWrapperEnum.YouNeed25D, MyTextsWrapperEnum.MessageBoxCaptionFeatureDisabled, MyTextsWrapperEnum.Ok, null)); - return; - } - - MyMultiplayerLobby.Static.JoinGame(gameInfo, String.Empty, OnGameJoined, OnGameEnterDisallowed, OnDownloadingSector); - // Longer join timeout...to be able to join after loading - m_waitingScreen = new MyGuiScreenWaiting(MyTextsWrapperEnum.JoiningGame, OnJoiningCancelOrTimeout, TimeSpan.FromSeconds(120)); - MyGuiManager.AddScreen(m_waitingScreen); - } - } - - void OnDownloadingSector() - { - if (m_waitingScreen != null) - { - m_waitingScreen.CloseScreenNow(); - m_waitingScreen = new MyGuiScreenWaiting(MyTextsWrapperEnum.DownloadingData, OnJoiningCancelOrTimeout); - MyGuiManager.AddModalScreen(m_waitingScreen, null); - } - } - - void OnJoiningCancelOrTimeout(object sender, WaitingCanceledArgs waitingCanceledArgs) - { - MyMultiplayerPeers.Static.Shutdown(); - - switch (waitingCanceledArgs.CancelReason) - { - case CancelReasonEnum.UserCancel: - // do nothing - break; - case CancelReasonEnum.Timeout: - MyGuiScreenMessageBox.Show(MyTextsWrapperEnum.JoinGameTimeout, MyTextsWrapperEnum.JoinGame, MyMessageBoxType.ERROR); - break; - default: - throw new ArgumentOutOfRangeException(); - } - - GetDataFromServer(true); - } - - void OnGameEnterDisallowed() - { - Debug.Assert(m_waitingScreen != null); - m_waitingScreen.CloseScreen(); - - MyGuiManager.AddModalScreen(new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, MyTextsWrapperEnum.DenyEnter, MyTextsWrapperEnum.MessageBoxCaptionError, MyTextsWrapperEnum.Ok, null), null); - } - - void OnGameJoined(MyGameInfo game, MyResultCodeEnum resultCode, MyMwcObjectBuilder_Checkpoint checkpointBuilder) - { - Debug.Assert(m_waitingScreen != null); - m_waitingScreen.CloseScreen(); - - if (resultCode == MyResultCodeEnum.OK) - { - var loadingScreen = MySession.StartJoinMultiplayerSession(game.GameType, game.Difficulty, checkpointBuilder); - loadingScreen.Closed += new MyGuiScreenBase.ScreenHandler(OnLoadFinished); - } - else if (resultCode == MyResultCodeEnum.GAME_NOT_EXISTS) - { - MyGuiManager.AddModalScreen(new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, MyTextsWrapperEnum.MP_GameHasEnded, MyTextsWrapperEnum.MessageBoxCaptionError, MyTextsWrapperEnum.Ok, null), null); - GetDataFromServer(true); - } - else - { - MyGuiManager.AddModalScreen(new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, MyTextsWrapperEnum.ErrorCreatingNetworkConnection, MyTextsWrapperEnum.MessageBoxCaptionError, MyTextsWrapperEnum.Ok, null), null); - GetDataFromServer(true); - } - } - - void OnLoadFinished(MyGuiScreenBase screen) - { - - } - - - void OnCancelClick(MyGuiControlButton sender) - { - CloseScreen(); - } - - private void GetDataFromServer(bool withWaitDialog) - { - m_games.Clear(); - - if (MySteam.IsActive && !MySteam.IsOnline) - { - MyGuiManager.AddScreen(new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, MyTextsWrapperEnum.SteamInvalidTicketText, MyTextsWrapperEnum.SteamInvalidTicketCaption, MyTextsWrapperEnum.Ok, null)); - return; - } - - try - { - if (m_gameTypeFilter != MyGameTypes.None) - { - MyMultiplayerPeers.Static.ServerDisconnected -= m_serverDisconnectedHandler; - MyMultiplayerLobby.Static.GetGames(OnGetGames, m_searchTextbox.Text, m_gameTypeFilter); - if (withWaitDialog) - { - MyMultiplayerPeers.Static.ServerDisconnected += m_serverDisconnectedHandler; - m_waitDialog = new MyGuiScreenWaiting(MyTextsWrapperEnum.LoadFromServer, new EventHandler(WaitCanceled), TimeSpan.FromSeconds(30)); - MyGuiManager.AddModalScreen(m_waitDialog, null); - } - } - else - { - OnGetGames(new List()); - } - } - catch (Exception exception) - { - HandleError(new StringBuilder("Cannot connect to server")); - MyMwcLog.WriteLine("Cannot connect to server:"); - MyMwcLog.WriteLine(exception); - MyMultiplayerPeers.Static.Shutdown(); - } - } - - void WaitCanceled(object sender, WaitingCanceledArgs args) - { - MyMultiplayerPeers.Static.ServerDisconnected -= m_serverDisconnectedHandler; - MyMultiplayerLobby.Static.CancelGetGames(); - - if (args.CancelReason == CancelReasonEnum.Timeout) - { - ShowNetworkError(); - } - } - - void Static_ServerDisconnected(Lidgren.Network.NetConnection connection) - { - MySteam.RefreshSessionTicket(); - - if (m_waitDialog != null) - { - m_waitDialog.CloseScreen(); - m_waitDialog = null; - } - MyMultiplayerPeers.Static.ServerDisconnected -= m_serverDisconnectedHandler; - ShowNetworkError(); - } - - private static void ShowNetworkError() - { - var caption = MyTextsWrapper.Get(MyTextsWrapperEnum.MessageBoxNetworkErrorCaption); - var msg = new StringBuilder(MyTextsWrapper.GetFormatString(MyTextsWrapperEnum.MP_CannotConnectServerJoin, MinerWars.CommonLIB.AppCode.Utils.MyMwcNetworkingConstants.NETWORKING_PORT_MASTER_SERVER)); - MyGuiManager.AddModalScreen(new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, msg, caption, MyTextsWrapperEnum.Ok, null), null); - } - - void OnGetGames(List gamesList) - { - MyMultiplayerPeers.Static.ServerDisconnected -= m_serverDisconnectedHandler; - if (m_waitDialog != null) - { - m_waitDialog.CloseScreen(); - m_waitDialog = null; - } - - lock (m_repopulateLocker) - { - if (!FillGamesFromLobbiesInfo(gamesList)) - return; - - OrderGames(); - RefreshGameList(); - } - } - - void HandleError(StringBuilder text) - { - MyGuiManager.AddModalScreen(new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, MyTextsWrapperEnum.ErrorCreatingNetworkConnection, MyTextsWrapperEnum.MessageBoxCaptionError, MyTextsWrapperEnum.Ok, null), null); - } - - private bool RefreshGameList() - { - m_gameList.RemoveAllRows(); - AddHeaders(); - - foreach (MyGameExtendedInfo gameInfo in m_games) - { - AddGame(gameInfo); - } - - return true; - } - - private void OrderGames() - { - if (m_games == null) return; - - m_games.Sort(CompareByHeaderType); - } - - int CompareByHeaderType(MyGameExtendedInfo x, MyGameExtendedInfo y) - { - int resultForAscending; - - switch (m_orderByHeader) - { - //case MyGameTableHeaderEnum.Ping: - // resultForAscending = x.Ping.CompareTo(y.Ping); - // break; - case MyGameTableHeaderEnum.HostName: - resultForAscending = String.CompareOrdinal(x.GameInfo.HostDisplayName, y.GameInfo.HostDisplayName); - break; - case MyGameTableHeaderEnum.SectorName: - resultForAscending = String.CompareOrdinal(x.GameInfo.Name, y.GameInfo.Name); - break; - case MyGameTableHeaderEnum.GameType: - resultForAscending = ((int)x.GameType).CompareTo(((int)y.GameType)); - break; - case MyGameTableHeaderEnum.PlayerCount: - resultForAscending = x.GameInfo.PlayerCount.CompareTo(y.GameInfo.PlayerCount); - break; - //case MyGameTableHeaderEnum.JoinMode: - // resultForAscending = x.GameInfo.JoinMode.CompareTo(y.GameInfo.JoinMode); - break; - default: - throw new IndexOutOfRangeException("m_orderByHeader"); - } - - if (m_orderAsc) - { - return resultForAscending; - } - else - { - return -resultForAscending; - } - } - - private bool FillGamesFromLobbiesInfo(List games) - { - if (games == null || m_games == null) return false; - - m_games.Clear(); - - foreach (MyGameInfo game in games) - { - if (game.Name.StartsWith("**")) - continue; - - if (MyMwcSectorIdentifier.Is25DSector(game.Name)) - { - if (MyClientServer.MW25DEnabled) - { - m_games.Add(new MyGameExtendedInfo(game)); - } - } - else - { - if (MyClientServer.HasFullGame) - { - m_games.Add(new MyGameExtendedInfo(game)); - } - } - } - - return true; - } - - private void AddHeaders() - { - int rowIndex = m_gameList.AddRow(); - - for (int currentHeader = 0; currentHeader < HeaderCount; currentHeader++) - { - AddHeader(rowIndex, currentHeader); - } - } - - void AddHeader(int rowIndex, int currentColumn) - { - m_gameList.AddItem( - GetHeaderKey(currentColumn, rowIndex), - GetHeaderText(m_gameTableHeaders[currentColumn]), - null, - rowIndex, - currentColumn); - } - - static StringBuilder GetHeaderText(MyGameTableHeaderEnum headerType) - { - switch (headerType) - { - //case MyGameTableHeaderEnum.Ping: - // return MyTextsWrapper.Get(MyTextsWrapperEnum.HeaderPing); - case MyGameTableHeaderEnum.HostName: - return MyTextsWrapper.Get(MyTextsWrapperEnum.HeaderHostName); - case MyGameTableHeaderEnum.SectorName: - return MyTextsWrapper.Get(MyTextsWrapperEnum.HeaderSectorName); - case MyGameTableHeaderEnum.GameType: - return MyTextsWrapper.Get(MyTextsWrapperEnum.HeaderType); - case MyGameTableHeaderEnum.PlayerCount: - return MyTextsWrapper.Get(MyTextsWrapperEnum.HeaderPlayerCount); - //case MyGameTableHeaderEnum.JoinMode: - // return new StringBuilder("JoinMode"); - default: - throw new ArgumentOutOfRangeException("headerType"); - } - } - - static int GetHeaderKey(int currentColumn, int rowIndex) - { - return rowIndex * HeaderCount + currentColumn; - } - - private bool AddGame(MyGameExtendedInfo gameInfo) - { - if (m_gameList == null) return false; - - StringBuilder pingText = new StringBuilder(6); - pingText.Append("? "); // TODO: measure ping - pingText.Append("ms"); - int rowIndex = m_gameList.AddRow(); - //m_gameList.AddItem(rowIndex * (HeaderCount) + 0, pingText, null, rowIndex, 0); - m_gameList.AddItem(rowIndex * (HeaderCount) + 0, new StringBuilder(gameInfo.GameInfo.HostDisplayName), null, rowIndex, 0); - m_gameList.AddItem(rowIndex * (HeaderCount) + 1, new StringBuilder(gameInfo.GameInfo.Name), GetSectorIcon(gameInfo.GameInfo), rowIndex, 1); - m_gameList.AddItem(rowIndex * (HeaderCount) + 2, GetGameType(gameInfo.GameInfo), null, rowIndex, 2); - m_gameList.AddItem(rowIndex * (HeaderCount) + 3, new StringBuilder(gameInfo.GameInfo.PlayerCount + "/" + gameInfo.GameInfo.MaxPlayerCount), null, rowIndex, 3); - //m_gameList.AddItem(rowIndex * (HeaderCount-1) + 5, new StringBuilder(gameInfo.GameInfo.JoinMode.ToString()), null, rowIndex, 5); - - return true; - } - - private MyTexture2D GetSectorIcon(MyGameInfo gameInfo) - { - switch (0) - { - default: - return null; - } - } - - private StringBuilder GetGameType(MyGameInfo gameInfo) - { - switch (gameInfo.GameType) - { - case MyGameTypes.Story: - return new StringBuilder(MyTextsWrapper.Get(MyTextsWrapperEnum.Story) + " (" + MyTextsWrapper.Get(MyGameplayConstants.GetGameplayDifficultyProfile(gameInfo.Difficulty).DifficultyName) + ")"); - break; - case MyGameTypes.Deathmatch: - return MyTextsWrapper.Get(MyTextsWrapperEnum.Deathmatch); - break; - default: - return MyTextsWrapper.Get(MyTextsWrapperEnum.UNKNOWN); - break; - } - } - - void OnSearchTextChanged(object sender, EventArgs e) - { - if (sender == m_searchTextbox) - { - GetDataFromServer(false); - } - } - - void OnGamesItemSelect(object sender, MyGuiControlListboxItemEventArgs eventArgs) - { - if (eventArgs.RowIndex == 0) - { - //m_selectColumn = eventArgs.ItemIndex; - - //order items - if (m_gameTableHeaders[eventArgs.ItemIndex] == m_orderByHeader) - { - m_orderAsc = !m_orderAsc; - } - else - { - m_orderAsc = true; - m_orderByHeader = m_gameTableHeaders[eventArgs.ItemIndex]; - } - OrderGames(); - RefreshGameList(); - } - else - { - m_selectedGameIndex = eventArgs.RowIndex - 1; - m_selectRow = eventArgs.RowIndex; - } - - } - - public override bool Update(bool hasFocus) - { - if (m_selectColumn.HasValue) - { - m_gameList.SelectColumn(m_selectColumn.Value); - m_selectColumn = null; - } - if (m_selectRow.HasValue) - { - m_gameList.SelectRow(m_selectRow.Value); - m_selectRow = null; - } - return base.Update(hasFocus); - } - } +using System; +using System.Diagnostics; +using System.Text; +using System.Collections.Generic; +using MinerWarsMath; +using MinerWars.AppCode.Game.GUI.Core; +using MinerWars.AppCode.Game.Localization; +using MinerWars.AppCode.Game.Utils; +using MinerWars.CommonLIB.AppCode.Utils; +using MinerWars.AppCode.Game.Sessions; +using MinerWars.CommonLIB.AppCode.Networking.Multiplayer; +using MinerWars.AppCode.Game.Textures; +using MinerWars.CommonLIB.AppCode.ObjectBuilders; +using MinerWars.AppCode.Game.Managers.Session; +using MinerWars.CommonLIB.AppCode.ObjectBuilders.Object3D; +using MinerWars.AppCode.Game.HUD; +using MinerWars.AppCode.Game.Sessions.Multiplayer; +using SysUtils.Utils; +using MinerWars.CommonLIB.AppCode.Networking; +using MinerWars.AppCode.Game.Gameplay; +using MinerWars.AppCode.Game.World; +using MinerWars.AppCode.Networking; + +namespace MinerWars.AppCode.Game.GUI +{ + class MyGuiScreenJoinGame : MyGuiScreenBase + { + enum MyGameTableHeaderEnum + { + //Ping, + HostName, + SectorName, + GameType, + PlayerCount, + //JoinMode, + } + + static readonly MyGameTableHeaderEnum[] m_gameTableHeaders = (MyGameTableHeaderEnum[])Enum.GetValues(typeof(MyGameTableHeaderEnum)); + + static int HeaderCount + { + get { return m_gameTableHeaders.Length; } + } + + enum MySectorType + { + Official, + Players, + Friends, + } + + + + struct MyGameExtendedInfo + { + public readonly MyGameInfo GameInfo; + public int Ping; + public MySectorType SectorType; + public MyGameTypes GameType; + + public MyGameExtendedInfo(MyGameInfo gameInfo) + { + GameInfo = gameInfo; + Ping = MyMwcUtils.GetRandomInt(10, 20); + SectorType = MySectorType.Official; + GameType = gameInfo.GameType; + } + } + + MyGuiScreenBase m_closeAfterSuccessfulEnter; + + readonly MyGuiControlListbox m_gameList; + readonly MyGuiControlTextbox m_searchTextbox; + readonly List m_games; + readonly MyGuiControlCheckbox m_deathCheck; + readonly MyGuiControlCheckbox m_storyCheck; + + + int? m_selectRow = null; + int? m_selectColumn = null; + + MyGameTableHeaderEnum m_orderByHeader = MyGameTableHeaderEnum.PlayerCount; + bool m_orderAsc = false; + + int m_selectedGameIndex; + + /// + /// Locker used for populating the listbox with games. + /// + private readonly object m_repopulateLocker = new object(); + + MyGuiScreenWaiting m_waitingScreen; + + private MyGameTypes m_gameTypeFilter; + + private ConnectionHandler m_serverDisconnectedHandler; + private MyGuiScreenWaiting m_waitDialog; + + public MyGuiScreenJoinGame(MyGuiScreenBase closeAfterSuccessfulEnter, MyGameTypes gameTypeFilter) + : base(new Vector2(0.5f, 0.5f), MyGuiConstants.SCREEN_BACKGROUND_COLOR, new Vector2(0.95f, 0.8f)) + { + m_size = new Vector2(0.95f, 0.85f); + m_serverDisconnectedHandler = new ConnectionHandler(Static_ServerDisconnected); + + m_gameTypeFilter = gameTypeFilter; + m_backgroundTexture = MyTextureManager.GetTexture("Textures\\GUI\\BackgroundScreen\\VideoBackground", flags: TextureFlags.IgnoreQuality); + + m_closeAfterSuccessfulEnter = closeAfterSuccessfulEnter; + m_enableBackgroundFade = true; + m_games = new List(); + AddCaption(MyTextsWrapperEnum.JoinGame, new Vector2(0, 0.0075f)); + + Vector2 menuPositionOrigin = new Vector2(-0.31f, -m_size.Value.Y / 2.0f + 0.15f); + Vector2 buttonDelta = new Vector2(0.22f, 0); + const MyGuiControlButtonTextAlignment menuButtonTextAlignement = MyGuiControlButtonTextAlignment.CENTERED; + + Controls.Add(new MyGuiControlLabel(this, menuPositionOrigin, null, MyTextsWrapperEnum.SearchGameToJoin, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER)); + + m_searchTextbox = new MyGuiControlTextbox(this, menuPositionOrigin + buttonDelta, MyGuiControlPreDefinedSize.LARGE, "", 40, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, MyGuiControlTextboxType.NORMAL); + m_searchTextbox.TextChanged += OnSearchTextChanged; + Controls.Add(m_searchTextbox); + + menuPositionOrigin += new Vector2(0.395f, 0); + + var refreshButton = new MyGuiControlButton( + this, + menuPositionOrigin + buttonDelta, + MyGuiConstants.BACK_BUTTON_SIZE, + MyGuiConstants.BUTTON_BACKGROUND_COLOR, + MyTextsWrapperEnum.Refresh, + MyGuiConstants.BUTTON_TEXT_COLOR, + MyGuiConstants.BUTTON_TEXT_SCALE, + OnRefreshButtonClick, + menuButtonTextAlignement, + true, + MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, + true); + Controls.Add(refreshButton); + + menuPositionOrigin.Y += 0.052f; + menuPositionOrigin.X = -0.33f; + + var storyLabel = new MyGuiControlLabel(this, menuPositionOrigin, null, MyTextsWrapperEnum.Story, Vector4.One, 1.0f, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_CENTER); + Controls.Add(storyLabel); + + menuPositionOrigin.X = -0.35f; + m_storyCheck = new MyGuiControlCheckbox(this, menuPositionOrigin, true, Vector4.One, null); + m_storyCheck.OnCheck = CheckChanged; + Controls.Add(m_storyCheck); + + menuPositionOrigin.X = -0.2f; + var deathLabel = new MyGuiControlLabel(this, menuPositionOrigin, null, MyTextsWrapperEnum.Deathmatch, Vector4.One, 1.0f, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_CENTER); + Controls.Add(deathLabel); + + menuPositionOrigin.X = -0.22f; + m_deathCheck = new MyGuiControlCheckbox(this, menuPositionOrigin, true, Vector4.One, null); + m_deathCheck.OnCheck = CheckChanged; + Controls.Add(m_deathCheck); + + //var storyButton = new MyGuiControlButton(this, menuPositionOrigin, null, Vector4.One, MyTextsWrapperEnum.Story, Vector4.One, 1.0f, + + menuPositionOrigin.Y += 0.25f; + menuPositionOrigin.X = 0; + m_gameList = new MyGuiControlListbox(this, + menuPositionOrigin, + new Vector2(0.22f, 0.04f), + MyGuiConstants.LISTBOX_BACKGROUND_COLOR, + MyTextsWrapper.Get(MyTextsWrapperEnum.JoinGame), + MyGuiConstants.LABEL_TEXT_SCALE, + HeaderCount, 10, HeaderCount, + true, true, false, + null, null, MyGuiManager.GetScrollbarSlider(), MyGuiManager.GetHorizontalScrollbarSlider(), 2, 1, MyGuiConstants.LISTBOX_BACKGROUND_COLOR_BLUE, 0f, 0f, 0f, 0f, 0, 0, -0.01f, -0.01f, -0.02f, 0.02f); + m_gameList.ItemSelect += OnGamesItemSelect; + m_gameList.DisplayHighlight = true; + m_gameList.MultipleSelection = true; + m_gameList.ItemDoubleClick += GameListOnItemDoubleClick; + m_gameList.HighlightHeadline = true; + m_gameList.EnableAllRowHighlightWhileMouseOver(true, true); + m_gameList.SetCustomCollumnsWidths(new List() + { + 0.15f, 0.30f, 0.15f, 0.10f + }); + Controls.Add(m_gameList); + + buttonDelta = new Vector2(0.1f, m_size.Value.Y / 2.0f - MyGuiConstants.MESSAGE_BOX_BORDER_AREA_Y - MyGuiConstants.MESSAGE_BOX_BUTTON_SIZE.Y / 2.0f - 0.06f); + Controls.Add(new MyGuiControlButton(this, new Vector2(-buttonDelta.X, buttonDelta.Y), MyGuiConstants.MESSAGE_BOX_BUTTON_SIZE, + MyGuiConstants.BUTTON_BACKGROUND_COLOR, MyTextsWrapperEnum.Ok, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, + OnOkClick, MyGuiControlButtonTextAlignment.CENTERED, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); + Controls.Add(new MyGuiControlButton(this, new Vector2(+buttonDelta.X, buttonDelta.Y), MyGuiConstants.MESSAGE_BOX_BUTTON_SIZE, + MyGuiConstants.BUTTON_BACKGROUND_COLOR, MyTextsWrapperEnum.Cancel, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, + OnCancelClick, MyGuiControlButtonTextAlignment.CENTERED, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); + + AddHeaders(); + } + + public void CheckChanged(MyGuiControlCheckbox sender) + { + m_gameTypeFilter &= ~MyGameTypes.Deathmatch; + m_gameTypeFilter &= ~MyGameTypes.Story; + + if (m_deathCheck.Checked) + m_gameTypeFilter |= MyGameTypes.Deathmatch; + + if (m_storyCheck.Checked) + m_gameTypeFilter |= MyGameTypes.Story; + + GetDataFromServer(true); + } + + public override void LoadContent() + { + base.LoadContent(); + + GetDataFromServer(true); + } + + void OnRefreshButtonClick(MyGuiControlButton sender) + { + GetDataFromServer(true); + } + + public override string GetFriendlyName() + { + return "MyGuiScreenJoinGame"; + } + + void OnOkClick(MyGuiControlButton sender) + { + TryJoinGame(); + } + + void GameListOnItemDoubleClick(object sender, MyGuiControlListboxItemEventArgs eventArgs) + { + if (eventArgs.RowIndex > 0) + { + TryJoinGame(); + } + } + + void TryJoinGame() + { + if (m_selectedGameIndex < m_games.Count) + { + var gameInfo = m_games[m_selectedGameIndex].GameInfo; + + if (!MinerWars.AppCode.Game.World.MyClientServer.MW25DEnabled && (gameInfo.Name.ToUpper().Contains("2,5D") || gameInfo.Name.ToUpper().Contains("2.5D"))) + { + MyGuiManager.AddScreen(new MyGuiScreenMessageBox(MyMessageBoxType.MESSAGE, MyTextsWrapperEnum.YouNeed25D, MyTextsWrapperEnum.MessageBoxCaptionFeatureDisabled, MyTextsWrapperEnum.Ok, null)); + return; + } + + MyMultiplayerLobby.Static.JoinGame(gameInfo, String.Empty, OnGameJoined, OnGameEnterDisallowed, OnDownloadingSector); + // Longer join timeout...to be able to join after loading + m_waitingScreen = new MyGuiScreenWaiting(MyTextsWrapperEnum.JoiningGame, OnJoiningCancelOrTimeout, TimeSpan.FromSeconds(120)); + MyGuiManager.AddScreen(m_waitingScreen); + } + } + + void OnDownloadingSector() + { + if (m_waitingScreen != null) + { + m_waitingScreen.CloseScreenNow(); + m_waitingScreen = new MyGuiScreenWaiting(MyTextsWrapperEnum.DownloadingData, OnJoiningCancelOrTimeout); + MyGuiManager.AddModalScreen(m_waitingScreen, null); + } + } + + void OnJoiningCancelOrTimeout(object sender, WaitingCanceledArgs waitingCanceledArgs) + { + MyMultiplayerPeers.Static.Shutdown(); + + switch (waitingCanceledArgs.CancelReason) + { + case CancelReasonEnum.UserCancel: + // do nothing + break; + case CancelReasonEnum.Timeout: + MyGuiScreenMessageBox.Show(MyTextsWrapperEnum.JoinGameTimeout, MyTextsWrapperEnum.JoinGame, MyMessageBoxType.ERROR); + break; + default: + throw new ArgumentOutOfRangeException(); + } + + GetDataFromServer(true); + } + + void OnGameEnterDisallowed() + { + Debug.Assert(m_waitingScreen != null); + m_waitingScreen.CloseScreen(); + + MyGuiManager.AddModalScreen(new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, MyTextsWrapperEnum.DenyEnter, MyTextsWrapperEnum.MessageBoxCaptionError, MyTextsWrapperEnum.Ok, null), null); + } + + void OnGameJoined(MyGameInfo game, MyResultCodeEnum resultCode, MyMwcObjectBuilder_Checkpoint checkpointBuilder) + { + Debug.Assert(m_waitingScreen != null); + m_waitingScreen.CloseScreen(); + + if (resultCode == MyResultCodeEnum.OK) + { + var loadingScreen = MySession.StartJoinMultiplayerSession(game.GameType, game.Difficulty, checkpointBuilder); + loadingScreen.Closed += new MyGuiScreenBase.ScreenHandler(OnLoadFinished); + } + else if (resultCode == MyResultCodeEnum.GAME_NOT_EXISTS) + { + MyGuiManager.AddModalScreen(new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, MyTextsWrapperEnum.MP_GameHasEnded, MyTextsWrapperEnum.MessageBoxCaptionError, MyTextsWrapperEnum.Ok, null), null); + GetDataFromServer(true); + } + else + { + MyGuiManager.AddModalScreen(new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, MyTextsWrapperEnum.ErrorCreatingNetworkConnection, MyTextsWrapperEnum.MessageBoxCaptionError, MyTextsWrapperEnum.Ok, null), null); + GetDataFromServer(true); + } + } + + void OnLoadFinished(MyGuiScreenBase screen) + { + + } + + + void OnCancelClick(MyGuiControlButton sender) + { + CloseScreen(); + } + + private void GetDataFromServer(bool withWaitDialog) + { + m_games.Clear(); + + if (MySteam.IsActive && !MySteam.IsOnline) + { + MyGuiManager.AddScreen(new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, MyTextsWrapperEnum.SteamInvalidTicketText, MyTextsWrapperEnum.SteamInvalidTicketCaption, MyTextsWrapperEnum.Ok, null)); + return; + } + + try + { + if (m_gameTypeFilter != MyGameTypes.None) + { + MyMultiplayerPeers.Static.ServerDisconnected -= m_serverDisconnectedHandler; + MyMultiplayerLobby.Static.GetGames(OnGetGames, m_searchTextbox.Text, m_gameTypeFilter); + if (withWaitDialog) + { + MyMultiplayerPeers.Static.ServerDisconnected += m_serverDisconnectedHandler; + m_waitDialog = new MyGuiScreenWaiting(MyTextsWrapperEnum.LoadFromServer, new EventHandler(WaitCanceled), TimeSpan.FromSeconds(30)); + MyGuiManager.AddModalScreen(m_waitDialog, null); + } + } + else + { + OnGetGames(new List()); + } + } + catch (Exception exception) + { + HandleError(new StringBuilder("Cannot connect to server")); + MyMwcLog.WriteLine("Cannot connect to server:"); + MyMwcLog.WriteLine(exception); + MyMultiplayerPeers.Static.Shutdown(); + } + } + + void WaitCanceled(object sender, WaitingCanceledArgs args) + { + MyMultiplayerPeers.Static.ServerDisconnected -= m_serverDisconnectedHandler; + MyMultiplayerLobby.Static.CancelGetGames(); + + if (args.CancelReason == CancelReasonEnum.Timeout) + { + ShowNetworkError(); + } + } + + void Static_ServerDisconnected(Lidgren.Network.NetConnection connection) + { + MySteam.RefreshSessionTicket(); + + if (m_waitDialog != null) + { + m_waitDialog.CloseScreen(); + m_waitDialog = null; + } + MyMultiplayerPeers.Static.ServerDisconnected -= m_serverDisconnectedHandler; + //ShowNetworkError(); + } + + private static void ShowNetworkError() + { + var caption = MyTextsWrapper.Get(MyTextsWrapperEnum.MessageBoxNetworkErrorCaption); + var msg = new StringBuilder(MyTextsWrapper.GetFormatString(MyTextsWrapperEnum.MP_CannotConnectServerJoin, MinerWars.CommonLIB.AppCode.Utils.MyMwcNetworkingConstants.NETWORKING_PORT_MASTER_SERVER)); + MyGuiManager.AddModalScreen(new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, msg, caption, MyTextsWrapperEnum.Ok, null), null); + } + + void OnGetGames(List gamesList) + { + MyMultiplayerPeers.Static.ServerDisconnected -= m_serverDisconnectedHandler; + if (m_waitDialog != null) + { + m_waitDialog.CloseScreen(); + m_waitDialog = null; + } + + lock (m_repopulateLocker) + { + if (!FillGamesFromLobbiesInfo(gamesList)) + return; + + OrderGames(); + RefreshGameList(); + } + } + + void HandleError(StringBuilder text) + { + MyGuiManager.AddModalScreen(new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, MyTextsWrapperEnum.ErrorCreatingNetworkConnection, MyTextsWrapperEnum.MessageBoxCaptionError, MyTextsWrapperEnum.Ok, null), null); + } + + private bool RefreshGameList() + { + m_gameList.RemoveAllRows(); + AddHeaders(); + + foreach (MyGameExtendedInfo gameInfo in m_games) + { + AddGame(gameInfo); + } + + return true; + } + + private void OrderGames() + { + if (m_games == null) return; + + m_games.Sort(CompareByHeaderType); + } + + int CompareByHeaderType(MyGameExtendedInfo x, MyGameExtendedInfo y) + { + int resultForAscending; + + switch (m_orderByHeader) + { + //case MyGameTableHeaderEnum.Ping: + // resultForAscending = x.Ping.CompareTo(y.Ping); + // break; + case MyGameTableHeaderEnum.HostName: + resultForAscending = String.CompareOrdinal(x.GameInfo.HostDisplayName, y.GameInfo.HostDisplayName); + break; + case MyGameTableHeaderEnum.SectorName: + resultForAscending = String.CompareOrdinal(x.GameInfo.Name, y.GameInfo.Name); + break; + case MyGameTableHeaderEnum.GameType: + resultForAscending = ((int)x.GameType).CompareTo(((int)y.GameType)); + break; + case MyGameTableHeaderEnum.PlayerCount: + resultForAscending = x.GameInfo.PlayerCount.CompareTo(y.GameInfo.PlayerCount); + break; + //case MyGameTableHeaderEnum.JoinMode: + // resultForAscending = x.GameInfo.JoinMode.CompareTo(y.GameInfo.JoinMode); + break; + default: + throw new IndexOutOfRangeException("m_orderByHeader"); + } + + if (m_orderAsc) + { + return resultForAscending; + } + else + { + return -resultForAscending; + } + } + + private bool FillGamesFromLobbiesInfo(List games) + { + if (games == null || m_games == null) return false; + + m_games.Clear(); + + foreach (MyGameInfo game in games) + { + if (game.Name.StartsWith("**")) + continue; + + if (MyMwcSectorIdentifier.Is25DSector(game.Name)) + { + if (MyClientServer.MW25DEnabled) + { + m_games.Add(new MyGameExtendedInfo(game)); + } + } + else + { + if (MyClientServer.HasFullGame) + { + m_games.Add(new MyGameExtendedInfo(game)); + } + } + } + + return true; + } + + private void AddHeaders() + { + int rowIndex = m_gameList.AddRow(); + + for (int currentHeader = 0; currentHeader < HeaderCount; currentHeader++) + { + AddHeader(rowIndex, currentHeader); + } + } + + void AddHeader(int rowIndex, int currentColumn) + { + m_gameList.AddItem( + GetHeaderKey(currentColumn, rowIndex), + GetHeaderText(m_gameTableHeaders[currentColumn]), + null, + rowIndex, + currentColumn); + } + + static StringBuilder GetHeaderText(MyGameTableHeaderEnum headerType) + { + switch (headerType) + { + //case MyGameTableHeaderEnum.Ping: + // return MyTextsWrapper.Get(MyTextsWrapperEnum.HeaderPing); + case MyGameTableHeaderEnum.HostName: + return MyTextsWrapper.Get(MyTextsWrapperEnum.HeaderHostName); + case MyGameTableHeaderEnum.SectorName: + return MyTextsWrapper.Get(MyTextsWrapperEnum.HeaderSectorName); + case MyGameTableHeaderEnum.GameType: + return MyTextsWrapper.Get(MyTextsWrapperEnum.HeaderType); + case MyGameTableHeaderEnum.PlayerCount: + return MyTextsWrapper.Get(MyTextsWrapperEnum.HeaderPlayerCount); + //case MyGameTableHeaderEnum.JoinMode: + // return new StringBuilder("JoinMode"); + default: + throw new ArgumentOutOfRangeException("headerType"); + } + } + + static int GetHeaderKey(int currentColumn, int rowIndex) + { + return rowIndex * HeaderCount + currentColumn; + } + + private bool AddGame(MyGameExtendedInfo gameInfo) + { + if (m_gameList == null) return false; + + StringBuilder pingText = new StringBuilder(6); + pingText.Append("? "); // TODO: measure ping + pingText.Append("ms"); + int rowIndex = m_gameList.AddRow(); + //m_gameList.AddItem(rowIndex * (HeaderCount) + 0, pingText, null, rowIndex, 0); + m_gameList.AddItem(rowIndex * (HeaderCount) + 0, new StringBuilder(gameInfo.GameInfo.HostDisplayName), null, rowIndex, 0); + m_gameList.AddItem(rowIndex * (HeaderCount) + 1, new StringBuilder(gameInfo.GameInfo.Name), GetSectorIcon(gameInfo.GameInfo), rowIndex, 1); + m_gameList.AddItem(rowIndex * (HeaderCount) + 2, GetGameType(gameInfo.GameInfo), null, rowIndex, 2); + m_gameList.AddItem(rowIndex * (HeaderCount) + 3, new StringBuilder(gameInfo.GameInfo.PlayerCount + "/" + gameInfo.GameInfo.MaxPlayerCount), null, rowIndex, 3); + //m_gameList.AddItem(rowIndex * (HeaderCount-1) + 5, new StringBuilder(gameInfo.GameInfo.JoinMode.ToString()), null, rowIndex, 5); + + return true; + } + + private MyTexture2D GetSectorIcon(MyGameInfo gameInfo) + { + switch (0) + { + default: + return null; + } + } + + private StringBuilder GetGameType(MyGameInfo gameInfo) + { + switch (gameInfo.GameType) + { + case MyGameTypes.Story: + return new StringBuilder(MyTextsWrapper.Get(MyTextsWrapperEnum.Story) + " (" + MyTextsWrapper.Get(MyGameplayConstants.GetGameplayDifficultyProfile(gameInfo.Difficulty).DifficultyName) + ")"); + break; + case MyGameTypes.Deathmatch: + return MyTextsWrapper.Get(MyTextsWrapperEnum.Deathmatch); + break; + default: + return MyTextsWrapper.Get(MyTextsWrapperEnum.UNKNOWN); + break; + } + } + + void OnSearchTextChanged(object sender, EventArgs e) + { + if (sender == m_searchTextbox) + { + GetDataFromServer(false); + } + } + + void OnGamesItemSelect(object sender, MyGuiControlListboxItemEventArgs eventArgs) + { + if (eventArgs.RowIndex == 0) + { + //m_selectColumn = eventArgs.ItemIndex; + + //order items + if (m_gameTableHeaders[eventArgs.ItemIndex] == m_orderByHeader) + { + m_orderAsc = !m_orderAsc; + } + else + { + m_orderAsc = true; + m_orderByHeader = m_gameTableHeaders[eventArgs.ItemIndex]; + } + OrderGames(); + RefreshGameList(); + } + else + { + m_selectedGameIndex = eventArgs.RowIndex - 1; + m_selectRow = eventArgs.RowIndex; + } + + } + + public override bool Update(bool hasFocus) + { + if (m_selectColumn.HasValue) + { + m_gameList.SelectColumn(m_selectColumn.Value); + m_selectColumn = null; + } + if (m_selectRow.HasValue) + { + m_gameList.SelectRow(m_selectRow.Value); + m_selectRow = null; + } + return base.Update(hasFocus); + } + } } \ No newline at end of file diff --git a/Sources/MinerWars.GameLib/AppCode/Game/GUI/MyGuiScreenMainMenu.cs b/Sources/MinerWars.GameLib/AppCode/Game/GUI/MyGuiScreenMainMenu.cs index d7e26e2..ee6bcc1 100644 --- a/Sources/MinerWars.GameLib/AppCode/Game/GUI/MyGuiScreenMainMenu.cs +++ b/Sources/MinerWars.GameLib/AppCode/Game/GUI/MyGuiScreenMainMenu.cs @@ -1,1115 +1,1115 @@ -using MinerWarsMath; -using MinerWars.AppCode.Toolkit.Input; -using MinerWars.AppCode.App; -using MinerWars.AppCode.Game.Audio; -using MinerWars.AppCode.Game.GUI.Core; -using MinerWars.AppCode.Game.Localization; -using MinerWars.AppCode.Game.Utils; -using MinerWars.AppCode.Game.World; -using MinerWars.CommonLIB.AppCode.Networking; -using SysUtils.Utils; -using MinerWars.AppCode.Game.Textures; -using KeenSoftwareHouse.Library.Extensions; - -// This main menu server for different scenarios. Right after the game is started it displays default main menu. -// During game or fly-through it displays different buttons and may behave differently. - -namespace MinerWars.AppCode.Game.GUI -{ - using System; - using System.Text; - using Networking.SectorService; - using Missions; - using Managers.Session; - using Sessions; - using CommonLIB.AppCode.Networking.Multiplayer; - using SysUtils; - using MinerWars.AppCode.Networking; - using MinerWars.AppCode.Networking.MasterService; - using System.ServiceModel; - using System.Threading; - using System.Diagnostics; - using System.Runtime.InteropServices; - using MinerWars.CommonLIB.AppCode.ObjectBuilders; - - class MyGuiScreenMainMenu : MyGuiScreenBase - { - static int m_autologinAttempts = 0; - //MyLowFPSDetection m_lowFpsDetection; - //static MyTexture2D m_MainMenuPanelBackground; - private static MyTexture2D m_MainmenuOverlay; - private Vector2 m_mainMenuPanelSize; - private Vector2 m_mainMenuPanelPosition; - private bool m_musicPlayed = false; - private int m_timeFromMenuLoadedMS = 0; - private const int PLAY_MUSIC_AFTER_MENU_LOADED_MS = 1000; - - private static bool m_loginInProgress = false; - - MyGuiControlButton m_btnJoinMode; - - private StringBuilder m_playerNameString = new StringBuilder(40); - private bool m_showVideoOptions = true; - - delegate void OnLoginVerified(); - - public override string GetFriendlyName() - { - return "MyGuiScreenMainMenu"; - } - - public static void SkipAutologin() - { - m_autologinAttempts = 1; - } - - // This is for adding main menu the easy way - public static void AddMainMenu(bool showVideoOptions) - { - MyGuiManager.AddScreen(new MyGuiScreenMainMenu(showVideoOptions)); - } - - // This is when we need to open screen that needs logged in user. So first we display login screen, make sure user is logged in, - // and then continue do desired screen - // It is for adding login screen the easy way - public static void AddLoginScreen(MyGuiScreenBase openAfterSuccessfulLogin) - { - AddLoginScreen(GetAction(openAfterSuccessfulLogin)); - } - - public static void AddLoginScreen(Action callAfterSuccessfulLogin) - { - if (!MyClientServer.IsMwAccount) - { - if (!HandleSteamLogin(callAfterSuccessfulLogin)) - { - MyGuiManager.AddScreen(new MyGuiScreenLogin(MyConfig.Username, MyConfig.Password, callAfterSuccessfulLogin)); - } - } - else - { - callAfterSuccessfulLogin(); - } - } - - public static void AddLoginScreenDrmFree(MyGuiScreenBase openAfterSuccessfulLogin) - { - AddLoginScreenDrmFree(GetAction(openAfterSuccessfulLogin)); - } - - // For DRM free version, it logins user without connecting to server - public static void AddLoginScreenDrmFree(Action callAfterSuccessfulLogin) - { - if (MyClientServer.LoggedPlayer == null) - { - if (MySteam.IsActive) - { - // Allow cheats and 2.5D to all Steam users - MyClientServer.LoggedPlayer = new MyPlayerLocal(new StringBuilder(MySteam.UserName), MyPlayerLocal.OFFLINE_MODE_USERID, true, true, false, false, false, - true, false, new StringBuilder(MySteam.UserName), new StringBuilder(String.Empty), true) - { - AdditionalInfo = new MyAdditionalUserInfo() - }; - - callAfterSuccessfulLogin(); - } - else - { - AddLoginScreen(callAfterSuccessfulLogin); - } - } - else - { - // If we are already logged in, we can start desired screen - callAfterSuccessfulLogin(); - } - } - - private static Action GetAction(MyGuiScreenBase openAfterSuccessfulLogin) - { - var action = new Action(delegate() { if (openAfterSuccessfulLogin != null) MyGuiManager.AddScreen(openAfterSuccessfulLogin); }); - return action; - } - - private static bool HandleSteamLogin(Action loginSuccessAction) - { - if (MySteam.IsActive) - { - if (m_loginInProgress) - { - Debug.Fail("Login is already in progress!"); - MyMwcLog.WriteLine("Login called twice, second call stack trace:"); - MyMwcLog.WriteLine(Environment.StackTrace); - - // Just do nothing, another login is already in progress - return true; - } - - m_loginInProgress = true; - - MyMasterServerAction steamLogin = new MyMasterServerAction(MyTextsWrapperEnum.LoginInProgressPleaseWait); - steamLogin.SetPublicCredentials(); - if (MyMwcFinalBuildConstants.STEAM_DEMO) - { - steamLogin.BeginAction = (c) => c.BeginSteamDemoLogin(MySteam.UserId, MySteam.SessionTicket, null, c); - } - else - { - steamLogin.BeginAction = (c) => c.BeginSteamLogin(MySteam.UserId, MySteam.SessionTicket, null, c); - } - steamLogin.EndAction = (c, r) => OnSteamLoginEnd(c, r, loginSuccessAction); - steamLogin.Start(); - return true; - } - return false; - } - - private static void OnSteamLoginEnd(MyMasterServiceClient client, IAsyncResult result, Action loginSuccessAction) - { - try - { - string username, token; - if (MyMwcFinalBuildConstants.STEAM_DEMO) - { - username = client.EndSteamDemoLogin(out token, result); - } - else - { - username = client.EndSteamLogin(out token, result); - } - var screen = new MyGuiScreenLoginProgress(username, token, () => - { - MyClientServer.LoggedPlayer.LoggedUsingSteam = true; - MyClientServer.LoggedPlayer.SetDisplayName(new StringBuilder(MySteam.UserName)); - loginSuccessAction(); - }, null); - screen.CloseScreenBeforeCallingHandler = true; - screen.PasswordHash = token; - MyGuiManager.AddScreen(screen); - - m_loginInProgress = false; - } - catch (FaultException e) - { - if (e.Detail.SteamFaultCode == SteamFaultCode.NotRegistered) - { - MyMasterServerAction registerAction = new MyMasterServerAction(MyTextsWrapperEnum.LoginInProgressPleaseWait); - registerAction.SetPublicCredentials(); - if (String.IsNullOrEmpty(MySteam.SerialKey)) - { - m_loginInProgress = false; - OnSteamRegisterError(new InvalidOperationException("Cannot obtain CD key from Steam")); - } - else - { - registerAction.BeginAction = (c) => c.BeginSteamRegister(MySteam.UserId, MySteam.SessionTicket, MySteam.SerialKey, MySteam.UserName, null, c); - registerAction.EndAction = (c, r) => c.EndSteamRegister(r); - registerAction.ActionSuccess += () => OnSteamRegister(loginSuccessAction); - registerAction.ActionFailed += OnSteamRegisterError; - registerAction.ShowErrorMessage = false; - registerAction.Start(); - } - } - else if (e.Detail.SteamFaultCode == SteamFaultCode.NoMW1ProductsOwned) - { - m_loginInProgress = false; - MyGuiManager.AddScreen(new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, MyTextsWrapperEnum.SteamNoProductsText, MyTextsWrapperEnum.SteamNoProductsCaption, MyTextsWrapperEnum.Ok, null)); - } - else if (e.Detail.SteamFaultCode == SteamFaultCode.InvalidTicket) - { - m_loginInProgress = false; - MySteam.RefreshSessionTicket(); - MyGuiManager.AddScreen(new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, MyTextsWrapperEnum.SteamInvalidTicketText, MyTextsWrapperEnum.SteamInvalidTicketCaption, MyTextsWrapperEnum.Ok, null)); - } - else - { - m_loginInProgress = false; - throw; - } - } - finally - { - m_loginInProgress = false; - } - } - - private static void OnSteamRegister(Action loginSuccessAction) - { - m_loginInProgress = false; - HandleSteamLogin(loginSuccessAction); - } - - private static void OnSteamRegisterError(Exception e) - { - m_loginInProgress = false; - string errorMessage = e.Message; - if (e is FaultException) - { - var code = ((FaultException)e).Detail.SteamFaultCode; - errorMessage = "Known code " + (int)code + ", " + code.ToString(); - } - - var text = MyTextsWrapper.GetFormatString(MyTextsWrapperEnum.SteamRegisterErrorText, new object[] { MySteam.UserId, errorMessage, MySteam.SerialKey ?? String.Empty }); - var caption = MyTextsWrapper.Get(MyTextsWrapperEnum.SteamRegisterErrorCaption); - - var thread = new Thread(() => System.Windows.Forms.Clipboard.SetText(text)); - thread.Name = "SteamRegisterError"; - thread.SetApartmentState(ApartmentState.STA); - thread.Start(); - - MyGuiManager.AddScreen(new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, new StringBuilder(text), caption, MyTextsWrapperEnum.Ok, null)); - } - - // This is for adding auto-login screen the easy way - public static void AddAutologinScreen() - { - if (!MyClientServer.IsMwAccount) - { - if (MyMwcFinalBuildConstants.IS_CLOUD_GAMING) - { - // Allow cheats and 2.5D to all Steam users - MyClientServer.LoggedPlayer = new MyPlayerLocal(new StringBuilder("Player"), MyPlayerLocal.OFFLINE_MODE_USERID, true, true, false, false, false, - true, false, new StringBuilder("Player"), new StringBuilder(String.Empty), true) - { - AdditionalInfo = new MyAdditionalUserInfo() - }; - } - else if ((MyConfig.Autologin == true) && (MyConfig.LastLoginWasSuccessful == true)) - { - // We will try autologin only one time - at the beginning of application life. Not later when user gets disconnected during gameplay. - if (m_autologinAttempts == 0) - { - m_autologinAttempts++; - - string username = MyConfig.Username; - string password = MyConfig.Password; - MyGuiManager.AddScreen(new MyGuiScreenLoginProgress(username, password, (MyGuiScreenBase)null, null)); - } - } - } - } - - public MyGuiScreenMainMenu(bool showVideoOptions) - : base(Vector2.Zero, null, null) - { - m_showVideoOptions = showVideoOptions; - - if (MyGuiScreenGamePlay.Static == null) - { - m_closeOnEsc = false; - } - else if (MyGuiScreenGamePlay.Static.IsPausable()) - { - MyMinerGame.SwitchPause(); - } - - //if (MyGuiScreenGamePlay.Static.GetGameType() == MyGuiScreenGamePlayType.MAIN_MENU) m_closeOnEsc = false; - //if (MyGuiScreenGamePlay.Static.IsPausable()) MyMinerGame.SwitchPause(); - - //Because then it is visible under credits, help, etc.. - m_drawEvenWithoutFocus = false; - - MyClientServer.OnLoggedPlayerChanged += new EventHandler(MyClientServer_OnLoggedPlayerChanged); - } - - void MyClientServer_OnLoggedPlayerChanged(object sender, EventArgs e) - { - RecreateControls(false); - } - - // Because only main menu's controla depends on fullscreen pixel coordinates (not normalized), after we change - // screen resolution we need to recreate controls too. Otherwise they will be still on old/bad positions, and - // for example when changing from 1920x1200 to 800x600 they would be out of screen - public override void RecreateControls(bool constructor) - { - Controls.Clear(); - - MyGuiControlButtonTextAlignment menuButtonTextAlignment = MyGuiControlButtonTextAlignment.CENTERED; - - Vector2 leftMenuPositionOrigin = GetMenuLeftBottomPosition() + new Vector2(MyGuiConstants.MAIN_MENU_BUTTON_SIZE.X / 2f, -MyGuiConstants.MAIN_MENU_BUTTON_SIZE.Y / 2f); - - if (MyGuiScreenGamePlay.Static == null || MyGuiScreenGamePlay.Static.IsMainMenuActive()) - { - // Left main menu part - - MyTexture2D buttonTexture = MyGuiManager.GetButtonTexture(); - - //buttons background - m_mainMenuPanelPosition = leftMenuPositionOrigin - 4.1f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA; - - - m_mainMenuPanelSize = new Vector2(574f / 1600f, 901.0f / 1200f); - - var a = MyGuiManager.GetSafeFullscreenRectangle(); - var fullScreenSize = new Vector2(a.Width / (a.Height * (4 / 3f)), 1f); - - MyTextsWrapperEnum? isDemo = null; - if (MyClientServer.LoggedPlayer != null && MyClientServer.LoggedPlayer.IsDemoUser()) isDemo = MyTextsWrapperEnum.NotAvailableInDemoMode; - - - Controls.Add(new MyGuiControlPanel(this, new Vector2(0.5f, 0.5f), fullScreenSize, MyGuiConstants.SCREEN_BACKGROUND_COLOR, - m_MainmenuOverlay, null, null, null, - MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER)); - - //leftMenuPositionOrigin -= new Vector2(-0.0012f, 0.072f) - 0.87f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA - new Vector2(0, 0.035f); - - // if (!MyClientServer.MW25DEnabled) - { - // Story - Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 6f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, - buttonTexture, null, null, - MyTextsWrapperEnum.PlayStory, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, menuButtonTextAlignment, OnPlayStoryClick, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, MyFakes.PLAY_STORY_BUTTON_IMPLEMENTED, true, false)); - } - - bool multiplayerEnabled = true; - // if (MyClientServer.MW25DEnabled && ((MyClientServer.LoggedPlayer != null) && (MyClientServer.LoggedPlayer.GetCanSave() == false))) - // multiplayerEnabled = false; - - // Sandbox - MyGuiControlButton btn2 = new MyGuiControlButton(this, leftMenuPositionOrigin - 5f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, - buttonTexture, null, null, - MyTextsWrapperEnum.PlaySandbox, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, menuButtonTextAlignment, OnMultiplayerClick, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, multiplayerEnabled, true, false); - Controls.Add(btn2); - if (!MyClientServer.HasFullGame) - { - btn2.AccessForbiddenReason = isDemo; - } - btn2.DrawRedTextureWhenDisabled = false; - - // Editor - Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 4f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, - buttonTexture, null, null, - MyTextsWrapperEnum.Editor, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, menuButtonTextAlignment, OnEditorClick, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, MyFakes.EDITOR_BUTTON_IMPLEMENTED, true, false)); - - // Options - Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 3f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, - buttonTexture, null, null, - MyTextsWrapperEnum.Options, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, menuButtonTextAlignment, OnOptionsClick, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true, true, false)); - - // Help - Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 2f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, - buttonTexture, null, null, - MyTextsWrapperEnum.Help, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, menuButtonTextAlignment, OnHelpClick, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true, true, false)); - - // Credits - Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 1f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, - buttonTexture, null, null, - MyTextsWrapperEnum.Credits, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, menuButtonTextAlignment, OnFlyThroughAnimationClick, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, MyFakes.CREDITS_BUTTON_IMPLEMENTED, true, false)); - - // Exit to windows - Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 0f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, - buttonTexture, null, null, - MyTextsWrapperEnum.ExitToWindows, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, menuButtonTextAlignment, OnExitToWindowsClick, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true, true, false)); - - - Vector2 textRightTopPosition = MyGuiManager.GetScreenTextRightTopPosition(); - Vector2 position = textRightTopPosition + 8f * MyGuiConstants.CONTROLS_DELTA + new Vector2(-.1f, .06f); - - // Profile - AddProfileButton(menuButtonTextAlignment, position); - - if (MyFakes.FAKE_SCREEN_ENABLED) - { - Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 7f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, - buttonTexture, null, null, - MyTextsWrapperEnum.FakeScreen, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, menuButtonTextAlignment, OnFakeScreenClick, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true, true, false)); - } - - // Set mouse cursor near first button so it will loke nicer and won't be in the middle of screen - SetMouseCursorPosition(constructor, leftMenuPositionOrigin - 6.7f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA + new Vector2(MyGuiConstants.MAIN_MENU_BUTTON_SIZE.X * 0.3f, 0)); - } - else if (MyGuiScreenGamePlay.Static.GetGameType() != MyGuiScreenGamePlayType.GAME_STORY) - { - //buttons background - m_mainMenuPanelPosition = leftMenuPositionOrigin - 0.5f * 4 * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA; - - - var a = MyGuiManager.GetSafeFullscreenRectangle(); - var fullScreenSize = new Vector2(a.Width / (a.Height * (4 / 3f)), 1f); - Controls.Add(new MyGuiControlPanel(this, new Vector2(0.5f, 0.5f), fullScreenSize, MyGuiConstants.SCREEN_BACKGROUND_COLOR, - m_MainmenuOverlay, null, null, null, - MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER)); - - Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 3 * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, - MyTextsWrapperEnum.ContinueUppercase, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnContinueClick, MyGuiControlButtonTextAlignment.CENTERED, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); - - Vector2 textRightTopPosition = MyGuiManager.GetScreenTextRightTopPosition(); - Vector2 position = textRightTopPosition + 8f * MyGuiConstants.CONTROLS_DELTA + new Vector2(-.1f, .06f); - - Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 2 * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, - MyTextsWrapperEnum.Options, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnOptionsClick, menuButtonTextAlignment, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); - Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 1 * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, - MyTextsWrapperEnum.Help, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnHelpClick, menuButtonTextAlignment, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); - Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 0 * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, - MyTextsWrapperEnum.ExitToMainMenu, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnExitToMainMenuClick, menuButtonTextAlignment, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); - - AddProfileButton(menuButtonTextAlignment, position); - - // Set mouse cursor near first button so it will loke nicer and won't be in the middle of screen - SetMouseCursorPosition(constructor, leftMenuPositionOrigin - 4f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA + new Vector2(MyGuiConstants.MAIN_MENU_BUTTON_SIZE.X * 0.3f, 0)); - } - else if (MyGuiScreenGamePlay.Static.IsGameActive()) - { - bool canEditStory = MyClientServer.LoggedPlayer != null && MyClientServer.LoggedPlayer.GetCanAccessEditorForStory(); - int buttonCount = canEditStory ? 6 : 5; - - - bool isDemo = MyClientServer.LoggedPlayer != null && MyClientServer.LoggedPlayer.IsDemoUser(); - if (isDemo) - { - buttonCount--; - } - - bool canLoad = (!MyMultiplayerGameplay.IsRunning || MyMultiplayerGameplay.Static.IsHost); - - //buttons background - m_mainMenuPanelPosition = leftMenuPositionOrigin - 0.5f * buttonCount * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA; - - var a = MyGuiManager.GetSafeFullscreenRectangle(); - var fullScreenSize = new Vector2(a.Width / (a.Height * (4 / 3f)), 1f); - Controls.Add(new MyGuiControlPanel(this, new Vector2(0.5f, 0.5f), fullScreenSize, MyGuiConstants.SCREEN_BACKGROUND_COLOR, - m_MainmenuOverlay, null, null, null, - MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER)); - - //leftMenuPositionOrigin.Y += 0.04f; - int buttonIndex = buttonCount; - Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - ((float)(--buttonIndex)) * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, - MyTextsWrapperEnum.ContinueUppercase, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnContinueClick, MyGuiControlButtonTextAlignment.CENTERED, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); - if (!isDemo && canLoad) - { - Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - ((float)(--buttonIndex)) * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, - MyTextsWrapperEnum.LoadCheckpoint, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnRestartClick, MyGuiControlButtonTextAlignment.CENTERED, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); - } - - Vector2 textRightTopPosition = MyGuiManager.GetScreenTextRightTopPosition(); - Vector2 position = textRightTopPosition + 8f * MyGuiConstants.CONTROLS_DELTA + new Vector2(-.1f, .06f); - - - Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - ((float)(--buttonIndex)) * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, - MyTextsWrapperEnum.Options, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnOptionsClick, menuButtonTextAlignment, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); - Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - ((float)(--buttonIndex)) * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, - MyTextsWrapperEnum.Help, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnHelpClick, menuButtonTextAlignment, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); - Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - ((float)(--buttonIndex)) * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, - MyTextsWrapperEnum.ExitToMainMenu, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnExitToMainMenuClick, menuButtonTextAlignment, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); - - AddProfileButton(menuButtonTextAlignment, position); - - if (MyMultiplayerGameplay.IsRunning && MyMultiplayerGameplay.Static.IsHost) //TODO: this will be removed later - { - position = textRightTopPosition + 10f * MyGuiConstants.CONTROLS_DELTA + new Vector2(-.025f, .06f); - if (MyMultiplayerGameplay.Static.JoinMode == MyJoinMode.Closed) - { - Controls.Add(new MyGuiControlLabel(this, position, null, MyTextsWrapperEnum.JoinModeStateClosed, MyGuiConstants.LABEL_TEXT_COLOR, MyGuiConstants.LABEL_TEXT_SCALE, MyGuiDrawAlignEnum.HORISONTAL_RIGHT_AND_VERTICAL_CENTER)); - - position = textRightTopPosition + 11f * MyGuiConstants.CONTROLS_DELTA + new Vector2(-.10f, .06f); - m_btnJoinMode = new MyGuiControlButton(this, position, MyGuiConstants.BACK_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, MyTextsWrapper.Get(MyTextsWrapperEnum.EnableCoop), new StringBuilder(""), MyGuiConstants.BACK_BUTTON_TEXT_COLOR, MyGuiConstants.BACK_BUTTON_TEXT_SCALE, cbJoinMode_OnSelect, MyGuiControlButtonTextAlignment.CENTERED, false, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true); - Controls.Add(m_btnJoinMode); - - } - else if (MyMultiplayerGameplay.Static.JoinMode == MyJoinMode.Open) - { - - Controls.Add(new MyGuiControlLabel(this, position, null, MyTextsWrapperEnum.JoinModeStateOpen, MyGuiConstants.LABEL_TEXT_COLOR, MyGuiConstants.LABEL_TEXT_SCALE, MyGuiDrawAlignEnum.HORISONTAL_RIGHT_AND_VERTICAL_CENTER)); - - position = textRightTopPosition + 11f * MyGuiConstants.CONTROLS_DELTA + new Vector2(-.1f, .06f); - m_btnJoinMode = new MyGuiControlButton(this, position, MyGuiConstants.BACK_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, MyTextsWrapper.Get(MyTextsWrapperEnum.DisableCoop), new StringBuilder(""), MyGuiConstants.BACK_BUTTON_TEXT_COLOR, MyGuiConstants.BACK_BUTTON_TEXT_SCALE, cbJoinMode_OnSelect, MyGuiControlButtonTextAlignment.CENTERED, false, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true); - Controls.Add(m_btnJoinMode); - - } - } - - // Set mouse cursor near first button so it will loke nicer and won't be in the middle of screen - SetMouseCursorPosition(constructor, leftMenuPositionOrigin - 4f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA + new Vector2(MyGuiConstants.MAIN_MENU_BUTTON_SIZE.X * 0.3f, 0)); - } - else if (MyGuiScreenGamePlay.Static.IsFlyThroughActive()) - { - //buttons background - m_mainMenuPanelPosition = leftMenuPositionOrigin - 1.5f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA; - - - Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 3 * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, - MyTextsWrapperEnum.ContinueUppercase, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnContinueClick, MyGuiControlButtonTextAlignment.CENTERED, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); - Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 2 * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, - MyTextsWrapperEnum.Options, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnOptionsClick, menuButtonTextAlignment, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); - Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 1 * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, - MyTextsWrapperEnum.Help, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnHelpClick, menuButtonTextAlignment, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); - Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 0 * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, - MyTextsWrapperEnum.ExitToMainMenu, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnExitToMainMenuClick, menuButtonTextAlignment, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); - - // Set mouse cursor near first button so it will loke nicer and won't be in the middle of screen - SetMouseCursorPosition(constructor, leftMenuPositionOrigin - 3f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA + new Vector2(MyGuiConstants.MAIN_MENU_BUTTON_SIZE.X * 0.3f, 0)); - } - else if (MyGuiScreenGamePlay.Static.IsEditorActive()) - { - //buttons background - var a = MyGuiManager.GetSafeFullscreenRectangle(); - var fullScreenSize = new Vector2(a.Width / (a.Height * (4 / 3f)), 1f); - Controls.Add(new MyGuiControlPanel(this, new Vector2(0.5f, 0.5f), fullScreenSize, MyGuiConstants.SCREEN_BACKGROUND_COLOR, - m_MainmenuOverlay, null, null, null, - MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER)); - - //leftMenuPositionOrigin.Y -= 0.0114f; - Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 3 * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, - MyTextsWrapperEnum.ContinueUppercase, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnContinueClick, MyGuiControlButtonTextAlignment.CENTERED, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); - Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 2 * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, - MyTextsWrapperEnum.Options, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnOptionsClick, menuButtonTextAlignment, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); - Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 1 * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, - MyTextsWrapperEnum.Help, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnHelpClick, menuButtonTextAlignment, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); - Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 0 * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, - MyTextsWrapperEnum.ExitToMainMenu, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnExitToMainMenuClick, menuButtonTextAlignment, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); - - - Vector2 textRightTopPosition = MyGuiManager.GetScreenTextRightTopPosition(); - Vector2 position = textRightTopPosition + 8f * MyGuiConstants.CONTROLS_DELTA + new Vector2(-.1f, .06f); - - AddProfileButton(menuButtonTextAlignment, position); - - // Set mouse cursor near first button so it will loke nicer and won't be in the middle of screen - SetMouseCursorPosition(constructor, leftMenuPositionOrigin - 3f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA + new Vector2(MyGuiConstants.MAIN_MENU_BUTTON_SIZE.X * 0.3f, 0)); - } - else - { - throw new MyMwcExceptionApplicationShouldNotGetHere(); - } - } - - void cbJoinMode_OnSelect(MyGuiControlButton sender) - { - //var joinMode = (MyJoinMode)m_btnJoinMode.GetSelectedKey(); - - var joinMode = MyMultiplayerGameplay.Static.JoinMode == MyJoinMode.Closed ? MyJoinMode.Open : MyJoinMode.Closed; - MyMultiplayerGameplay.Static.JoinMode = joinMode; - MyMultiplayerGameplay.Static.UpdateGameInfo(); - Canceling(); - } - - void AddProfileButton(MyGuiControlButtonTextAlignment menuButtonTextAlignment, Vector2 position) - { - //if (MySectorServiceClient.IsConnected && !(MyClientServer.LoggedPlayer != null && MyClientServer.LoggedPlayer.LoggedUsingSteam)) - //position += new Vector2(0, -0.02f); - - MyTextsWrapperEnum text = MyTextsWrapperEnum.Profile; - if (!MySteam.IsActive && !MyClientServer.IsMwAccount) - { - // When demo and in-game, don't show profile/login button - if (!(MyGuiScreenGamePlay.Static == null || MyGuiScreenGamePlay.Static.IsMainMenuActive())) - { - return; - } - - text = MyTextsWrapperEnum.Login; - } - - Controls.Add( - new MyGuiControlButton( - this, - position, - MyGuiConstants.BACK_BUTTON_SIZE, - MyGuiConstants.BUTTON_BACKGROUND_COLOR, - text, - MyGuiConstants.BUTTON_TEXT_COLOR, - MyGuiConstants.BUTTON_TEXT_SCALE, - OnProfileClick, - menuButtonTextAlignment, - true, - MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, - MyFakes.PROFILE_BUTTON_IMPLEMENTED)); - } - - public void SetMouseCursorPosition(bool constructor, Vector2 position) - { - // Set mouse cursor near first button so it will loke nicer and won't be in the middle of screen - if (constructor == true) - { - MyGuiManager.MouseCursorPosition = position; - } - } - - // When dual-head - this will draw the menu to the left side of left monitor. That's OK. - // Only in triple-head it's moved to the center monitor. - public static Vector2 GetMenuLeftBottomPosition() - { - float deltaPixels = 70 * MyGuiManager.GetSafeScreenScale(); - Rectangle fullscreenRectangle = MyGuiManager.GetSafeFullscreenRectangle(); - return MyGuiManager.GetNormalizedCoordinateFromScreenCoordinate_FULLSCREEN(new Vector2(deltaPixels, fullscreenRectangle.Height - deltaPixels)); - } - - public Vector2 GetMenuRightBottomPosition() - { - float deltaPixels = 100 * MyGuiManager.GetSafeScreenScale(); - Rectangle fullscreenRectangle = MyGuiManager.GetSafeFullscreenRectangle(); - return GetMenuLeftBottomPosition() + MyGuiManager.GetNormalizedCoordinateFromScreenCoordinate_FULLSCREEN(new Vector2(fullscreenRectangle.Width - deltaPixels * 2, 0)); - } - - /*public void OnPlayMissionPlaygroundClick(MyGuiControlButton sender) - { - AddLoginScreen(StartPlayground); - } - - public static void StartPlayground() - { - AddLoginScreen(StartPlaygroundAfterLogin); - } - - static void StartPlaygroundAfterLogin() - { - MyGuiManager.CloseAllScreensExcept(MyGuiScreenGamePlay.Static); - MySession.StartSandbox(MyHubShowcaseMission.BaseSector, null); - }*/ - - public void OnPlayStoryClick(MyGuiControlButton sender) - { - AddLoginScreenDrmFree(new MyGuiScreenSelectStory(this)); - } - - public void OnMultiplayerClick(MyGuiControlButton sender) - { - AddLoginScreenDrmFree(new MyGuiScreenMultiplayer(this)); - } - - public void OnEditorClick(MyGuiControlButton sender) - { - if (MyClientServer.LoggedPlayer == null || MyClientServer.LoggedPlayer.GetCanAccessEditorForStory() || MyClientServer.LoggedPlayer.GetCanAccessEditorForMMO()) - { - AddLoginScreen(new MyGuiScreenSelectEditor(this)); - } - else if (!MySteam.IsActive && !MyClientServer.IsMwAccount) // Demo user...generate sector 0, 0, 0. User cant save. - { - MyGuiManager.CloseAllScreensNowExcept(MyGuiScreenGamePlay.Static); - - MySession.Static = new MySandboxSession(); - MySession.Static.Init(); - - var sector = new MyMwcSectorIdentifier(MyMwcSectorTypeEnum.SANDBOX, MyPlayerLocal.OFFLINE_MODE_USERID, new CommonLIB.AppCode.Utils.MyMwcVector3Int(0, 0, 0), String.Empty); - var newGameplayScreen = new MyGuiScreenGamePlay(MyGuiScreenGamePlayType.EDITOR_SANDBOX, null, sector, 0, MyMwcStartSessionRequestTypeEnum.EDITOR_SANDBOX); - var loadScreen = new MyGuiScreenLoading(newGameplayScreen, MyGuiScreenGamePlay.Static); - - var checkpoint = new MyMwcObjectBuilder_Checkpoint(); - checkpoint.CurrentSector = sector; - checkpoint.SectorObjectBuilder = new MyMwcObjectBuilder_Sector(); - checkpoint.SectorObjectBuilder.FromGenerator = true; - checkpoint.SectorObjectBuilder.Position = sector.Position; - checkpoint.SessionObjectBuilder = new MyMwcObjectBuilder_Session(MyGameplayDifficultyEnum.EASY); - - loadScreen.AddEnterSectorResponse(checkpoint, null); - - MyGuiManager.AddScreen(loadScreen); - } - else - { - MyMwcSectorTypeEnum sectorType = MyMwcClientServer.GetSectorTypeFromSessionType(MyMwcStartSessionRequestTypeEnum.EDITOR_SANDBOX); - AddLoginScreen( - new MyGuiScreenLoadSectorIdentifiersProgress(sectorType, false, new MyGuiScreenEnterSectorMap(this, MyMwcStartSessionRequestTypeEnum.EDITOR_SANDBOX, MyTextsWrapperEnum.StartEditorInProgressPleaseWait, MyConfig.LastSandboxSector))); - } - } - - public void OnRestartClick(MyGuiControlButton sender) - { - MyGuiManager.AddScreen(new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, MyTextsWrapperEnum.MessageAreYouSureYouWantLoadCheckpoint, MyTextsWrapperEnum.LoadCheckpoint, MyTextsWrapperEnum.Ok, MyTextsWrapperEnum.No, Restart)); - } - - private void Restart(MyGuiScreenMessageBoxCallbackEnum callbackReturn) - { - if (callbackReturn == MyGuiScreenMessageBoxCallbackEnum.YES) - { - MyGuiManager.CloseAllScreensExcept(MyGuiScreenGamePlay.Static); - MySession.StartLastCheckpoint(); - } - } - - public void OnContinueClick(MyGuiControlButton sender) - { - MyGuiScreenGamePlay.Static.DrawHud = true; - CloseScreen(); - } - - public static void OnExitToMainMenuClick(MyGuiControlButton sender) - { - MyGuiManager.GetMainMenuScreen().m_screenCanHide = false; - var messageBox = new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, MyTextsWrapperEnum.AreYouSureYouWantToExit, MyTextsWrapperEnum.MessageBoxExitQuestion, MyTextsWrapperEnum.Yes, MyTextsWrapperEnum.No, OnExitToMainMenuMessageBoxCallback); - messageBox.SkipTransition = true; - messageBox.InstantClose = false; - MyGuiManager.AddScreen(messageBox); - } - - public static void OnExitToMainMenuMessageBoxCallback(MyGuiScreenMessageBoxCallbackEnum callbackReturn) - { - if (callbackReturn == MyGuiScreenMessageBoxCallbackEnum.YES) - { - // No mission active...ask whether save or not - if (MySession.Static != null && MyMissions.ActiveMission == null && MyGuiScreenGamePlay.Static.IsGameStoryActive() && MyClientServer.LoggedPlayer.GetCanSave()) - { - var messageBox = new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, MyTextsWrapperEnum.SaveCurrentProgress, MyTextsWrapperEnum.SaveCurrentProgressCaption, MyTextsWrapperEnum.Yes, MyTextsWrapperEnum.No, OnSaveGameResponse); - messageBox.SkipTransition = true; - messageBox.InstantClose = false; - MyGuiManager.AddScreen(messageBox); - } - else - { - UnloadAndExitToMenu(); - } - } - else - { - MyGuiManager.GetMainMenuScreen().m_screenCanHide = true; - } - } - - private static void OnSaveGameResponse(MyGuiScreenMessageBoxCallbackEnum result) - { - if (result == MyGuiScreenMessageBoxCallbackEnum.YES) - { - MySession.Static.SaveLastCheckpoint(); - } - UnloadAndExitToMenu(); - } - - public static void UnloadAndExitToMenu() - { - // Leave current sector - if (MyGuiScreenGamePlay.Static.IsGameActive()) - { - //MyClientServer.SendMessageLeaveSectorRequest(MyMwcLeaveSectorReasonEnum.EXIT_TO_MAIN_MENU, null); - //TODO - until I find how to make interactive music to stop in game when exit smoothly, I put this here - //MyGuiScreenGamePlay.Static.StopMusic(); - MyMissions.Unload(); - //MyAudio.StopMusic(); - MyAudio.Stop(); - } - - // If credits screen is open we must close it immediately so it won't make mess on screen during loading - the transition will look better - if (MyGuiScreenGamePlay.Static.GetGameType() == MyGuiScreenGamePlayType.CREDITS) MyGuiManager.CloseScreenNow(typeof(MyGuiScreenGameCredits)); - - // This will quit actual game-play screen and move us to fly-through with main menu on top - MyGuiManager.BackToMainMenu(); - - // We must close this screen immediately so it won't make mess on screen during loading - the transition will look better - MyGuiManager.CloseScreen(typeof(MyGuiScreenMainMenu)); - } - - public void OnFlyThroughAnimationClick(MyGuiControlButton sender) - { - //opens dialog screen with list of trailers, where could be selected animation to play - //MyGuiManager.AddScreen(new MyGuiScreenFlyThrough()); - MyGuiManager.AddScreen(new MyGuiScreenGameCredits()); - } - - public void OnProfileClick(MyGuiControlButton sender) - { - if (!MySteam.IsActive && !MyClientServer.IsMwAccount) - { - AddLoginScreen(new MyGuiScreenProfile()); - } - else - { - AddLoginScreenDrmFree(new MyGuiScreenProfile()); - } - } - - public void OnOptionsClick(MyGuiControlButton sender) - { - MyGuiManager.AddScreen(new MyGuiScreenOptions(m_showVideoOptions)); - } - - public void OnHelpClick(MyGuiControlButton sender) - { - MyGuiManager.AddScreen(new MyGuiScreenHelp()); - } - - public void OnCreditsClick(MyGuiControlButton sender) - { - MyGuiManager.AddScreen(new MyGuiScreenLoading(new MyGuiScreenGamePlay(MyGuiScreenGamePlayType.CREDITS, null, - MyTrailerConstants.DEFAULT_SECTOR_IDENTIFIER, MyTrailerConstants.DEFAULT_SECTOR_VERSION, null), MyGuiScreenGamePlay.Static)); - - // We must close this screen immediately so it won't make fun on monitor during loading - the transition will look better - CloseScreenNow(); - } - - public void OnFakeScreenClick(MyGuiControlButton sender) - { - MyGuiManager.AddScreen(new MyGuiScreenFake()); - } - - public void OnExitToWindowsClick(MyGuiControlButton sender) - { - MyGuiManager.AddScreen(new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, MyTextsWrapperEnum.AreYouSureYouWantToExit, MyTextsWrapperEnum.MessageBoxExitQuestion, MyTextsWrapperEnum.Yes, MyTextsWrapperEnum.No, OnExitToWindowsMessageBoxCallback)); - } - - public void OnExitToWindowsMessageBoxCallback(MyGuiScreenMessageBoxCallbackEnum callbackReturn) - { - if (callbackReturn == MyGuiScreenMessageBoxCallbackEnum.YES) - { - MyGuiManager.AddScreen(new MyGuiScreenLogoutProgress(OnLogoutProgressClosed)); - } - } - - public void OnLogoutProgressClosed() - { - MyMwcLog.WriteLine("Application closed by user"); - // Exit application - MyMinerGame.Static.Invoke(() => { MyMinerGame.Static.Exit(); }, false); - } - - public override void LoadContent() - { - m_timeFromMenuLoadedMS = MyMinerGame.TotalGamePlayTimeInMilliseconds; - base.LoadContent(); - - if (MyGuiScreenGamePlay.Static == null) - { - m_MainmenuOverlay = MyTextureManager.GetTexture("Textures\\GUI\\BackgroundScreen\\MainMenuOverlay", flags: TextureFlags.IgnoreQuality); - } - else if (MyGuiScreenGamePlay.Static.IsMainMenuActive()) - { - } - else if (MyGuiScreenGamePlay.Static.IsGameActive()) - { - m_MainmenuOverlay = MyTextureManager.GetTexture("Textures\\GUI\\BackgroundScreen\\MainMenuOverlay", flags: TextureFlags.IgnoreQuality); - } - else if (MyGuiScreenGamePlay.Static.IsFlyThroughActive()) - { - - } - else if (MyGuiScreenGamePlay.Static.IsEditorActive()) - { - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("load MainMenuOverlay"); - m_MainmenuOverlay = MyTextureManager.GetTexture("Textures\\GUI\\BackgroundScreen\\MainMenuOverlay", flags: TextureFlags.IgnoreQuality); - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); - } - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("load logo and banners"); - m_minerWarsLogoTexture = MyTextureManager.GetTexture("Textures\\GUI\\MinerWarsLogoLarge", loadingMode: Managers.LoadingMode.Immediate, flags: TextureFlags.IgnoreQuality); - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); - - RecreateControls(true); - } - - private void PlayMusic() - { - if (MyAudio.GetMusicState() == MyMusicState.Stopped && - MyAudio.GetMusicCue() == null && - !MyAudio.HasAnyTransition()) - { - MyAudio.ApplyTransition(MyMusicTransitionEnum.MainMenu); - //MyAudio.AddCue2D(MySoundCuesEnum.MenuWelcome); - } - } - - public override void UnloadContent() - { - MyClientServer.OnLoggedPlayerChanged -= MyClientServer_OnLoggedPlayerChanged; - - base.UnloadContent(); - if (m_MainmenuOverlay != null && m_MainmenuOverlay.LoadState == Managers.LoadState.Loaded) - { - MyTextureManager.UnloadTexture(m_MainmenuOverlay); - m_MainmenuOverlay = null; - } - } - - private void OpenInternetBrowser(string url, MyTextsWrapperEnum messageFailed) - { - try - { - try - { - System.Diagnostics.Process.Start(url); - } - // System.ComponentModel.Win32Exception is a known exception that occurs when Firefox is default browser. - // It actually opens the browser but STILL throws this exception so we can just ignore it. If not this exception, - // then attempt to open the URL in IE instead. - catch (System.ComponentModel.Win32Exception) - { - // sometimes throws exception so we have to just ignore - // this is a common .NET bug that no one online really has a great reason for so now we just need to try to open - // the URL using IE if we can. - System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(MyMainMenuConstants.IE_PROCESS, MyMainMenuConstants.BUY_NOW_URL); - System.Diagnostics.Process.Start(startInfo); - startInfo = null; - } - } - catch (Exception) - { - // oper browser failed - StringBuilder sbMessage = new StringBuilder(); - sbMessage.AppendFormat(MyTextsWrapper.GetFormatString(messageFailed), url); - StringBuilder sbTitle = MyTextsWrapper.Get(MyTextsWrapperEnum.TitleFailedToStartInternetBrowser); - MyGuiManager.AddScreen(new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, sbMessage, sbTitle, MyTextsWrapperEnum.Ok, null)); - } - } - - protected override void Canceling() - { - if (MyGuiScreenGamePlay.Static != null && (MyGuiScreenGamePlay.Static.IsGameActive() || MyGuiScreenGamePlay.Static.IsEditorActive())) - { - MyGuiScreenGamePlay.Static.DrawHud = true; - base.Canceling(); - } - } - - public override void HandleInput(MyGuiInput input, bool receivedFocusInThisUpdate) - { - base.HandleInput(input, receivedFocusInThisUpdate); - - if (MyGuiScreenGamePlay.Static == null || MyGuiScreenGamePlay.Static.GetGameType() == MyGuiScreenGamePlayType.MAIN_MENU) - { - if (input.IsNewKeyPress(Keys.Escape)) - { - MyAudio.AddCue2D(MySoundCuesEnum.GuiMouseClick); - OnExitToWindowsClick(null); - } - } - - //if (input.IsNewKeyPress(Keys.Enter)) - //{ - // MyGuiManager.AddScreen(new MyGuiScreenLoading(Vector2.Zero, null, null, null, new MyGuiScreenGamePlay(Vector2.Zero, null, null, null, false), MyGuiScreenGamePlay.Static)); - // CloseScreen(); - //} - - //if (input.IsNewKeyPress(Keys.Escape)) - //{ - // CloseScreen(); - //} - - //if (input.IsNewKeyPress(MinerWarsMath.Input.Keys.P)) - //{ - // MyMinerGame.Static.UnloadContent(); - //} - } - - void DrawLoggedPlayerName() - { - Vector2 textRightTopPosition = MyGuiManager.GetScreenTextRightTopPosition(); - Vector2 position = textRightTopPosition + 8f * MyGuiConstants.CONTROLS_DELTA; - position.X -= 0.03f; - - if (MyClientServer.LoggedPlayer == null) - { - // Draw "You are not logged in." - MyGuiManager.DrawString(MyGuiManager.GetFontMinerWarsBlue(), MyTextsWrapper.Get(MyTextsWrapperEnum.NotLoggedIn), position, MyGuiConstants.LOGED_PLAYER_NAME_TEXT_SCALE, - new Color(MyGuiConstants.LABEL_TEXT_COLOR * m_transitionAlpha), MyGuiDrawAlignEnum.HORISONTAL_RIGHT_AND_VERTICAL_BOTTOM); - } - else - { - // Draw player's name - from right side - MyRectangle2D rect = MyGuiManager.DrawString(MyGuiManager.GetFontMinerWarsBlue(), MyClientServer.LoggedPlayer.GetDisplayName(), position, MyGuiConstants.LOGED_PLAYER_NAME_TEXT_SCALE, - Color.White * m_transitionAlpha, MyGuiDrawAlignEnum.HORISONTAL_RIGHT_AND_VERTICAL_BOTTOM); - - m_playerNameString.Clear(); - - if (!MySectorServiceClient.IsInstanceValid) - { - m_playerNameString.Append("["); - m_playerNameString.AppendStringBuilder(MyTextsWrapper.Get(MyTextsWrapperEnum.Disconnected)); - m_playerNameString.Append("]"); - } - if (MyClientServer.LoggedPlayer != null && MyClientServer.LoggedPlayer.LoggedUsingSteam) - { - m_playerNameString.Append("[Steam]"); - } - - if (m_playerNameString.Length > 0) - { - MyGuiManager.DrawString(MyGuiManager.GetFontMinerWarsBlue(), m_playerNameString, position, MyGuiConstants.LOGED_PLAYER_NAME_TEXT_SCALE, - Color.White * m_transitionAlpha, MyGuiDrawAlignEnum.HORISONTAL_RIGHT_AND_VERTICAL_TOP); - } - - // Draw constant string "Logged Player" - MyGuiManager.DrawString(MyGuiManager.GetFontMinerWarsBlue(), MyTextsWrapper.Get(MyTextsWrapperEnum.LoggedPlayer), rect.LeftTop + new Vector2(-0.0075f, rect.Size.Y - 0.001f), MyGuiConstants.LOGED_PLAYER_NAME_TEXT_SCALE /** 0.8f*/, - new Color(MyGuiConstants.LABEL_TEXT_COLOR * m_transitionAlpha), MyGuiDrawAlignEnum.HORISONTAL_RIGHT_AND_VERTICAL_BOTTOM); - } - } - - public override bool CloseScreen() - { - bool ret = base.CloseScreen(); - - if (ret == true) - { - if (MyGuiScreenGamePlay.Static != null && MyGuiScreenGamePlay.Static.IsPausable() && MyMinerGame.IsPaused()) - MyMinerGame.SwitchPause(); - } - return ret; - } - - public override bool Draw(float backgroundFadeAlpha) - { - if (MyMinerGame.IsPaused() && m_closeOnEsc) - { - DrawBlackSemiTransparentBackground(); - } - if (base.Draw(backgroundFadeAlpha) == false) return false; - - DrawMinerWarsLogo(); - //DrawActorsPhotos(); - DrawLoggedPlayerName(); - DrawAppVersion(); - DrawGlobalVersionText(); - - MyGuiScreenBase screenWithFocus = MyGuiManager.GetScreenWithFocus(); - - return true; - } - - private void DrawBlackSemiTransparentBackground() - { - MyGuiManager.DrawSpriteBatch(MyGuiManager.GetBlankTexture(), new Rectangle(0, 0, MyMinerGame.ScreenSize.X, MyMinerGame.ScreenSize.Y), new Color(0, 0, 0, 120)); - } - - bool IsPurchaseBannerEnabled() - { - MyGuiScreenBase screenWithFocus = MyGuiManager.GetScreenWithFocus(); - return MyClientServer.LoggedPlayer == null || MyClientServer.LoggedPlayer.GetCanSave() == false && MyGuiManager.IsScreenOfTypeOpen(typeof(MyGuiScreenProgressBase)) == false; - - } - - public override bool Update(bool hasFocus) - { - if (base.Update(hasFocus) == false) return false; - - //MyMinerGame.GraphicsDeviceManager.DbgDumpLoadedResources(true); - //MyTextureManager.DbgDumpLoadedTextures(true); - - if (!m_musicPlayed && MyMinerGame.TotalGamePlayTimeInMilliseconds - m_timeFromMenuLoadedMS >= PLAY_MUSIC_AFTER_MENU_LOADED_MS) - { - if (MyGuiScreenGamePlay.Static == null || MyGuiScreenGamePlay.Static.IsMainMenuActive()) - { - PlayMusic(); - } - m_musicPlayed = true; - } - - return true; - } - - public static void StartMission(MyMissionID missionId) - { - MyGuiManager.CloseAllScreensExcept(MyGuiScreenGamePlay.Static); - - var mission = MyMissions.GetMissionByID(missionId); - - Action loadedHandler = () => - { - MyMissions.ActiveMission = null; - MySession.Static.EventLog.Events.Clear(); - - // Make prereq missions completed - foreach (var prereq in mission.RequiredMissions) - { - MySession.Static.EventLog.AddMissionStarted(prereq); - MySession.Static.EventLog.MissionFinished(prereq); - } - }; - - var action = MySession.StartNewGame(MyFakes.DIFFICULTY_FOR_F12_MISSIONS, missionId); - if (action != null) - { - action.ActionSuccess += loadedHandler; - } - else - { - loadedHandler(); - } - } - } +using MinerWarsMath; +using MinerWars.AppCode.Toolkit.Input; +using MinerWars.AppCode.App; +using MinerWars.AppCode.Game.Audio; +using MinerWars.AppCode.Game.GUI.Core; +using MinerWars.AppCode.Game.Localization; +using MinerWars.AppCode.Game.Utils; +using MinerWars.AppCode.Game.World; +using MinerWars.CommonLIB.AppCode.Networking; +using SysUtils.Utils; +using MinerWars.AppCode.Game.Textures; +using KeenSoftwareHouse.Library.Extensions; + +// This main menu server for different scenarios. Right after the game is started it displays default main menu. +// During game or fly-through it displays different buttons and may behave differently. + +namespace MinerWars.AppCode.Game.GUI +{ + using System; + using System.Text; + using Networking.SectorService; + using Missions; + using Managers.Session; + using Sessions; + using CommonLIB.AppCode.Networking.Multiplayer; + using SysUtils; + using MinerWars.AppCode.Networking; + using MinerWars.AppCode.Networking.MasterService; + using System.ServiceModel; + using System.Threading; + using System.Diagnostics; + using System.Runtime.InteropServices; + using MinerWars.CommonLIB.AppCode.ObjectBuilders; + + class MyGuiScreenMainMenu : MyGuiScreenBase + { + static int m_autologinAttempts = 0; + //MyLowFPSDetection m_lowFpsDetection; + //static MyTexture2D m_MainMenuPanelBackground; + private static MyTexture2D m_MainmenuOverlay; + private Vector2 m_mainMenuPanelSize; + private Vector2 m_mainMenuPanelPosition; + private bool m_musicPlayed = false; + private int m_timeFromMenuLoadedMS = 0; + private const int PLAY_MUSIC_AFTER_MENU_LOADED_MS = 1000; + + private static bool m_loginInProgress = false; + + MyGuiControlButton m_btnJoinMode; + + private StringBuilder m_playerNameString = new StringBuilder(40); + private bool m_showVideoOptions = true; + + delegate void OnLoginVerified(); + + public override string GetFriendlyName() + { + return "MyGuiScreenMainMenu"; + } + + public static void SkipAutologin() + { + m_autologinAttempts = 1; + } + + // This is for adding main menu the easy way + public static void AddMainMenu(bool showVideoOptions) + { + MyGuiManager.AddScreen(new MyGuiScreenMainMenu(showVideoOptions)); + } + + // This is when we need to open screen that needs logged in user. So first we display login screen, make sure user is logged in, + // and then continue do desired screen + // It is for adding login screen the easy way + public static void AddLoginScreen(MyGuiScreenBase openAfterSuccessfulLogin) + { + AddLoginScreen(GetAction(openAfterSuccessfulLogin)); + } + + public static void AddLoginScreen(Action callAfterSuccessfulLogin) + { + if (!MyClientServer.IsMwAccount) + { + if (!HandleSteamLogin(callAfterSuccessfulLogin)) + { + MyGuiManager.AddScreen(new MyGuiScreenLogin(MyConfig.Username, MyConfig.Password, callAfterSuccessfulLogin)); + } + } + else + { + callAfterSuccessfulLogin(); + } + } + + public static void AddLoginScreenDrmFree(MyGuiScreenBase openAfterSuccessfulLogin) + { + AddLoginScreenDrmFree(GetAction(openAfterSuccessfulLogin)); + } + + // For DRM free version, it logins user without connecting to server + public static void AddLoginScreenDrmFree(Action callAfterSuccessfulLogin) + { + if (MyClientServer.LoggedPlayer == null) + { + if (MySteam.IsActive) + { + // Allow cheats and 2.5D to all Steam users + MyClientServer.LoggedPlayer = new MyPlayerLocal(new StringBuilder(MySteam.UserName), MyPlayerLocal.OFFLINE_MODE_USERID, true, true, false, false, false, + true, false, new StringBuilder(MySteam.UserName), new StringBuilder(String.Empty), true) + { + AdditionalInfo = new MyAdditionalUserInfo() + }; + + callAfterSuccessfulLogin(); + } + else + { + AddLoginScreen(callAfterSuccessfulLogin); + } + } + else + { + // If we are already logged in, we can start desired screen + callAfterSuccessfulLogin(); + } + } + + private static Action GetAction(MyGuiScreenBase openAfterSuccessfulLogin) + { + var action = new Action(delegate() { if (openAfterSuccessfulLogin != null) MyGuiManager.AddScreen(openAfterSuccessfulLogin); }); + return action; + } + + private static bool HandleSteamLogin(Action loginSuccessAction) + { + if (MySteam.IsActive) + { + if (m_loginInProgress) + { + Debug.Fail("Login is already in progress!"); + MyMwcLog.WriteLine("Login called twice, second call stack trace:"); + MyMwcLog.WriteLine(Environment.StackTrace); + + // Just do nothing, another login is already in progress + return true; + } + + m_loginInProgress = true; + + MyMasterServerAction steamLogin = new MyMasterServerAction(MyTextsWrapperEnum.LoginInProgressPleaseWait); + steamLogin.SetPublicCredentials(); + if (MyMwcFinalBuildConstants.STEAM_DEMO) + { + steamLogin.BeginAction = (c) => c.BeginSteamDemoLogin(MySteam.UserId, MySteam.SessionTicket, null, c); + } + else + { + steamLogin.BeginAction = (c) => c.BeginSteamLogin(MySteam.UserId, MySteam.SessionTicket, null, c); + } + steamLogin.EndAction = (c, r) => OnSteamLoginEnd(c, r, loginSuccessAction); + steamLogin.Start(); + return true; + } + return false; + } + + private static void OnSteamLoginEnd(MyMasterServiceClient client, IAsyncResult result, Action loginSuccessAction) + { + try + { + string username, token; + if (MyMwcFinalBuildConstants.STEAM_DEMO) + { + username = client.EndSteamDemoLogin(out token, result); + } + else + { + username = client.EndSteamLogin(out token, result); + } + var screen = new MyGuiScreenLoginProgress(username, token, () => + { + MyClientServer.LoggedPlayer.LoggedUsingSteam = true; + MyClientServer.LoggedPlayer.SetDisplayName(new StringBuilder(MySteam.UserName)); + loginSuccessAction(); + }, null); + screen.CloseScreenBeforeCallingHandler = true; + screen.PasswordHash = token; + MyGuiManager.AddScreen(screen); + + m_loginInProgress = false; + } + catch (FaultException e) + { + if (e.Detail.SteamFaultCode == SteamFaultCode.NotRegistered) + { + MyMasterServerAction registerAction = new MyMasterServerAction(MyTextsWrapperEnum.LoginInProgressPleaseWait); + registerAction.SetPublicCredentials(); + if (String.IsNullOrEmpty(MySteam.SerialKey)) + { + m_loginInProgress = false; + OnSteamRegisterError(new InvalidOperationException("Cannot obtain CD key from Steam")); + } + else + { + registerAction.BeginAction = (c) => c.BeginSteamRegister(MySteam.UserId, MySteam.SessionTicket, MySteam.SerialKey, MySteam.UserName, null, c); + registerAction.EndAction = (c, r) => c.EndSteamRegister(r); + registerAction.ActionSuccess += () => OnSteamRegister(loginSuccessAction); + registerAction.ActionFailed += OnSteamRegisterError; + registerAction.ShowErrorMessage = false; + registerAction.Start(); + } + } + else if (e.Detail.SteamFaultCode == SteamFaultCode.NoMW1ProductsOwned) + { + m_loginInProgress = false; + MyGuiManager.AddScreen(new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, MyTextsWrapperEnum.SteamNoProductsText, MyTextsWrapperEnum.SteamNoProductsCaption, MyTextsWrapperEnum.Ok, null)); + } + else if (e.Detail.SteamFaultCode == SteamFaultCode.InvalidTicket) + { + m_loginInProgress = false; + MySteam.RefreshSessionTicket(); + MyGuiManager.AddScreen(new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, MyTextsWrapperEnum.SteamInvalidTicketText, MyTextsWrapperEnum.SteamInvalidTicketCaption, MyTextsWrapperEnum.Ok, null)); + } + else + { + m_loginInProgress = false; + throw; + } + } + finally + { + m_loginInProgress = false; + } + } + + private static void OnSteamRegister(Action loginSuccessAction) + { + m_loginInProgress = false; + HandleSteamLogin(loginSuccessAction); + } + + private static void OnSteamRegisterError(Exception e) + { + m_loginInProgress = false; + string errorMessage = e.Message; + if (e is FaultException) + { + var code = ((FaultException)e).Detail.SteamFaultCode; + errorMessage = "Known code " + (int)code + ", " + code.ToString(); + } + + var text = MyTextsWrapper.GetFormatString(MyTextsWrapperEnum.SteamRegisterErrorText, new object[] { MySteam.UserId, errorMessage, MySteam.SerialKey ?? String.Empty }); + var caption = MyTextsWrapper.Get(MyTextsWrapperEnum.SteamRegisterErrorCaption); + + var thread = new Thread(() => System.Windows.Forms.Clipboard.SetText(text)); + thread.Name = "SteamRegisterError"; + thread.SetApartmentState(ApartmentState.STA); + thread.Start(); + + MyGuiManager.AddScreen(new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, new StringBuilder(text), caption, MyTextsWrapperEnum.Ok, null)); + } + + // This is for adding auto-login screen the easy way + public static void AddAutologinScreen() + { + if (!MyClientServer.IsMwAccount) + { + if (MyMwcFinalBuildConstants.IS_CLOUD_GAMING) + { + // Allow cheats and 2.5D to all Steam users + MyClientServer.LoggedPlayer = new MyPlayerLocal(new StringBuilder("Player"), MyPlayerLocal.OFFLINE_MODE_USERID, true, true, false, false, false, + true, false, new StringBuilder("Player"), new StringBuilder(String.Empty), true) + { + AdditionalInfo = new MyAdditionalUserInfo() + }; + } + else if ((MyConfig.Autologin == true) && (MyConfig.LastLoginWasSuccessful == true)) + { + // We will try autologin only one time - at the beginning of application life. Not later when user gets disconnected during gameplay. + if (m_autologinAttempts == 0) + { + m_autologinAttempts++; + + string username = MyConfig.Username; + string password = MyConfig.Password; + MyGuiManager.AddScreen(new MyGuiScreenLoginProgress(username, password, (MyGuiScreenBase)null, null)); + } + } + } + } + + public MyGuiScreenMainMenu(bool showVideoOptions) + : base(Vector2.Zero, null, null) + { + m_showVideoOptions = showVideoOptions; + + if (MyGuiScreenGamePlay.Static == null) + { + m_closeOnEsc = false; + } + else if (MyGuiScreenGamePlay.Static.IsPausable()) + { + MyMinerGame.SwitchPause(); + } + + //if (MyGuiScreenGamePlay.Static.GetGameType() == MyGuiScreenGamePlayType.MAIN_MENU) m_closeOnEsc = false; + //if (MyGuiScreenGamePlay.Static.IsPausable()) MyMinerGame.SwitchPause(); + + //Because then it is visible under credits, help, etc.. + m_drawEvenWithoutFocus = false; + + MyClientServer.OnLoggedPlayerChanged += new EventHandler(MyClientServer_OnLoggedPlayerChanged); + } + + void MyClientServer_OnLoggedPlayerChanged(object sender, EventArgs e) + { + RecreateControls(false); + } + + // Because only main menu's controla depends on fullscreen pixel coordinates (not normalized), after we change + // screen resolution we need to recreate controls too. Otherwise they will be still on old/bad positions, and + // for example when changing from 1920x1200 to 800x600 they would be out of screen + public override void RecreateControls(bool constructor) + { + Controls.Clear(); + + MyGuiControlButtonTextAlignment menuButtonTextAlignment = MyGuiControlButtonTextAlignment.CENTERED; + + Vector2 leftMenuPositionOrigin = GetMenuLeftBottomPosition() + new Vector2(MyGuiConstants.MAIN_MENU_BUTTON_SIZE.X / 2f, -MyGuiConstants.MAIN_MENU_BUTTON_SIZE.Y / 2f); + + if (MyGuiScreenGamePlay.Static == null || MyGuiScreenGamePlay.Static.IsMainMenuActive()) + { + // Left main menu part + + MyTexture2D buttonTexture = MyGuiManager.GetButtonTexture(); + + //buttons background + m_mainMenuPanelPosition = leftMenuPositionOrigin - 4.1f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA; + + + m_mainMenuPanelSize = new Vector2(574f / 1600f, 901.0f / 1200f); + + var a = MyGuiManager.GetSafeFullscreenRectangle(); + var fullScreenSize = new Vector2(a.Width / (a.Height * (4 / 3f)), 1f); + + MyTextsWrapperEnum? isDemo = null; + if (MyClientServer.LoggedPlayer != null && MyClientServer.LoggedPlayer.IsDemoUser()) isDemo = MyTextsWrapperEnum.NotAvailableInDemoMode; + + + Controls.Add(new MyGuiControlPanel(this, new Vector2(0.5f, 0.5f), fullScreenSize, MyGuiConstants.SCREEN_BACKGROUND_COLOR, + m_MainmenuOverlay, null, null, null, + MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER)); + + //leftMenuPositionOrigin -= new Vector2(-0.0012f, 0.072f) - 0.87f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA - new Vector2(0, 0.035f); + + // if (!MyClientServer.MW25DEnabled) + { + // Story + Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 6f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, + buttonTexture, null, null, + MyTextsWrapperEnum.PlayStory, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, menuButtonTextAlignment, OnPlayStoryClick, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, MyFakes.PLAY_STORY_BUTTON_IMPLEMENTED, true, false)); + } + + bool multiplayerEnabled = true; + // if (MyClientServer.MW25DEnabled && ((MyClientServer.LoggedPlayer != null) && (MyClientServer.LoggedPlayer.GetCanSave() == false))) + // multiplayerEnabled = false; + + // Sandbox + MyGuiControlButton btn2 = new MyGuiControlButton(this, leftMenuPositionOrigin - 5f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, + buttonTexture, null, null, + MyTextsWrapperEnum.PlaySandbox, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, menuButtonTextAlignment, OnMultiplayerClick, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, multiplayerEnabled, true, false); + Controls.Add(btn2); + if (!MyClientServer.HasFullGame) + { + btn2.AccessForbiddenReason = isDemo; + } + btn2.DrawRedTextureWhenDisabled = false; + + // Editor + Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 4f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, + buttonTexture, null, null, + MyTextsWrapperEnum.Editor, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, menuButtonTextAlignment, OnEditorClick, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, MyFakes.EDITOR_BUTTON_IMPLEMENTED, true, false)); + + // Options + Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 3f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, + buttonTexture, null, null, + MyTextsWrapperEnum.Options, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, menuButtonTextAlignment, OnOptionsClick, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true, true, false)); + + // Help + Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 2f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, + buttonTexture, null, null, + MyTextsWrapperEnum.Help, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, menuButtonTextAlignment, OnHelpClick, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true, true, false)); + + // Credits + Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 1f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, + buttonTexture, null, null, + MyTextsWrapperEnum.Credits, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, menuButtonTextAlignment, OnFlyThroughAnimationClick, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, MyFakes.CREDITS_BUTTON_IMPLEMENTED, true, false)); + + // Exit to windows + Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 0f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, + buttonTexture, null, null, + MyTextsWrapperEnum.ExitToWindows, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, menuButtonTextAlignment, OnExitToWindowsClick, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true, true, false)); + + + Vector2 textRightTopPosition = MyGuiManager.GetScreenTextRightTopPosition(); + Vector2 position = textRightTopPosition + 8f * MyGuiConstants.CONTROLS_DELTA + new Vector2(-.1f, .06f); + + // Profile + AddProfileButton(menuButtonTextAlignment, position); + + if (MyFakes.FAKE_SCREEN_ENABLED) + { + Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 7f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, + buttonTexture, null, null, + MyTextsWrapperEnum.FakeScreen, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, menuButtonTextAlignment, OnFakeScreenClick, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true, true, false)); + } + + // Set mouse cursor near first button so it will loke nicer and won't be in the middle of screen + SetMouseCursorPosition(constructor, leftMenuPositionOrigin - 6.7f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA + new Vector2(MyGuiConstants.MAIN_MENU_BUTTON_SIZE.X * 0.3f, 0)); + } + else if (MyGuiScreenGamePlay.Static.GetGameType() != MyGuiScreenGamePlayType.GAME_STORY) + { + //buttons background + m_mainMenuPanelPosition = leftMenuPositionOrigin - 0.5f * 4 * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA; + + + var a = MyGuiManager.GetSafeFullscreenRectangle(); + var fullScreenSize = new Vector2(a.Width / (a.Height * (4 / 3f)), 1f); + Controls.Add(new MyGuiControlPanel(this, new Vector2(0.5f, 0.5f), fullScreenSize, MyGuiConstants.SCREEN_BACKGROUND_COLOR, + m_MainmenuOverlay, null, null, null, + MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER)); + + Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 3 * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, + MyTextsWrapperEnum.ContinueUppercase, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnContinueClick, MyGuiControlButtonTextAlignment.CENTERED, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); + + Vector2 textRightTopPosition = MyGuiManager.GetScreenTextRightTopPosition(); + Vector2 position = textRightTopPosition + 8f * MyGuiConstants.CONTROLS_DELTA + new Vector2(-.1f, .06f); + + Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 2 * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, + MyTextsWrapperEnum.Options, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnOptionsClick, menuButtonTextAlignment, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); + Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 1 * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, + MyTextsWrapperEnum.Help, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnHelpClick, menuButtonTextAlignment, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); + Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 0 * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, + MyTextsWrapperEnum.ExitToMainMenu, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnExitToMainMenuClick, menuButtonTextAlignment, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); + + AddProfileButton(menuButtonTextAlignment, position); + + // Set mouse cursor near first button so it will loke nicer and won't be in the middle of screen + SetMouseCursorPosition(constructor, leftMenuPositionOrigin - 4f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA + new Vector2(MyGuiConstants.MAIN_MENU_BUTTON_SIZE.X * 0.3f, 0)); + } + else if (MyGuiScreenGamePlay.Static.IsGameActive()) + { + bool canEditStory = MyClientServer.LoggedPlayer != null && MyClientServer.LoggedPlayer.GetCanAccessEditorForStory(); + int buttonCount = canEditStory ? 6 : 5; + + + bool isDemo = MyClientServer.LoggedPlayer != null && MyClientServer.LoggedPlayer.IsDemoUser(); + if (isDemo) + { + buttonCount--; + } + + bool canLoad = (!MyMultiplayerGameplay.IsRunning || MyMultiplayerGameplay.Static.IsHost); + + //buttons background + m_mainMenuPanelPosition = leftMenuPositionOrigin - 0.5f * buttonCount * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA; + + var a = MyGuiManager.GetSafeFullscreenRectangle(); + var fullScreenSize = new Vector2(a.Width / (a.Height * (4 / 3f)), 1f); + Controls.Add(new MyGuiControlPanel(this, new Vector2(0.5f, 0.5f), fullScreenSize, MyGuiConstants.SCREEN_BACKGROUND_COLOR, + m_MainmenuOverlay, null, null, null, + MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER)); + + //leftMenuPositionOrigin.Y += 0.04f; + int buttonIndex = buttonCount; + Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - ((float)(--buttonIndex)) * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, + MyTextsWrapperEnum.ContinueUppercase, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnContinueClick, MyGuiControlButtonTextAlignment.CENTERED, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); + if (!isDemo && canLoad) + { + Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - ((float)(--buttonIndex)) * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, + MyTextsWrapperEnum.LoadCheckpoint, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnRestartClick, MyGuiControlButtonTextAlignment.CENTERED, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); + } + + Vector2 textRightTopPosition = MyGuiManager.GetScreenTextRightTopPosition(); + Vector2 position = textRightTopPosition + 8f * MyGuiConstants.CONTROLS_DELTA + new Vector2(-.1f, .06f); + + + Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - ((float)(--buttonIndex)) * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, + MyTextsWrapperEnum.Options, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnOptionsClick, menuButtonTextAlignment, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); + Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - ((float)(--buttonIndex)) * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, + MyTextsWrapperEnum.Help, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnHelpClick, menuButtonTextAlignment, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); + Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - ((float)(--buttonIndex)) * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, + MyTextsWrapperEnum.ExitToMainMenu, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnExitToMainMenuClick, menuButtonTextAlignment, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); + + AddProfileButton(menuButtonTextAlignment, position); + + if (MyMultiplayerGameplay.IsRunning && MyMultiplayerGameplay.Static.IsHost) //TODO: this will be removed later + { + position = textRightTopPosition + 10f * MyGuiConstants.CONTROLS_DELTA + new Vector2(-.025f, .06f); + if (MyMultiplayerGameplay.Static.JoinMode == MyJoinMode.Closed) + { + Controls.Add(new MyGuiControlLabel(this, position, null, MyTextsWrapperEnum.JoinModeStateClosed, MyGuiConstants.LABEL_TEXT_COLOR, MyGuiConstants.LABEL_TEXT_SCALE, MyGuiDrawAlignEnum.HORISONTAL_RIGHT_AND_VERTICAL_CENTER)); + + position = textRightTopPosition + 11f * MyGuiConstants.CONTROLS_DELTA + new Vector2(-.10f, .06f); + m_btnJoinMode = new MyGuiControlButton(this, position, MyGuiConstants.BACK_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, MyTextsWrapper.Get(MyTextsWrapperEnum.EnableCoop), new StringBuilder(""), MyGuiConstants.BACK_BUTTON_TEXT_COLOR, MyGuiConstants.BACK_BUTTON_TEXT_SCALE, cbJoinMode_OnSelect, MyGuiControlButtonTextAlignment.CENTERED, false, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true); + Controls.Add(m_btnJoinMode); + + } + else if (MyMultiplayerGameplay.Static.JoinMode == MyJoinMode.Open) + { + + Controls.Add(new MyGuiControlLabel(this, position, null, MyTextsWrapperEnum.JoinModeStateOpen, MyGuiConstants.LABEL_TEXT_COLOR, MyGuiConstants.LABEL_TEXT_SCALE, MyGuiDrawAlignEnum.HORISONTAL_RIGHT_AND_VERTICAL_CENTER)); + + position = textRightTopPosition + 11f * MyGuiConstants.CONTROLS_DELTA + new Vector2(-.1f, .06f); + m_btnJoinMode = new MyGuiControlButton(this, position, MyGuiConstants.BACK_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, MyTextsWrapper.Get(MyTextsWrapperEnum.DisableCoop), new StringBuilder(""), MyGuiConstants.BACK_BUTTON_TEXT_COLOR, MyGuiConstants.BACK_BUTTON_TEXT_SCALE, cbJoinMode_OnSelect, MyGuiControlButtonTextAlignment.CENTERED, false, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true); + Controls.Add(m_btnJoinMode); + + } + } + + // Set mouse cursor near first button so it will loke nicer and won't be in the middle of screen + SetMouseCursorPosition(constructor, leftMenuPositionOrigin - 4f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA + new Vector2(MyGuiConstants.MAIN_MENU_BUTTON_SIZE.X * 0.3f, 0)); + } + else if (MyGuiScreenGamePlay.Static.IsFlyThroughActive()) + { + //buttons background + m_mainMenuPanelPosition = leftMenuPositionOrigin - 1.5f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA; + + + Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 3 * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, + MyTextsWrapperEnum.ContinueUppercase, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnContinueClick, MyGuiControlButtonTextAlignment.CENTERED, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); + Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 2 * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, + MyTextsWrapperEnum.Options, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnOptionsClick, menuButtonTextAlignment, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); + Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 1 * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, + MyTextsWrapperEnum.Help, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnHelpClick, menuButtonTextAlignment, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); + Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 0 * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, + MyTextsWrapperEnum.ExitToMainMenu, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnExitToMainMenuClick, menuButtonTextAlignment, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); + + // Set mouse cursor near first button so it will loke nicer and won't be in the middle of screen + SetMouseCursorPosition(constructor, leftMenuPositionOrigin - 3f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA + new Vector2(MyGuiConstants.MAIN_MENU_BUTTON_SIZE.X * 0.3f, 0)); + } + else if (MyGuiScreenGamePlay.Static.IsEditorActive()) + { + //buttons background + var a = MyGuiManager.GetSafeFullscreenRectangle(); + var fullScreenSize = new Vector2(a.Width / (a.Height * (4 / 3f)), 1f); + Controls.Add(new MyGuiControlPanel(this, new Vector2(0.5f, 0.5f), fullScreenSize, MyGuiConstants.SCREEN_BACKGROUND_COLOR, + m_MainmenuOverlay, null, null, null, + MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER)); + + //leftMenuPositionOrigin.Y -= 0.0114f; + Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 3 * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, + MyTextsWrapperEnum.ContinueUppercase, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnContinueClick, MyGuiControlButtonTextAlignment.CENTERED, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); + Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 2 * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, + MyTextsWrapperEnum.Options, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnOptionsClick, menuButtonTextAlignment, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); + Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 1 * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, + MyTextsWrapperEnum.Help, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnHelpClick, menuButtonTextAlignment, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); + Controls.Add(new MyGuiControlButton(this, leftMenuPositionOrigin - 0 * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA, MyGuiConstants.MAIN_MENU_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, + MyTextsWrapperEnum.ExitToMainMenu, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnExitToMainMenuClick, menuButtonTextAlignment, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); + + + Vector2 textRightTopPosition = MyGuiManager.GetScreenTextRightTopPosition(); + Vector2 position = textRightTopPosition + 8f * MyGuiConstants.CONTROLS_DELTA + new Vector2(-.1f, .06f); + + AddProfileButton(menuButtonTextAlignment, position); + + // Set mouse cursor near first button so it will loke nicer and won't be in the middle of screen + SetMouseCursorPosition(constructor, leftMenuPositionOrigin - 3f * MyGuiConstants.MENU_BUTTONS_POSITION_DELTA + new Vector2(MyGuiConstants.MAIN_MENU_BUTTON_SIZE.X * 0.3f, 0)); + } + else + { + throw new MyMwcExceptionApplicationShouldNotGetHere(); + } + } + + void cbJoinMode_OnSelect(MyGuiControlButton sender) + { + //var joinMode = (MyJoinMode)m_btnJoinMode.GetSelectedKey(); + + var joinMode = MyMultiplayerGameplay.Static.JoinMode == MyJoinMode.Closed ? MyJoinMode.Open : MyJoinMode.Closed; + MyMultiplayerGameplay.Static.JoinMode = joinMode; + MyMultiplayerGameplay.Static.UpdateGameInfo(); + Canceling(); + } + + void AddProfileButton(MyGuiControlButtonTextAlignment menuButtonTextAlignment, Vector2 position) + { + //if (MySectorServiceClient.IsConnected && !(MyClientServer.LoggedPlayer != null && MyClientServer.LoggedPlayer.LoggedUsingSteam)) + //position += new Vector2(0, -0.02f); + + MyTextsWrapperEnum text = MyTextsWrapperEnum.Profile; + if (!MySteam.IsActive && !MyClientServer.IsMwAccount) + { + // When demo and in-game, don't show profile/login button + if (!(MyGuiScreenGamePlay.Static == null || MyGuiScreenGamePlay.Static.IsMainMenuActive())) + { + return; + } + + text = MyTextsWrapperEnum.Login; + } + + Controls.Add( + new MyGuiControlButton( + this, + position, + MyGuiConstants.BACK_BUTTON_SIZE, + MyGuiConstants.BUTTON_BACKGROUND_COLOR, + text, + MyGuiConstants.BUTTON_TEXT_COLOR, + MyGuiConstants.BUTTON_TEXT_SCALE, + OnProfileClick, + menuButtonTextAlignment, + true, + MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, + MyFakes.PROFILE_BUTTON_IMPLEMENTED)); + } + + public void SetMouseCursorPosition(bool constructor, Vector2 position) + { + // Set mouse cursor near first button so it will loke nicer and won't be in the middle of screen + if (constructor == true) + { + MyGuiManager.MouseCursorPosition = position; + } + } + + // When dual-head - this will draw the menu to the left side of left monitor. That's OK. + // Only in triple-head it's moved to the center monitor. + public static Vector2 GetMenuLeftBottomPosition() + { + float deltaPixels = 70 * MyGuiManager.GetSafeScreenScale(); + Rectangle fullscreenRectangle = MyGuiManager.GetSafeFullscreenRectangle(); + return MyGuiManager.GetNormalizedCoordinateFromScreenCoordinate_FULLSCREEN(new Vector2(deltaPixels, fullscreenRectangle.Height - deltaPixels)); + } + + public Vector2 GetMenuRightBottomPosition() + { + float deltaPixels = 100 * MyGuiManager.GetSafeScreenScale(); + Rectangle fullscreenRectangle = MyGuiManager.GetSafeFullscreenRectangle(); + return GetMenuLeftBottomPosition() + MyGuiManager.GetNormalizedCoordinateFromScreenCoordinate_FULLSCREEN(new Vector2(fullscreenRectangle.Width - deltaPixels * 2, 0)); + } + + /*public void OnPlayMissionPlaygroundClick(MyGuiControlButton sender) + { + AddLoginScreen(StartPlayground); + } + + public static void StartPlayground() + { + AddLoginScreen(StartPlaygroundAfterLogin); + } + + static void StartPlaygroundAfterLogin() + { + MyGuiManager.CloseAllScreensExcept(MyGuiScreenGamePlay.Static); + MySession.StartSandbox(MyHubShowcaseMission.BaseSector, null); + }*/ + + public void OnPlayStoryClick(MyGuiControlButton sender) + { + AddLoginScreenDrmFree(new MyGuiScreenSelectStory(this)); + } + + public void OnMultiplayerClick(MyGuiControlButton sender) + { + AddLoginScreenDrmFree(new MyGuiScreenMultiplayer(this)); + } + + public void OnEditorClick(MyGuiControlButton sender) + { + //if (MyClientServer.LoggedPlayer == null || MyClientServer.LoggedPlayer.GetCanAccessEditorForStory() || MyClientServer.LoggedPlayer.GetCanAccessEditorForMMO()) + //{ + // AddLoginScreen(new MyGuiScreenSelectEditor(this)); + //} + //else if (!MySteam.IsActive && !MyClientServer.IsMwAccount) // Demo user...generate sector 0, 0, 0. User cant save. + //{ + MyGuiManager.CloseAllScreensNowExcept(MyGuiScreenGamePlay.Static); + + MySession.Static = new MySandboxSession(); + MySession.Static.Init(); + + var sector = new MyMwcSectorIdentifier(MyMwcSectorTypeEnum.SANDBOX, MyPlayerLocal.OFFLINE_MODE_USERID, new CommonLIB.AppCode.Utils.MyMwcVector3Int(0, 0, 0), String.Empty); + var newGameplayScreen = new MyGuiScreenGamePlay(MyGuiScreenGamePlayType.EDITOR_SANDBOX, null, sector, 0, MyMwcStartSessionRequestTypeEnum.EDITOR_SANDBOX); + var loadScreen = new MyGuiScreenLoading(newGameplayScreen, MyGuiScreenGamePlay.Static); + + var checkpoint = new MyMwcObjectBuilder_Checkpoint(); + checkpoint.CurrentSector = sector; + checkpoint.SectorObjectBuilder = new MyMwcObjectBuilder_Sector(); + checkpoint.SectorObjectBuilder.FromGenerator = true; + checkpoint.SectorObjectBuilder.Position = sector.Position; + checkpoint.SessionObjectBuilder = new MyMwcObjectBuilder_Session(MyGameplayDifficultyEnum.EASY); + + loadScreen.AddEnterSectorResponse(checkpoint, null); + + MyGuiManager.AddScreen(loadScreen); + //} + //else + //{ + // MyMwcSectorTypeEnum sectorType = MyMwcClientServer.GetSectorTypeFromSessionType(MyMwcStartSessionRequestTypeEnum.EDITOR_SANDBOX); + // AddLoginScreen( + // new MyGuiScreenLoadSectorIdentifiersProgress(sectorType, false, new MyGuiScreenEnterSectorMap(this, MyMwcStartSessionRequestTypeEnum.EDITOR_SANDBOX, MyTextsWrapperEnum.StartEditorInProgressPleaseWait, MyConfig.LastSandboxSector))); + //} + } + + public void OnRestartClick(MyGuiControlButton sender) + { + MyGuiManager.AddScreen(new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, MyTextsWrapperEnum.MessageAreYouSureYouWantLoadCheckpoint, MyTextsWrapperEnum.LoadCheckpoint, MyTextsWrapperEnum.Ok, MyTextsWrapperEnum.No, Restart)); + } + + private void Restart(MyGuiScreenMessageBoxCallbackEnum callbackReturn) + { + if (callbackReturn == MyGuiScreenMessageBoxCallbackEnum.YES) + { + MyGuiManager.CloseAllScreensExcept(MyGuiScreenGamePlay.Static); + MySession.StartLastCheckpoint(); + } + } + + public void OnContinueClick(MyGuiControlButton sender) + { + MyGuiScreenGamePlay.Static.DrawHud = true; + CloseScreen(); + } + + public static void OnExitToMainMenuClick(MyGuiControlButton sender) + { + MyGuiManager.GetMainMenuScreen().m_screenCanHide = false; + var messageBox = new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, MyTextsWrapperEnum.AreYouSureYouWantToExit, MyTextsWrapperEnum.MessageBoxExitQuestion, MyTextsWrapperEnum.Yes, MyTextsWrapperEnum.No, OnExitToMainMenuMessageBoxCallback); + messageBox.SkipTransition = true; + messageBox.InstantClose = false; + MyGuiManager.AddScreen(messageBox); + } + + public static void OnExitToMainMenuMessageBoxCallback(MyGuiScreenMessageBoxCallbackEnum callbackReturn) + { + if (callbackReturn == MyGuiScreenMessageBoxCallbackEnum.YES) + { + // No mission active...ask whether save or not + if (MySession.Static != null && MyMissions.ActiveMission == null && MyGuiScreenGamePlay.Static.IsGameStoryActive() && MyClientServer.LoggedPlayer.GetCanSave()) + { + var messageBox = new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, MyTextsWrapperEnum.SaveCurrentProgress, MyTextsWrapperEnum.SaveCurrentProgressCaption, MyTextsWrapperEnum.Yes, MyTextsWrapperEnum.No, OnSaveGameResponse); + messageBox.SkipTransition = true; + messageBox.InstantClose = false; + MyGuiManager.AddScreen(messageBox); + } + else + { + UnloadAndExitToMenu(); + } + } + else + { + MyGuiManager.GetMainMenuScreen().m_screenCanHide = true; + } + } + + private static void OnSaveGameResponse(MyGuiScreenMessageBoxCallbackEnum result) + { + if (result == MyGuiScreenMessageBoxCallbackEnum.YES) + { + MySession.Static.SaveLastCheckpoint(); + } + UnloadAndExitToMenu(); + } + + public static void UnloadAndExitToMenu() + { + // Leave current sector + if (MyGuiScreenGamePlay.Static.IsGameActive()) + { + //MyClientServer.SendMessageLeaveSectorRequest(MyMwcLeaveSectorReasonEnum.EXIT_TO_MAIN_MENU, null); + //TODO - until I find how to make interactive music to stop in game when exit smoothly, I put this here + //MyGuiScreenGamePlay.Static.StopMusic(); + MyMissions.Unload(); + //MyAudio.StopMusic(); + MyAudio.Stop(); + } + + // If credits screen is open we must close it immediately so it won't make mess on screen during loading - the transition will look better + if (MyGuiScreenGamePlay.Static.GetGameType() == MyGuiScreenGamePlayType.CREDITS) MyGuiManager.CloseScreenNow(typeof(MyGuiScreenGameCredits)); + + // This will quit actual game-play screen and move us to fly-through with main menu on top + MyGuiManager.BackToMainMenu(); + + // We must close this screen immediately so it won't make mess on screen during loading - the transition will look better + MyGuiManager.CloseScreen(typeof(MyGuiScreenMainMenu)); + } + + public void OnFlyThroughAnimationClick(MyGuiControlButton sender) + { + //opens dialog screen with list of trailers, where could be selected animation to play + //MyGuiManager.AddScreen(new MyGuiScreenFlyThrough()); + MyGuiManager.AddScreen(new MyGuiScreenGameCredits()); + } + + public void OnProfileClick(MyGuiControlButton sender) + { + if (!MySteam.IsActive && !MyClientServer.IsMwAccount) + { + AddLoginScreen(new MyGuiScreenProfile()); + } + else + { + AddLoginScreenDrmFree(new MyGuiScreenProfile()); + } + } + + public void OnOptionsClick(MyGuiControlButton sender) + { + MyGuiManager.AddScreen(new MyGuiScreenOptions(m_showVideoOptions)); + } + + public void OnHelpClick(MyGuiControlButton sender) + { + MyGuiManager.AddScreen(new MyGuiScreenHelp()); + } + + public void OnCreditsClick(MyGuiControlButton sender) + { + MyGuiManager.AddScreen(new MyGuiScreenLoading(new MyGuiScreenGamePlay(MyGuiScreenGamePlayType.CREDITS, null, + MyTrailerConstants.DEFAULT_SECTOR_IDENTIFIER, MyTrailerConstants.DEFAULT_SECTOR_VERSION, null), MyGuiScreenGamePlay.Static)); + + // We must close this screen immediately so it won't make fun on monitor during loading - the transition will look better + CloseScreenNow(); + } + + public void OnFakeScreenClick(MyGuiControlButton sender) + { + MyGuiManager.AddScreen(new MyGuiScreenFake()); + } + + public void OnExitToWindowsClick(MyGuiControlButton sender) + { + MyGuiManager.AddScreen(new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, MyTextsWrapperEnum.AreYouSureYouWantToExit, MyTextsWrapperEnum.MessageBoxExitQuestion, MyTextsWrapperEnum.Yes, MyTextsWrapperEnum.No, OnExitToWindowsMessageBoxCallback)); + } + + public void OnExitToWindowsMessageBoxCallback(MyGuiScreenMessageBoxCallbackEnum callbackReturn) + { + if (callbackReturn == MyGuiScreenMessageBoxCallbackEnum.YES) + { + MyGuiManager.AddScreen(new MyGuiScreenLogoutProgress(OnLogoutProgressClosed)); + } + } + + public void OnLogoutProgressClosed() + { + MyMwcLog.WriteLine("Application closed by user"); + // Exit application + MyMinerGame.Static.Invoke(() => { MyMinerGame.Static.Exit(); }, false); + } + + public override void LoadContent() + { + m_timeFromMenuLoadedMS = MyMinerGame.TotalGamePlayTimeInMilliseconds; + base.LoadContent(); + + if (MyGuiScreenGamePlay.Static == null) + { + m_MainmenuOverlay = MyTextureManager.GetTexture("Textures\\GUI\\BackgroundScreen\\MainMenuOverlay", flags: TextureFlags.IgnoreQuality); + } + else if (MyGuiScreenGamePlay.Static.IsMainMenuActive()) + { + } + else if (MyGuiScreenGamePlay.Static.IsGameActive()) + { + m_MainmenuOverlay = MyTextureManager.GetTexture("Textures\\GUI\\BackgroundScreen\\MainMenuOverlay", flags: TextureFlags.IgnoreQuality); + } + else if (MyGuiScreenGamePlay.Static.IsFlyThroughActive()) + { + + } + else if (MyGuiScreenGamePlay.Static.IsEditorActive()) + { + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("load MainMenuOverlay"); + m_MainmenuOverlay = MyTextureManager.GetTexture("Textures\\GUI\\BackgroundScreen\\MainMenuOverlay", flags: TextureFlags.IgnoreQuality); + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); + } + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("load logo and banners"); + m_minerWarsLogoTexture = MyTextureManager.GetTexture("Textures\\GUI\\MinerWarsLogoLarge", loadingMode: Managers.LoadingMode.Immediate, flags: TextureFlags.IgnoreQuality); + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); + + RecreateControls(true); + } + + private void PlayMusic() + { + if (MyAudio.GetMusicState() == MyMusicState.Stopped && + MyAudio.GetMusicCue() == null && + !MyAudio.HasAnyTransition()) + { + MyAudio.ApplyTransition(MyMusicTransitionEnum.MainMenu); + //MyAudio.AddCue2D(MySoundCuesEnum.MenuWelcome); + } + } + + public override void UnloadContent() + { + MyClientServer.OnLoggedPlayerChanged -= MyClientServer_OnLoggedPlayerChanged; + + base.UnloadContent(); + if (m_MainmenuOverlay != null && m_MainmenuOverlay.LoadState == Managers.LoadState.Loaded) + { + MyTextureManager.UnloadTexture(m_MainmenuOverlay); + m_MainmenuOverlay = null; + } + } + + private void OpenInternetBrowser(string url, MyTextsWrapperEnum messageFailed) + { + try + { + try + { + System.Diagnostics.Process.Start(url); + } + // System.ComponentModel.Win32Exception is a known exception that occurs when Firefox is default browser. + // It actually opens the browser but STILL throws this exception so we can just ignore it. If not this exception, + // then attempt to open the URL in IE instead. + catch (System.ComponentModel.Win32Exception) + { + // sometimes throws exception so we have to just ignore + // this is a common .NET bug that no one online really has a great reason for so now we just need to try to open + // the URL using IE if we can. + System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(MyMainMenuConstants.IE_PROCESS, MyMainMenuConstants.BUY_NOW_URL); + System.Diagnostics.Process.Start(startInfo); + startInfo = null; + } + } + catch (Exception) + { + // oper browser failed + StringBuilder sbMessage = new StringBuilder(); + sbMessage.AppendFormat(MyTextsWrapper.GetFormatString(messageFailed), url); + StringBuilder sbTitle = MyTextsWrapper.Get(MyTextsWrapperEnum.TitleFailedToStartInternetBrowser); + MyGuiManager.AddScreen(new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, sbMessage, sbTitle, MyTextsWrapperEnum.Ok, null)); + } + } + + protected override void Canceling() + { + if (MyGuiScreenGamePlay.Static != null && (MyGuiScreenGamePlay.Static.IsGameActive() || MyGuiScreenGamePlay.Static.IsEditorActive())) + { + MyGuiScreenGamePlay.Static.DrawHud = true; + base.Canceling(); + } + } + + public override void HandleInput(MyGuiInput input, bool receivedFocusInThisUpdate) + { + base.HandleInput(input, receivedFocusInThisUpdate); + + if (MyGuiScreenGamePlay.Static == null || MyGuiScreenGamePlay.Static.GetGameType() == MyGuiScreenGamePlayType.MAIN_MENU) + { + if (input.IsNewKeyPress(Keys.Escape)) + { + MyAudio.AddCue2D(MySoundCuesEnum.GuiMouseClick); + OnExitToWindowsClick(null); + } + } + + //if (input.IsNewKeyPress(Keys.Enter)) + //{ + // MyGuiManager.AddScreen(new MyGuiScreenLoading(Vector2.Zero, null, null, null, new MyGuiScreenGamePlay(Vector2.Zero, null, null, null, false), MyGuiScreenGamePlay.Static)); + // CloseScreen(); + //} + + //if (input.IsNewKeyPress(Keys.Escape)) + //{ + // CloseScreen(); + //} + + //if (input.IsNewKeyPress(MinerWarsMath.Input.Keys.P)) + //{ + // MyMinerGame.Static.UnloadContent(); + //} + } + + void DrawLoggedPlayerName() + { + Vector2 textRightTopPosition = MyGuiManager.GetScreenTextRightTopPosition(); + Vector2 position = textRightTopPosition + 8f * MyGuiConstants.CONTROLS_DELTA; + position.X -= 0.03f; + + if (MyClientServer.LoggedPlayer == null) + { + // Draw "You are not logged in." + MyGuiManager.DrawString(MyGuiManager.GetFontMinerWarsBlue(), MyTextsWrapper.Get(MyTextsWrapperEnum.NotLoggedIn), position, MyGuiConstants.LOGED_PLAYER_NAME_TEXT_SCALE, + new Color(MyGuiConstants.LABEL_TEXT_COLOR * m_transitionAlpha), MyGuiDrawAlignEnum.HORISONTAL_RIGHT_AND_VERTICAL_BOTTOM); + } + else + { + // Draw player's name - from right side + MyRectangle2D rect = MyGuiManager.DrawString(MyGuiManager.GetFontMinerWarsBlue(), MyClientServer.LoggedPlayer.GetDisplayName(), position, MyGuiConstants.LOGED_PLAYER_NAME_TEXT_SCALE, + Color.White * m_transitionAlpha, MyGuiDrawAlignEnum.HORISONTAL_RIGHT_AND_VERTICAL_BOTTOM); + + m_playerNameString.Clear(); + + if (!MySectorServiceClient.IsInstanceValid) + { + m_playerNameString.Append("["); + m_playerNameString.AppendStringBuilder(MyTextsWrapper.Get(MyTextsWrapperEnum.Disconnected)); + m_playerNameString.Append("]"); + } + if (MyClientServer.LoggedPlayer != null && MyClientServer.LoggedPlayer.LoggedUsingSteam) + { + m_playerNameString.Append("[Steam]"); + } + + if (m_playerNameString.Length > 0) + { + MyGuiManager.DrawString(MyGuiManager.GetFontMinerWarsBlue(), m_playerNameString, position, MyGuiConstants.LOGED_PLAYER_NAME_TEXT_SCALE, + Color.White * m_transitionAlpha, MyGuiDrawAlignEnum.HORISONTAL_RIGHT_AND_VERTICAL_TOP); + } + + // Draw constant string "Logged Player" + MyGuiManager.DrawString(MyGuiManager.GetFontMinerWarsBlue(), MyTextsWrapper.Get(MyTextsWrapperEnum.LoggedPlayer), rect.LeftTop + new Vector2(-0.0075f, rect.Size.Y - 0.001f), MyGuiConstants.LOGED_PLAYER_NAME_TEXT_SCALE /** 0.8f*/, + new Color(MyGuiConstants.LABEL_TEXT_COLOR * m_transitionAlpha), MyGuiDrawAlignEnum.HORISONTAL_RIGHT_AND_VERTICAL_BOTTOM); + } + } + + public override bool CloseScreen() + { + bool ret = base.CloseScreen(); + + if (ret == true) + { + if (MyGuiScreenGamePlay.Static != null && MyGuiScreenGamePlay.Static.IsPausable() && MyMinerGame.IsPaused()) + MyMinerGame.SwitchPause(); + } + return ret; + } + + public override bool Draw(float backgroundFadeAlpha) + { + if (MyMinerGame.IsPaused() && m_closeOnEsc) + { + DrawBlackSemiTransparentBackground(); + } + if (base.Draw(backgroundFadeAlpha) == false) return false; + + DrawMinerWarsLogo(); + //DrawActorsPhotos(); + DrawLoggedPlayerName(); + DrawAppVersion(); + DrawGlobalVersionText(); + + MyGuiScreenBase screenWithFocus = MyGuiManager.GetScreenWithFocus(); + + return true; + } + + private void DrawBlackSemiTransparentBackground() + { + MyGuiManager.DrawSpriteBatch(MyGuiManager.GetBlankTexture(), new Rectangle(0, 0, MyMinerGame.ScreenSize.X, MyMinerGame.ScreenSize.Y), new Color(0, 0, 0, 120)); + } + + bool IsPurchaseBannerEnabled() + { + MyGuiScreenBase screenWithFocus = MyGuiManager.GetScreenWithFocus(); + return MyClientServer.LoggedPlayer == null || MyClientServer.LoggedPlayer.GetCanSave() == false && MyGuiManager.IsScreenOfTypeOpen(typeof(MyGuiScreenProgressBase)) == false; + + } + + public override bool Update(bool hasFocus) + { + if (base.Update(hasFocus) == false) return false; + + //MyMinerGame.GraphicsDeviceManager.DbgDumpLoadedResources(true); + //MyTextureManager.DbgDumpLoadedTextures(true); + + if (!m_musicPlayed && MyMinerGame.TotalGamePlayTimeInMilliseconds - m_timeFromMenuLoadedMS >= PLAY_MUSIC_AFTER_MENU_LOADED_MS) + { + if (MyGuiScreenGamePlay.Static == null || MyGuiScreenGamePlay.Static.IsMainMenuActive()) + { + PlayMusic(); + } + m_musicPlayed = true; + } + + return true; + } + + public static void StartMission(MyMissionID missionId) + { + MyGuiManager.CloseAllScreensExcept(MyGuiScreenGamePlay.Static); + + var mission = MyMissions.GetMissionByID(missionId); + + Action loadedHandler = () => + { + MyMissions.ActiveMission = null; + MySession.Static.EventLog.Events.Clear(); + + // Make prereq missions completed + foreach (var prereq in mission.RequiredMissions) + { + MySession.Static.EventLog.AddMissionStarted(prereq); + MySession.Static.EventLog.MissionFinished(prereq); + } + }; + + var action = MySession.StartNewGame(MyFakes.DIFFICULTY_FOR_F12_MISSIONS, missionId); + if (action != null) + { + action.ActionSuccess += loadedHandler; + } + else + { + loadedHandler(); + } + } + } } \ No newline at end of file diff --git a/Sources/MinerWars.GameLib/AppCode/Game/GUI/MyGuiScreenOptionsVideo.cs b/Sources/MinerWars.GameLib/AppCode/Game/GUI/MyGuiScreenOptionsVideo.cs index 2a9ce07..6244d55 100644 --- a/Sources/MinerWars.GameLib/AppCode/Game/GUI/MyGuiScreenOptionsVideo.cs +++ b/Sources/MinerWars.GameLib/AppCode/Game/GUI/MyGuiScreenOptionsVideo.cs @@ -1,465 +1,465 @@ -using System.Text; -using MinerWarsMath; -using MinerWarsMath.Graphics; -using MinerWars.AppCode.Game.GUI.Core; -using MinerWars.AppCode.Game.Localization; -using MinerWars.AppCode.Game.Utils; -using MinerWars.AppCode.Game.VideoMode; -using MinerWars.AppCode.Game.Voxels; -using MinerWars.AppCode.Game.Render; -using SysUtils.Utils; -using MinerWars.AppCode.Game.Textures; -// Controls dependency: -// - anti-aliasing combobox depends on full-screen checkbox - -namespace MinerWars.AppCode.Game.GUI -{ - using System; - using App; - using SharpDX.Toolkit.Graphics; - - class MyGuiScreenOptionsVideo : MyGuiScreenBase - { - internal class MyGuiScreenOptionsVideoSettings - { - public int VideoAdapter; - public bool FullScreen; - public bool VerticalSync; - public bool HardwareCursor; - public MyRenderQualityEnum RenderQuality; - public MyVideoModeEx VideoMode; - public float FieldOfView; - } - - readonly MyGuiControlCombobox m_videoAdapterCombobox; - readonly MyGuiControlCombobox m_videoModeCombobox; - readonly MyGuiControlCheckbox m_verticalSyncCheckbox; - readonly MyGuiControlCheckbox m_fullscreenCheckbox; - readonly MyGuiControlCheckbox m_hardwareCursorCheckbox; - readonly MyGuiControlCombobox m_renderQualityCombobox; - readonly MyGuiControlLabel m_recommendAspectRatioLabel; - readonly MyGuiControlSlider m_fieldOfViewSlider; - readonly MyGuiControlLabel m_fieldOfViewLabel; - readonly MyGuiControlLabel m_fieldOfViewDefaultLabel; - - readonly MyGuiScreenOptionsVideoSettings m_settingsOld = new MyGuiScreenOptionsVideoSettings(); - readonly MyGuiScreenOptionsVideoSettings m_settingsNew = new MyGuiScreenOptionsVideoSettings(); - - bool m_waitingForConfirmation = false; - - bool m_doRevert = false; - - - public MyGuiScreenOptionsVideo() - : base(new Vector2(0.5f, 0.5f), MyGuiConstants.SCREEN_BACKGROUND_COLOR, null) - { - MyMwcLog.WriteLine("MyGuiScreenOptionsVideo.ctor START"); - - m_enableBackgroundFade = true; - m_size = new Vector2(0.59f, 0.68544f); - m_size *= 1.1f; - - m_backgroundTexture = MyTextureManager.GetTexture("Textures\\GUI\\BackgroundScreen\\VideoBackground", flags: TextureFlags.IgnoreQuality); - - AddCaption(MyTextsWrapperEnum.VideoOptions, new Vector2(0, 0.005f)); - //Controls.Add(new MyGuiControlLabel(this, -m_size.Value / 2.0f + MyGuiConstants.SCREEN_CAPTION_DELTA_Y, null, MyTextsWrapperEnum.VideoOptions, MyGuiConstants.SCREEN_CAPTION_TEXT_COLOR, MyGuiConstants.SCREEN_CAPTION_TEXT_SCALE)); - - Vector2 controlsOriginLeft = new Vector2(-m_size.Value.X / 2.0f + 0.05f, -m_size.Value.Y / 2.0f + 0.145f) + new Vector2(0.02f,0f); - Vector2 controlsOriginRight = new Vector2(-m_size.Value.X / 2.0f + 0.185f, -m_size.Value.Y / 2.0f + 0.145f) + new Vector2(0.043f,0f); - controlsOriginRight.X += 0.04f; - - - int controlIndex = 0; - - // Adapter - - Controls.Add(new MyGuiControlLabel(this, controlsOriginLeft + controlIndex * MyGuiConstants.CONTROLS_DELTA, null, MyTextsWrapperEnum.VideoAdapter, MyGuiConstants.LABEL_TEXT_COLOR, - MyGuiConstants.LABEL_TEXT_SCALE_OPTIONS, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_CENTER, MyGuiManager.GetFontMinerWarsBlue())); - - m_videoAdapterCombobox = new MyGuiControlCombobox(this, controlsOriginRight + controlIndex++ * MyGuiConstants.CONTROLS_DELTA + new Vector2(MyGuiConstants.COMBOBOX_MEDIUM_SIZE.X / 2.0f, 0), - MyGuiControlPreDefinedSize.MEDIUM, MyGuiConstants.COMBOBOX_BACKGROUND_COLOR, MyGuiConstants.COMBOBOX_TEXT_SCALE); - m_videoAdapterCombobox.OnSelect += OnVideoAdapterSelected; - AddAdaptersToComboBox(); - Controls.Add(m_videoAdapterCombobox); - - // Video Mode - Controls.Add(new MyGuiControlLabel(this, controlsOriginLeft + controlIndex * MyGuiConstants.CONTROLS_DELTA, null, MyTextsWrapperEnum.VideoMode, MyGuiConstants.LABEL_TEXT_COLOR, - MyGuiConstants.LABEL_TEXT_SCALE_OPTIONS, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_CENTER, MyGuiManager.GetFontMinerWarsBlue())); - - m_videoModeCombobox = new MyGuiControlCombobox(this, controlsOriginRight + controlIndex++ * MyGuiConstants.CONTROLS_DELTA + new Vector2(MyGuiConstants.COMBOBOX_MEDIUM_SIZE.X / 2.0f, 0), - MyGuiControlPreDefinedSize.MEDIUM, MyGuiConstants.COMBOBOX_BACKGROUND_COLOR, MyGuiConstants.COMBOBOX_TEXT_SCALE); - // Populating Video Mode with supported DisplayMode reported by XNA framework - m_videoModeCombobox.OnSelect += OnVideoModeSelected; - //Added on UpdateSettings - //AddDisplayModesToComboBox(MyMinerGame.GraphicsDeviceManager.GraphicsAdapter.AdapterOrdinal); - Controls.Add(m_videoModeCombobox); - - // Recommended aspect ratio - m_recommendAspectRatioLabel = new MyGuiControlLabel(this, new Vector2(controlsOriginRight.X + MyGuiConstants.COMBOBOX_TEXT_OFFSET.X, controlsOriginRight.Y + controlIndex++ * MyGuiConstants.CONTROLS_DELTA.Y - 0.015f), null, - new StringBuilder(), MyGuiConstants.LABEL_TEXT_COLOR * 0.9f, MyGuiConstants.LABEL_TEXT_SCALE_OPTIONS * 0.85f, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_CENTER, MyGuiManager.GetFontMinerWarsBlue()); - //Added on UpdateSettings - //UpdateRecommendecAspectRatioLabel(MyMinerGame.GraphicsDeviceManager.GraphicsAdapter.AdapterOrdinal); - Controls.Add(m_recommendAspectRatioLabel); - - // reduce the spacing between "Recommended aspect ratio" and items below it - Vector2 offSet = new Vector2(0, MyGuiConstants.CONTROLS_DELTA.Y / 2); - controlsOriginLeft -= offSet; - controlsOriginRight -= offSet; - - // Fullscreen - Controls.Add(new MyGuiControlLabel(this, controlsOriginLeft + controlIndex * MyGuiConstants.CONTROLS_DELTA, null, MyTextsWrapperEnum.Fullscreen, MyGuiConstants.LABEL_TEXT_COLOR, - MyGuiConstants.LABEL_TEXT_SCALE_OPTIONS, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_CENTER, MyGuiManager.GetFontMinerWarsBlue())); - - m_fullscreenCheckbox = new MyGuiControlCheckbox(this, - controlsOriginRight + controlIndex++ * MyGuiConstants.CONTROLS_DELTA + - new Vector2(MyGuiConstants.CHECKBOX_WITH_GLOW_SIZE.X / 2.0f, 0), MyGuiConstants.CHECKBOX_WITH_GLOW_SIZE, - MyGuiManager.GetCheckboxOffTexture(), MyGuiManager.GetCheckboxOnTexture(), null, - true, MyGuiConstants.CHECKBOX_BACKGROUND_COLOR, true, null); - //m_fullscreenCheckbox.OnCheck = OnFullScreenCheck; - Controls.Add(m_fullscreenCheckbox); - - // Vertical Sync - Controls.Add(new MyGuiControlLabel(this, controlsOriginLeft + controlIndex * MyGuiConstants.CONTROLS_DELTA, null, MyTextsWrapperEnum.VerticalSync, MyGuiConstants.LABEL_TEXT_COLOR, - MyGuiConstants.LABEL_TEXT_SCALE_OPTIONS, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_CENTER, MyGuiManager.GetFontMinerWarsBlue())); - //m_verticalSyncCheckbox = new MyGuiControlCheckbox(this, controlsOriginRight + 3 * MyGuiConstants.CONTROLS_DELTA + new Vector2(MyGuiConstants.CHECKBOX_SIZE.X / 2.0f, 0), true, MyGuiConstants.CHECKBOX_BACKGROUND_COLOR); - - - m_verticalSyncCheckbox = new MyGuiControlCheckbox(this, - controlsOriginRight + controlIndex++ * MyGuiConstants.CONTROLS_DELTA + - new Vector2(MyGuiConstants.CHECKBOX_WITH_GLOW_SIZE.X / 2.0f, 0), MyGuiConstants.CHECKBOX_WITH_GLOW_SIZE, - MyGuiManager.GetCheckboxOffTexture(), MyGuiManager.GetCheckboxOnTexture(), null, - false, MyGuiConstants.CHECKBOX_BACKGROUND_COLOR, true, null); - Controls.Add(m_verticalSyncCheckbox); - - - // Hardware Cursor - Controls.Add(new MyGuiControlLabel(this, controlsOriginLeft + controlIndex * MyGuiConstants.CONTROLS_DELTA, null, MyTextsWrapperEnum.HardwareCursor, MyGuiConstants.LABEL_TEXT_COLOR, - MyGuiConstants.LABEL_TEXT_SCALE_OPTIONS, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_CENTER, MyGuiManager.GetFontMinerWarsBlue())); - - m_hardwareCursorCheckbox = new MyGuiControlCheckbox(this, - controlsOriginRight + controlIndex++ * MyGuiConstants.CONTROLS_DELTA + - new Vector2(MyGuiConstants.CHECKBOX_WITH_GLOW_SIZE.X / 2.0f, 0), MyGuiConstants.CHECKBOX_WITH_GLOW_SIZE, - MyGuiManager.GetCheckboxOffTexture(), MyGuiManager.GetCheckboxOnTexture(), null, - false, MyGuiConstants.CHECKBOX_BACKGROUND_COLOR, true, null); - Controls.Add(m_hardwareCursorCheckbox); - - // Render Quality - Controls.Add(new MyGuiControlLabel(this, controlsOriginLeft + controlIndex * MyGuiConstants.CONTROLS_DELTA, null, MyTextsWrapperEnum.RenderQuality, MyGuiConstants.LABEL_TEXT_COLOR, - MyGuiConstants.LABEL_TEXT_SCALE_OPTIONS, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_CENTER, MyGuiManager.GetFontMinerWarsBlue())); - m_renderQualityCombobox = new MyGuiControlCombobox(this, controlsOriginRight + controlIndex++ * MyGuiConstants.CONTROLS_DELTA + new Vector2(MyGuiConstants.COMBOBOX_MEDIUM_SIZE.X / 2.0f, 0), - MyGuiControlPreDefinedSize.MEDIUM, MyGuiConstants.COMBOBOX_BACKGROUND_COLOR, MyGuiConstants.COMBOBOX_TEXT_SCALE); - m_renderQualityCombobox.AddItem((int)MyRenderQualityEnum.LOW, MyTextsWrapperEnum.RenderQualityLow); - m_renderQualityCombobox.AddItem((int)MyRenderQualityEnum.NORMAL, MyTextsWrapperEnum.RenderQualityNormal); - m_renderQualityCombobox.AddItem((int)MyRenderQualityEnum.HIGH, MyTextsWrapperEnum.RenderQualityHigh); - m_renderQualityCombobox.AddItem((int)MyRenderQualityEnum.EXTREME, MyTextsWrapperEnum.RenderQualityExtreme); - Controls.Add(m_renderQualityCombobox); - - // Field of View - Controls.Add(new MyGuiControlLabel(this, controlsOriginLeft + controlIndex * MyGuiConstants.CONTROLS_DELTA, null, MyTextsWrapperEnum.FieldOfView, MyGuiConstants.LABEL_TEXT_COLOR, - MyGuiConstants.LABEL_TEXT_SCALE_OPTIONS, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_CENTER, MyGuiManager.GetFontMinerWarsBlue())); - - const float fovSliderSize = MyGuiConstants.SLIDER_WIDTH * 1.1f; - m_fieldOfViewSlider = new MyGuiControlSlider(this, controlsOriginRight + controlIndex * MyGuiConstants.CONTROLS_DELTA + new Vector2(fovSliderSize / 2.0f, 0), - fovSliderSize, MyConstants.FIELD_OF_VIEW_CONFIG_MIN, MyConstants.FIELD_OF_VIEW_CONFIG_MAX, MyGuiConstants.SLIDER_BACKGROUND_COLOR, - new StringBuilder(), MyGuiConstants.SLIDER_WIDTH_LABEL, 0, MyGuiConstants.LABEL_TEXT_SCALE_OPTIONS * 0.85f); - m_fieldOfViewSlider.OnChange = OnFovChanged; - Controls.Add(m_fieldOfViewSlider); - - m_fieldOfViewLabel = new MyGuiControlLabel(this, controlsOriginRight + controlIndex++ * MyGuiConstants.CONTROLS_DELTA + new Vector2(fovSliderSize * 1.1f, 0), - null, new StringBuilder("{0:F1}"), MyGuiConstants.LABEL_TEXT_COLOR, - MyGuiConstants.LABEL_TEXT_SCALE_OPTIONS, MyGuiDrawAlignEnum.HORISONTAL_RIGHT_AND_VERTICAL_CENTER, MyGuiManager.GetFontMinerWarsBlue()); - Controls.Add(m_fieldOfViewLabel); - - m_fieldOfViewDefaultLabel = new MyGuiControlLabel(this, controlsOriginRight + controlIndex++ * MyGuiConstants.CONTROLS_DELTA + new Vector2(0.009f, 0), - null, MyTextsWrapper.Get(MyTextsWrapperEnum.DefaultFOV), MyGuiConstants.LABEL_TEXT_COLOR, - MyGuiConstants.LABEL_TEXT_SCALE_OPTIONS, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_BOTTOM, MyGuiManager.GetFontMinerWarsBlue()); - m_fieldOfViewDefaultLabel.UpdateParams(MathHelper.ToDegrees(MyConstants.FIELD_OF_VIEW_CONFIG_DEFAULT)); - Controls.Add(m_fieldOfViewDefaultLabel); - - //MyGuiManager.GetFontMinerWarsBlue() - // Brightness - //Controls.Add(new MyGuiControlLabel(this, controlsOriginLeft + 8 * MyGuiConstants.CONTROLS_DELTA, null, MyTextsWrapperEnum.Brightness, MyGuiConstants.LABEL_TEXT_COLOR, MyGuiConstants.LABEL_TEXT_SCALE_OPTIONS, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_CENTER)); - - // Contrast - //Controls.Add(new MyGuiControlLabel(this, controlsOriginLeft + 9 * MyGuiConstants.CONTROLS_DELTA, null, MyTextsWrapperEnum.Contrast, MyGuiConstants.LABEL_TEXT_COLOR, MyGuiConstants.LABEL_TEXT_SCALE_OPTIONS, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_CENTER)); - //m_contrastTextbox = new MyGuiControlTextbox(this, controlsOriginRight + 9 * MyGuiConstants.CONTROLS_DELTA + new Vector2(MyGuiConstants.TEXTBOX_WIDTH / 2.0f, 0), MyGuiConstants.TEXTBOX_WIDTH, "Opicka©123456", 20, MyGuiConstants.LABEL_TEXT_COLOR, MyGuiConstants.LABEL_TEXT_SCALE_OPTIONS, MyGuiControlTextboxType.NORMAL); - //Controls.Add(m_contrastTextbox); - - // Buttons APPLY and BACK - - - var m_okButton = new MyGuiControlButton(this, new Vector2(-0.1379f, 0.2269f), MyGuiConstants.OK_BUTTON_SIZE, - MyGuiConstants.BUTTON_BACKGROUND_COLOR, - MyGuiManager.GetInventoryScreenButtonTexture(), null, null, MyTextsWrapperEnum.Ok, - MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, MyGuiControlButtonTextAlignment.CENTERED, OnApplyClick, - true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true, true); - Controls.Add(m_okButton); - //Controls.Add(new MyGuiControlButton(this, new Vector2(-buttonDelta.X, buttonDelta.Y), MyGuiConstants.MESSAGE_BOX_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, - // MyTextsWrapperEnum.Apply, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnApplyClick, MyGuiControlButtonTextAlignment.CENTERED, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); - //Controls.Add(new MyGuiControlButton(this, new Vector2(+buttonDelta.X, buttonDelta.Y), MyGuiConstants.MESSAGE_BOX_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, - // MyTextsWrapperEnum.Back, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnBackClick, MyGuiControlButtonTextAlignment.CENTERED, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); - - var m_cancelButton = new MyGuiControlButton(this, new Vector2(0.1428f, 0.2269f), MyGuiConstants.OK_BUTTON_SIZE, - MyGuiConstants.BUTTON_BACKGROUND_COLOR, - MyGuiManager.GetInventoryScreenButtonTexture(), null, null, MyTextsWrapperEnum.Back, - MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, MyGuiControlButtonTextAlignment.CENTERED, OnBackClick, - true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true, true); - Controls.Add(m_cancelButton); - - // Update controls with values from config file - UpdateFromConfig(); - UpdateControls(m_settingsOld); - - // Update OLD settings - UpdateSettings(m_settingsOld); - UpdateSettings(m_settingsNew); - - MyMwcLog.WriteLine("MyGuiScreenOptionsVideo.ctor END"); - } - - private void UpdateRecommendecAspectRatioLabel(int adapterIndex) - { - m_recommendAspectRatioLabel.UpdateText(GetRecommendedAspectRatio(adapterIndex) + " ***"); - } - - void OnVideoAdapterSelected() - { - int adapterIndex = m_videoAdapterCombobox.GetSelectedKey(); - AddDisplayModesToComboBox(adapterIndex); - UpdateRecommendecAspectRatioLabel(adapterIndex); - - m_videoModeCombobox.SelectItemByKey(MyVideoModeManager.GetVideoModeIndexByWidthAndHeight(adapterIndex, m_settingsOld.VideoMode.Width, m_settingsOld.VideoMode.Height)); - } - - void OnVideoModeSelected() - { - MyVideoModeEx mode = MyVideoModeManager.GetVideoModeByIndex(m_videoAdapterCombobox.GetSelectedKey(), m_videoModeCombobox.GetSelectedKey()); - m_fieldOfViewSlider.SetValue(MyConstants.FIELD_OF_VIEW_CONFIG_DEFAULT); - if (mode.AspectRatio >= (12.0 / 3.0)) - { - m_fieldOfViewSlider.SetBounds(MyConstants.FIELD_OF_VIEW_CONFIG_MIN, MyConstants.FIELD_OF_VIEW_CONFIG_MAX_TRIPLE_HEAD); - } - else if (mode.AspectRatio >= (8.0 / 3.0)) - { - m_fieldOfViewSlider.SetBounds(MyConstants.FIELD_OF_VIEW_CONFIG_MIN, MyConstants.FIELD_OF_VIEW_CONFIG_MAX_DUAL_HEAD); - } - else - { - m_fieldOfViewSlider.SetBounds(MyConstants.FIELD_OF_VIEW_CONFIG_MIN, MyConstants.FIELD_OF_VIEW_CONFIG_MAX); - } - } - - void OnFovChanged(MyGuiControlSlider sender) - { - m_fieldOfViewLabel.UpdateParams(MathHelper.ToDegrees(m_fieldOfViewSlider.GetValue())); - } - - public override string GetFriendlyName() - { - return "MyGuiScreenOptionsVideo"; - } - - void UpdateFromConfig() - { - MyMwcLog.WriteLine("MyGuiScreenOptionsVideo.UpdateFromConfig START"); - - m_settingsOld.VideoAdapter = MyConfig.VideoAdapter; - m_settingsOld.VideoMode = MyConfig.VideoMode; - m_settingsOld.FullScreen = MyConfig.FullScreen; - m_settingsOld.VerticalSync = MyConfig.VerticalSync; - m_settingsOld.HardwareCursor = MyConfig.HardwareCursor; - m_settingsOld.RenderQuality = MyConfig.RenderQuality; - m_settingsOld.FieldOfView = MyConfig.FieldOfView; - - MyMwcLog.WriteLine("MyGuiScreenOptionsVideo.UpdateFromConfig END"); - } - - bool UpdateSettings(MyGuiScreenOptionsVideoSettings settings) - { - bool retval = settings.VideoMode != MyVideoModeManager.GetVideoModeByIndex(m_videoAdapterCombobox.GetSelectedKey(), m_videoModeCombobox.GetSelectedKey()) || - settings.VideoAdapter != m_videoAdapterCombobox.GetSelectedKey() || - settings.FullScreen != m_fullscreenCheckbox.Checked || - settings.VerticalSync != m_verticalSyncCheckbox.Checked || - settings.HardwareCursor != m_hardwareCursorCheckbox.Checked || - settings.RenderQuality != (MyRenderQualityEnum)m_renderQualityCombobox.GetSelectedKey() || - settings.FieldOfView != m_fieldOfViewSlider.GetValue(); - - settings.VideoAdapter = m_videoAdapterCombobox.GetSelectedKey(); - settings.VideoMode = MyVideoModeManager.GetVideoModeByIndex(settings.VideoAdapter, m_videoModeCombobox.GetSelectedKey()); - settings.FullScreen = m_fullscreenCheckbox.Checked; - settings.VerticalSync = m_verticalSyncCheckbox.Checked; - settings.HardwareCursor = m_hardwareCursorCheckbox.Checked; - settings.RenderQuality = (MyRenderQualityEnum)m_renderQualityCombobox.GetSelectedKey(); - settings.FieldOfView = m_fieldOfViewSlider.GetValue(); - - return retval; - } - - void UpdateControls(MyGuiScreenOptionsVideoSettings settings) - { - m_videoAdapterCombobox.SelectItemByKey(settings.VideoAdapter); - m_videoModeCombobox.SelectItemByKey(MyVideoModeManager.GetVideoModeIndexByWidthAndHeight(settings.VideoAdapter, settings.VideoMode.Width, settings.VideoMode.Height)); - m_fullscreenCheckbox.Checked = settings.FullScreen; - m_verticalSyncCheckbox.Checked = settings.VerticalSync; - m_hardwareCursorCheckbox.Checked = settings.HardwareCursor; - m_renderQualityCombobox.SelectItemByKey((int)settings.RenderQuality); - m_fieldOfViewSlider.SetValue(settings.FieldOfView); - OnFovChanged(m_fieldOfViewSlider); - } - - void SaveSettings() - { - MyConfig.VideoAdapter = m_settingsNew.VideoAdapter; - MyConfig.VideoMode = m_settingsNew.VideoMode; - MyConfig.FullScreen = m_settingsNew.FullScreen; - MyConfig.VerticalSync = m_settingsNew.VerticalSync; - MyConfig.HardwareCursor = m_settingsNew.HardwareCursor; - MyConfig.RenderQuality = m_settingsNew.RenderQuality; - MyConfig.FieldOfView = m_settingsNew.FieldOfView; - } - - public void OnBackClick(MyGuiControlButton sender) - { - // Just close the screen, ignore any change - CloseScreen(); - } - - public void OnApplyClick(MyGuiControlButton sender) - { - // Update NEW settings - bool somethingChanged = UpdateSettings(m_settingsNew); - - // Change video mode to new one - if (somethingChanged) - { - MyVideoModeManager.BeginChangeVideoMode(true, m_settingsNew.VideoAdapter, m_settingsNew.VideoMode, m_settingsNew.FullScreen, m_settingsNew.VerticalSync, m_settingsNew.HardwareCursor, m_settingsNew.RenderQuality, m_settingsNew.FieldOfView, false, OnVideoModeChangedAndComfirm); - } - else - { - CloseScreen(); - } - } - - private void OnVideoModeChangedAndComfirm(MinerWars.AppCode.Game.VideoMode.MyVideoModeManager.MyVideoModeChangeOperation result) - { - bool changed = MyVideoModeManager.EndChangeVideoMode(result); - - if (changed) - { - if (MyVideoModeManager.HasAnythingChanged(result)) - { - //udpate screen here - m_waitingForConfirmation = true; - MyGuiManager.AddScreen(new MyGuiScreenMessageBox(MyMessageBoxType.MESSAGE, MyTextsWrapperEnum.DoYouWantToKeepTheseSettingsXSecondsRemaining, - MyTextsWrapperEnum.MessageBoxCaptionPleaseConfirm, MyTextsWrapperEnum.Yes, MyTextsWrapperEnum.No, - OnMessageBoxCallback, MyGuiConstants.VIDEO_OPTIONS_CONFIRMATION_TIMEOUT_IN_MILISECONDS)); - } - } - else - { - MyGuiManager.AddScreen(new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, MyTextsWrapperEnum.SorryButSelectedSettingsAreNotSupportedByYourHardware, - MyTextsWrapperEnum.MessageBoxCaptionError, MyTextsWrapperEnum.Ok, null)); - - m_doRevert = true; - } - } - - private void OnVideoModeChanged(MinerWars.AppCode.Game.VideoMode.MyVideoModeManager.MyVideoModeChangeOperation result) - { - UpdateControls(m_settingsOld); - UpdateSettings(m_settingsNew); - } - - public void OnMessageBoxCallback(MyGuiScreenMessageBoxCallbackEnum callbackReturn) - { - if (callbackReturn == MyGuiScreenMessageBoxCallbackEnum.YES) - { - // Save current video mode settings - SaveSettings(); - MyConfig.Save(); - - // These are now OLD settings - UpdateSettings(m_settingsOld); - - this.CloseScreenNow(); - } - else - { - m_doRevert = true; - //RevertChanges(); - } - - m_waitingForConfirmation = false; - } - - // Revert changes - setting new video resolution must be done from Draw call, because when called - // from Update while game isn't active (alt-tabed or minimized) it will fail on weird XNA exceptions - void RevertChanges() - { - // Revert and change video mode to OLD settings - MyVideoModeManager.BeginChangeVideoMode(true, - m_settingsOld.VideoAdapter, - m_settingsOld.VideoMode, - m_settingsOld.FullScreen, m_settingsOld.VerticalSync, m_settingsOld.HardwareCursor, m_settingsOld.RenderQuality, m_settingsOld.FieldOfView, false, OnVideoModeChanged); - } - - public override bool CloseScreen() - { - bool ret = base.CloseScreen(); - - // If the screen was closed for whatever reason during we waited for 15secs acknowledgement of changes, we need to revert them (because YES wasn't pressed) - if ((ret == true) && (m_waitingForConfirmation == true)) - { - //RevertChanges(); - } - - return ret; - } - - void AddAdaptersToComboBox() - { - int counter = 0; - foreach (GraphicsAdapter adapter in GraphicsAdapter.Adapters) - { - m_videoAdapterCombobox.AddItem(counter++, new StringBuilder(adapter.Name)); - } - } - - void AddDisplayModesToComboBox(int adapterIndex) - { - m_videoModeCombobox.ClearItems(); - - int counter = 0; - foreach (MyVideoModeEx videoMode in MyVideoModeManager.GetAllSupportedVideoModes(adapterIndex)) - { - m_videoModeCombobox.AddItem(counter++, new StringBuilder( - videoMode.Width + " × " + videoMode.Height + string.Format(videoMode.IsRecommended ? " – {0} ***" : " – {0}", MyTextsWrapper.Get(MyAspectRatioExList.Get(videoMode.AspectRatioEnum).TextShort)) - )); - } - } - - StringBuilder GetRecommendedAspectRatio(int adapterIndex) - { - MyAspectRatioEx recommendedAspectRatio = MyAspectRatioExList.Get(MyAspectRatioExList.GetWindowsDesktopClosestAspectRatio(adapterIndex)); - - StringBuilder sb = new StringBuilder(); - sb.AppendFormat(MyTextsWrapper.Get(MyTextsWrapperEnum.RecommendedAspectRatio).ToString(), MyTextsWrapper.Get(recommendedAspectRatio.TextShort)); - return sb; - } - - public override bool Draw(float backgroundFadeAlpha) - { - if (base.Draw(backgroundFadeAlpha) == false) return false; - - if (m_doRevert) - { - // Revert changes - setting new video resolution must be done from Draw call, because when called - // from Update while game isn't active (alt-tabed or minimized) it will fail on weird XNA exceptions - RevertChanges(); - m_doRevert = false; - } - - return true; - } - } +using System.Text; +using MinerWarsMath; +using MinerWarsMath.Graphics; +using MinerWars.AppCode.Game.GUI.Core; +using MinerWars.AppCode.Game.Localization; +using MinerWars.AppCode.Game.Utils; +using MinerWars.AppCode.Game.VideoMode; +using MinerWars.AppCode.Game.Voxels; +using MinerWars.AppCode.Game.Render; +using SysUtils.Utils; +using MinerWars.AppCode.Game.Textures; +// Controls dependency: +// - anti-aliasing combobox depends on full-screen checkbox + +namespace MinerWars.AppCode.Game.GUI +{ + using System; + using App; + using SharpDX.Toolkit.Graphics; + + class MyGuiScreenOptionsVideo : MyGuiScreenBase + { + internal class MyGuiScreenOptionsVideoSettings + { + public int VideoAdapter; + public bool FullScreen; + public bool VerticalSync; + public bool HardwareCursor; + public MyRenderQualityEnum RenderQuality; + public MyVideoModeEx VideoMode; + public float FieldOfView; + } + + readonly MyGuiControlCombobox m_videoAdapterCombobox; + readonly MyGuiControlCombobox m_videoModeCombobox; + readonly MyGuiControlCheckbox m_verticalSyncCheckbox; + readonly MyGuiControlCheckbox m_fullscreenCheckbox; + readonly MyGuiControlCheckbox m_hardwareCursorCheckbox; + readonly MyGuiControlCombobox m_renderQualityCombobox; + readonly MyGuiControlLabel m_recommendAspectRatioLabel; + readonly MyGuiControlSlider m_fieldOfViewSlider; + readonly MyGuiControlLabel m_fieldOfViewLabel; + readonly MyGuiControlLabel m_fieldOfViewDefaultLabel; + + readonly MyGuiScreenOptionsVideoSettings m_settingsOld = new MyGuiScreenOptionsVideoSettings(); + readonly MyGuiScreenOptionsVideoSettings m_settingsNew = new MyGuiScreenOptionsVideoSettings(); + + bool m_waitingForConfirmation = false; + + bool m_doRevert = false; + + + public MyGuiScreenOptionsVideo() + : base(new Vector2(0.5f, 0.5f), MyGuiConstants.SCREEN_BACKGROUND_COLOR, null) + { + MyMwcLog.WriteLine("MyGuiScreenOptionsVideo.ctor START"); + + m_enableBackgroundFade = true; + m_size = new Vector2(0.59f, 0.68544f); + m_size *= 1.1f; + + m_backgroundTexture = MyTextureManager.GetTexture("Textures\\GUI\\BackgroundScreen\\VideoBackground", flags: TextureFlags.IgnoreQuality); + + AddCaption(MyTextsWrapperEnum.VideoOptions, new Vector2(0, 0.005f)); + //Controls.Add(new MyGuiControlLabel(this, -m_size.Value / 2.0f + MyGuiConstants.SCREEN_CAPTION_DELTA_Y, null, MyTextsWrapperEnum.VideoOptions, MyGuiConstants.SCREEN_CAPTION_TEXT_COLOR, MyGuiConstants.SCREEN_CAPTION_TEXT_SCALE)); + + Vector2 controlsOriginLeft = new Vector2(-m_size.Value.X / 2.0f + 0.05f, -m_size.Value.Y / 2.0f + 0.145f) + new Vector2(0.02f,0f); + Vector2 controlsOriginRight = new Vector2(-m_size.Value.X / 2.0f + 0.185f, -m_size.Value.Y / 2.0f + 0.145f) + new Vector2(0.043f,0f); + controlsOriginRight.X += 0.04f; + + + int controlIndex = 0; + + // Adapter + + Controls.Add(new MyGuiControlLabel(this, controlsOriginLeft + controlIndex * MyGuiConstants.CONTROLS_DELTA, null, MyTextsWrapperEnum.VideoAdapter, MyGuiConstants.LABEL_TEXT_COLOR, + MyGuiConstants.LABEL_TEXT_SCALE_OPTIONS, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_CENTER, MyGuiManager.GetFontMinerWarsBlue())); + + m_videoAdapterCombobox = new MyGuiControlCombobox(this, controlsOriginRight + controlIndex++ * MyGuiConstants.CONTROLS_DELTA + new Vector2(MyGuiConstants.COMBOBOX_MEDIUM_SIZE.X / 2.0f, 0), + MyGuiControlPreDefinedSize.MEDIUM, MyGuiConstants.COMBOBOX_BACKGROUND_COLOR, MyGuiConstants.COMBOBOX_TEXT_SCALE); + m_videoAdapterCombobox.OnSelect += OnVideoAdapterSelected; + AddAdaptersToComboBox(); + Controls.Add(m_videoAdapterCombobox); + + // Video Mode + Controls.Add(new MyGuiControlLabel(this, controlsOriginLeft + controlIndex * MyGuiConstants.CONTROLS_DELTA, null, MyTextsWrapperEnum.VideoMode, MyGuiConstants.LABEL_TEXT_COLOR, + MyGuiConstants.LABEL_TEXT_SCALE_OPTIONS, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_CENTER, MyGuiManager.GetFontMinerWarsBlue())); + + m_videoModeCombobox = new MyGuiControlCombobox(this, controlsOriginRight + controlIndex++ * MyGuiConstants.CONTROLS_DELTA + new Vector2(MyGuiConstants.COMBOBOX_MEDIUM_SIZE.X / 2.0f, 0), + MyGuiControlPreDefinedSize.MEDIUM, MyGuiConstants.COMBOBOX_BACKGROUND_COLOR, MyGuiConstants.COMBOBOX_TEXT_SCALE); + // Populating Video Mode with supported DisplayMode reported by XNA framework + m_videoModeCombobox.OnSelect += OnVideoModeSelected; + //Added on UpdateSettings + //AddDisplayModesToComboBox(MyMinerGame.GraphicsDeviceManager.GraphicsAdapter.AdapterOrdinal); + Controls.Add(m_videoModeCombobox); + + // Recommended aspect ratio + m_recommendAspectRatioLabel = new MyGuiControlLabel(this, new Vector2(controlsOriginRight.X + MyGuiConstants.COMBOBOX_TEXT_OFFSET.X, controlsOriginRight.Y + controlIndex++ * MyGuiConstants.CONTROLS_DELTA.Y - 0.015f), null, + new StringBuilder(), MyGuiConstants.LABEL_TEXT_COLOR * 0.9f, MyGuiConstants.LABEL_TEXT_SCALE_OPTIONS * 0.85f, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_CENTER, MyGuiManager.GetFontMinerWarsBlue()); + //Added on UpdateSettings + //UpdateRecommendecAspectRatioLabel(MyMinerGame.GraphicsDeviceManager.GraphicsAdapter.AdapterOrdinal); + Controls.Add(m_recommendAspectRatioLabel); + + // reduce the spacing between "Recommended aspect ratio" and items below it + Vector2 offSet = new Vector2(0, MyGuiConstants.CONTROLS_DELTA.Y / 2); + controlsOriginLeft -= offSet; + controlsOriginRight -= offSet; + + // Fullscreen + Controls.Add(new MyGuiControlLabel(this, controlsOriginLeft + controlIndex * MyGuiConstants.CONTROLS_DELTA, null, MyTextsWrapperEnum.Fullscreen, MyGuiConstants.LABEL_TEXT_COLOR, + MyGuiConstants.LABEL_TEXT_SCALE_OPTIONS, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_CENTER, MyGuiManager.GetFontMinerWarsBlue())); + + m_fullscreenCheckbox = new MyGuiControlCheckbox(this, + controlsOriginRight + controlIndex++ * MyGuiConstants.CONTROLS_DELTA + + new Vector2(MyGuiConstants.CHECKBOX_WITH_GLOW_SIZE.X / 2.0f, 0), MyGuiConstants.CHECKBOX_WITH_GLOW_SIZE, + MyGuiManager.GetCheckboxOffTexture(), MyGuiManager.GetCheckboxOnTexture(), null, + true, MyGuiConstants.CHECKBOX_BACKGROUND_COLOR, true, null); + //m_fullscreenCheckbox.OnCheck = OnFullScreenCheck; + Controls.Add(m_fullscreenCheckbox); + + // Vertical Sync + Controls.Add(new MyGuiControlLabel(this, controlsOriginLeft + controlIndex * MyGuiConstants.CONTROLS_DELTA, null, MyTextsWrapperEnum.VerticalSync, MyGuiConstants.LABEL_TEXT_COLOR, + MyGuiConstants.LABEL_TEXT_SCALE_OPTIONS, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_CENTER, MyGuiManager.GetFontMinerWarsBlue())); + //m_verticalSyncCheckbox = new MyGuiControlCheckbox(this, controlsOriginRight + 3 * MyGuiConstants.CONTROLS_DELTA + new Vector2(MyGuiConstants.CHECKBOX_SIZE.X / 2.0f, 0), true, MyGuiConstants.CHECKBOX_BACKGROUND_COLOR); + + + m_verticalSyncCheckbox = new MyGuiControlCheckbox(this, + controlsOriginRight + controlIndex++ * MyGuiConstants.CONTROLS_DELTA + + new Vector2(MyGuiConstants.CHECKBOX_WITH_GLOW_SIZE.X / 2.0f, 0), MyGuiConstants.CHECKBOX_WITH_GLOW_SIZE, + MyGuiManager.GetCheckboxOffTexture(), MyGuiManager.GetCheckboxOnTexture(), null, + false, MyGuiConstants.CHECKBOX_BACKGROUND_COLOR, true, null); + Controls.Add(m_verticalSyncCheckbox); + + + // Hardware Cursor + Controls.Add(new MyGuiControlLabel(this, controlsOriginLeft + controlIndex * MyGuiConstants.CONTROLS_DELTA, null, MyTextsWrapperEnum.HardwareCursor, MyGuiConstants.LABEL_TEXT_COLOR, + MyGuiConstants.LABEL_TEXT_SCALE_OPTIONS, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_CENTER, MyGuiManager.GetFontMinerWarsBlue())); + + m_hardwareCursorCheckbox = new MyGuiControlCheckbox(this, + controlsOriginRight + controlIndex++ * MyGuiConstants.CONTROLS_DELTA + + new Vector2(MyGuiConstants.CHECKBOX_WITH_GLOW_SIZE.X / 2.0f, 0), MyGuiConstants.CHECKBOX_WITH_GLOW_SIZE, + MyGuiManager.GetCheckboxOffTexture(), MyGuiManager.GetCheckboxOnTexture(), null, + false, MyGuiConstants.CHECKBOX_BACKGROUND_COLOR, true, null); + Controls.Add(m_hardwareCursorCheckbox); + + // Render Quality + Controls.Add(new MyGuiControlLabel(this, controlsOriginLeft + controlIndex * MyGuiConstants.CONTROLS_DELTA, null, MyTextsWrapperEnum.RenderQuality, MyGuiConstants.LABEL_TEXT_COLOR, + MyGuiConstants.LABEL_TEXT_SCALE_OPTIONS, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_CENTER, MyGuiManager.GetFontMinerWarsBlue())); + m_renderQualityCombobox = new MyGuiControlCombobox(this, controlsOriginRight + controlIndex++ * MyGuiConstants.CONTROLS_DELTA + new Vector2(MyGuiConstants.COMBOBOX_MEDIUM_SIZE.X / 2.0f, 0), + MyGuiControlPreDefinedSize.MEDIUM, MyGuiConstants.COMBOBOX_BACKGROUND_COLOR, MyGuiConstants.COMBOBOX_TEXT_SCALE); + m_renderQualityCombobox.AddItem((int)MyRenderQualityEnum.LOW, MyTextsWrapperEnum.RenderQualityLow); + m_renderQualityCombobox.AddItem((int)MyRenderQualityEnum.NORMAL, MyTextsWrapperEnum.RenderQualityNormal); + m_renderQualityCombobox.AddItem((int)MyRenderQualityEnum.HIGH, MyTextsWrapperEnum.RenderQualityHigh); + m_renderQualityCombobox.AddItem((int)MyRenderQualityEnum.EXTREME, MyTextsWrapperEnum.RenderQualityExtreme); + Controls.Add(m_renderQualityCombobox); + + // Field of View + Controls.Add(new MyGuiControlLabel(this, controlsOriginLeft + controlIndex * MyGuiConstants.CONTROLS_DELTA, null, MyTextsWrapperEnum.FieldOfView, MyGuiConstants.LABEL_TEXT_COLOR, + MyGuiConstants.LABEL_TEXT_SCALE_OPTIONS, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_CENTER, MyGuiManager.GetFontMinerWarsBlue())); + + const float fovSliderSize = MyGuiConstants.SLIDER_WIDTH * 1.1f; + m_fieldOfViewSlider = new MyGuiControlSlider(this, controlsOriginRight + controlIndex * MyGuiConstants.CONTROLS_DELTA + new Vector2(fovSliderSize / 2.0f, 0), + fovSliderSize, MyConstants.FIELD_OF_VIEW_CONFIG_MIN, MyConstants.FIELD_OF_VIEW_CONFIG_MAX, MyGuiConstants.SLIDER_BACKGROUND_COLOR, + new StringBuilder(), MyGuiConstants.SLIDER_WIDTH_LABEL, 0, MyGuiConstants.LABEL_TEXT_SCALE_OPTIONS * 0.85f); + m_fieldOfViewSlider.OnChange = OnFovChanged; + Controls.Add(m_fieldOfViewSlider); + + m_fieldOfViewLabel = new MyGuiControlLabel(this, controlsOriginRight + controlIndex++ * MyGuiConstants.CONTROLS_DELTA + new Vector2(fovSliderSize * 1.1f, 0), + null, new StringBuilder("{0:F1}"), MyGuiConstants.LABEL_TEXT_COLOR, + MyGuiConstants.LABEL_TEXT_SCALE_OPTIONS, MyGuiDrawAlignEnum.HORISONTAL_RIGHT_AND_VERTICAL_CENTER, MyGuiManager.GetFontMinerWarsBlue()); + Controls.Add(m_fieldOfViewLabel); + + m_fieldOfViewDefaultLabel = new MyGuiControlLabel(this, controlsOriginRight + controlIndex++ * MyGuiConstants.CONTROLS_DELTA + new Vector2(0.009f, 0), + null, MyTextsWrapper.Get(MyTextsWrapperEnum.DefaultFOV), MyGuiConstants.LABEL_TEXT_COLOR, + MyGuiConstants.LABEL_TEXT_SCALE_OPTIONS, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_BOTTOM, MyGuiManager.GetFontMinerWarsBlue()); + m_fieldOfViewDefaultLabel.UpdateParams(MathHelper.ToDegrees(MyConstants.FIELD_OF_VIEW_CONFIG_DEFAULT)); + Controls.Add(m_fieldOfViewDefaultLabel); + + //MyGuiManager.GetFontMinerWarsBlue() + // Brightness + //Controls.Add(new MyGuiControlLabel(this, controlsOriginLeft + 8 * MyGuiConstants.CONTROLS_DELTA, null, MyTextsWrapperEnum.Brightness, MyGuiConstants.LABEL_TEXT_COLOR, MyGuiConstants.LABEL_TEXT_SCALE_OPTIONS, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_CENTER)); + + // Contrast + //Controls.Add(new MyGuiControlLabel(this, controlsOriginLeft + 9 * MyGuiConstants.CONTROLS_DELTA, null, MyTextsWrapperEnum.Contrast, MyGuiConstants.LABEL_TEXT_COLOR, MyGuiConstants.LABEL_TEXT_SCALE_OPTIONS, MyGuiDrawAlignEnum.HORISONTAL_LEFT_AND_VERTICAL_CENTER)); + //m_contrastTextbox = new MyGuiControlTextbox(this, controlsOriginRight + 9 * MyGuiConstants.CONTROLS_DELTA + new Vector2(MyGuiConstants.TEXTBOX_WIDTH / 2.0f, 0), MyGuiConstants.TEXTBOX_WIDTH, "Opicka©123456", 20, MyGuiConstants.LABEL_TEXT_COLOR, MyGuiConstants.LABEL_TEXT_SCALE_OPTIONS, MyGuiControlTextboxType.NORMAL); + //Controls.Add(m_contrastTextbox); + + // Buttons APPLY and BACK + + + var m_okButton = new MyGuiControlButton(this, new Vector2(-0.1379f, 0.2269f), MyGuiConstants.OK_BUTTON_SIZE, + MyGuiConstants.BUTTON_BACKGROUND_COLOR, + MyGuiManager.GetInventoryScreenButtonTexture(), null, null, MyTextsWrapperEnum.Ok, + MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, MyGuiControlButtonTextAlignment.CENTERED, OnApplyClick, + true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true, true); + Controls.Add(m_okButton); + //Controls.Add(new MyGuiControlButton(this, new Vector2(-buttonDelta.X, buttonDelta.Y), MyGuiConstants.MESSAGE_BOX_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, + // MyTextsWrapperEnum.Apply, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnApplyClick, MyGuiControlButtonTextAlignment.CENTERED, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); + //Controls.Add(new MyGuiControlButton(this, new Vector2(+buttonDelta.X, buttonDelta.Y), MyGuiConstants.MESSAGE_BOX_BUTTON_SIZE, MyGuiConstants.BUTTON_BACKGROUND_COLOR, + // MyTextsWrapperEnum.Back, MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, OnBackClick, MyGuiControlButtonTextAlignment.CENTERED, true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true)); + + var m_cancelButton = new MyGuiControlButton(this, new Vector2(0.1428f, 0.2269f), MyGuiConstants.OK_BUTTON_SIZE, + MyGuiConstants.BUTTON_BACKGROUND_COLOR, + MyGuiManager.GetInventoryScreenButtonTexture(), null, null, MyTextsWrapperEnum.Back, + MyGuiConstants.BUTTON_TEXT_COLOR, MyGuiConstants.BUTTON_TEXT_SCALE, MyGuiControlButtonTextAlignment.CENTERED, OnBackClick, + true, MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_CENTER, true, true); + Controls.Add(m_cancelButton); + + // Update controls with values from config file + UpdateFromConfig(); + UpdateControls(m_settingsOld); + + // Update OLD settings + UpdateSettings(m_settingsOld); + UpdateSettings(m_settingsNew); + + MyMwcLog.WriteLine("MyGuiScreenOptionsVideo.ctor END"); + } + + private void UpdateRecommendecAspectRatioLabel(int adapterIndex) + { + m_recommendAspectRatioLabel.UpdateText(GetRecommendedAspectRatio(adapterIndex) + " ***"); + } + + void OnVideoAdapterSelected() + { + int adapterIndex = m_videoAdapterCombobox.GetSelectedKey(); + AddDisplayModesToComboBox(adapterIndex); + UpdateRecommendecAspectRatioLabel(adapterIndex); + + m_videoModeCombobox.SelectItemByKey(MyVideoModeManager.GetVideoModeIndexByWidthAndHeight(adapterIndex, m_settingsOld.VideoMode.Width, m_settingsOld.VideoMode.Height)); + } + + void OnVideoModeSelected() + { + MyVideoModeEx mode = MyVideoModeManager.GetVideoModeByIndex(m_videoAdapterCombobox.GetSelectedKey(), m_videoModeCombobox.GetSelectedKey()); + m_fieldOfViewSlider.SetValue(MyConstants.FIELD_OF_VIEW_CONFIG_DEFAULT); + if (mode.AspectRatio >= (12.0 / 3.0)) + { + m_fieldOfViewSlider.SetBounds(MyConstants.FIELD_OF_VIEW_CONFIG_MIN, MyConstants.FIELD_OF_VIEW_CONFIG_MAX_TRIPLE_HEAD); + } + else if (mode.AspectRatio >= (8.0 / 3.0)) + { + m_fieldOfViewSlider.SetBounds(MyConstants.FIELD_OF_VIEW_CONFIG_MIN, MyConstants.FIELD_OF_VIEW_CONFIG_MAX_DUAL_HEAD); + } + else + { + m_fieldOfViewSlider.SetBounds(MyConstants.FIELD_OF_VIEW_CONFIG_MIN, MyConstants.FIELD_OF_VIEW_CONFIG_MAX); + } + } + + void OnFovChanged(MyGuiControlSlider sender) + { + m_fieldOfViewLabel.UpdateParams(MathHelper.ToDegrees(m_fieldOfViewSlider.GetValue())); + } + + public override string GetFriendlyName() + { + return "MyGuiScreenOptionsVideo"; + } + + void UpdateFromConfig() + { + MyMwcLog.WriteLine("MyGuiScreenOptionsVideo.UpdateFromConfig START"); + + m_settingsOld.VideoAdapter = MyConfig.VideoAdapter; + m_settingsOld.VideoMode = MyConfig.VideoMode; + m_settingsOld.FullScreen = MyConfig.FullScreen; + m_settingsOld.VerticalSync = MyConfig.VerticalSync; + m_settingsOld.HardwareCursor = MyConfig.HardwareCursor; + m_settingsOld.RenderQuality = MyConfig.RenderQuality; + m_settingsOld.FieldOfView = MyConfig.FieldOfView; + + MyMwcLog.WriteLine("MyGuiScreenOptionsVideo.UpdateFromConfig END"); + } + + bool UpdateSettings(MyGuiScreenOptionsVideoSettings settings) + { + bool retval = settings.VideoMode != MyVideoModeManager.GetVideoModeByIndex(m_videoAdapterCombobox.GetSelectedKey(), m_videoModeCombobox.GetSelectedKey()) || + settings.VideoAdapter != m_videoAdapterCombobox.GetSelectedKey() || + settings.FullScreen != m_fullscreenCheckbox.Checked || + settings.VerticalSync != m_verticalSyncCheckbox.Checked || + settings.HardwareCursor != m_hardwareCursorCheckbox.Checked || + settings.RenderQuality != (MyRenderQualityEnum)m_renderQualityCombobox.GetSelectedKey() || + settings.FieldOfView != m_fieldOfViewSlider.GetValue(); + + settings.VideoAdapter = m_videoAdapterCombobox.GetSelectedKey(); + settings.VideoMode = MyVideoModeManager.GetVideoModeByIndex(settings.VideoAdapter, m_videoModeCombobox.GetSelectedKey()); + settings.FullScreen = m_fullscreenCheckbox.Checked; + settings.VerticalSync = m_verticalSyncCheckbox.Checked; + settings.HardwareCursor = m_hardwareCursorCheckbox.Checked; + settings.RenderQuality = (MyRenderQualityEnum)m_renderQualityCombobox.GetSelectedKey(); + settings.FieldOfView = m_fieldOfViewSlider.GetValue(); + + return retval; + } + + void UpdateControls(MyGuiScreenOptionsVideoSettings settings) + { + m_videoAdapterCombobox.SelectItemByKey(settings.VideoAdapter); + m_videoModeCombobox.SelectItemByKey(MyVideoModeManager.GetVideoModeIndexByWidthAndHeight(settings.VideoAdapter, settings.VideoMode.Width, settings.VideoMode.Height)); + m_fullscreenCheckbox.Checked = settings.FullScreen; + m_verticalSyncCheckbox.Checked = settings.VerticalSync; + m_hardwareCursorCheckbox.Checked = settings.HardwareCursor; + m_renderQualityCombobox.SelectItemByKey((int)settings.RenderQuality); + m_fieldOfViewSlider.SetValue(settings.FieldOfView); + OnFovChanged(m_fieldOfViewSlider); + } + + void SaveSettings() + { + MyConfig.VideoAdapter = m_settingsNew.VideoAdapter; + MyConfig.VideoMode = m_settingsNew.VideoMode; + MyConfig.FullScreen = m_settingsNew.FullScreen; + MyConfig.VerticalSync = m_settingsNew.VerticalSync; + MyConfig.HardwareCursor = m_settingsNew.HardwareCursor; + MyConfig.RenderQuality = m_settingsNew.RenderQuality; + MyConfig.FieldOfView = m_settingsNew.FieldOfView; + } + + public void OnBackClick(MyGuiControlButton sender) + { + // Just close the screen, ignore any change + CloseScreen(); + } + + public void OnApplyClick(MyGuiControlButton sender) + { + // Update NEW settings + bool somethingChanged = UpdateSettings(m_settingsNew); + + // Change video mode to new one + if (somethingChanged) + { + MyVideoModeManager.BeginChangeVideoMode(true, m_settingsNew.VideoAdapter, m_settingsNew.VideoMode, m_settingsNew.FullScreen, m_settingsNew.VerticalSync, m_settingsNew.HardwareCursor, m_settingsNew.RenderQuality, m_settingsNew.FieldOfView, false, OnVideoModeChangedAndComfirm); + } + else + { + CloseScreen(); + } + } + + private void OnVideoModeChangedAndComfirm(MinerWars.AppCode.Game.VideoMode.MyVideoModeManager.MyVideoModeChangeOperation result) + { + bool changed = MyVideoModeManager.EndChangeVideoMode(result); + + if (changed) + { + if (MyVideoModeManager.HasAnythingChanged(result)) + { + //udpate screen here + m_waitingForConfirmation = true; + MyGuiManager.AddScreen(new MyGuiScreenMessageBox(MyMessageBoxType.MESSAGE, MyTextsWrapperEnum.DoYouWantToKeepTheseSettingsXSecondsRemaining, + MyTextsWrapperEnum.MessageBoxCaptionPleaseConfirm, MyTextsWrapperEnum.Yes, MyTextsWrapperEnum.No, + OnMessageBoxCallback, MyGuiConstants.VIDEO_OPTIONS_CONFIRMATION_TIMEOUT_IN_MILISECONDS)); + } + } + else + { + MyGuiManager.AddScreen(new MyGuiScreenMessageBox(MyMessageBoxType.ERROR, MyTextsWrapperEnum.SorryButSelectedSettingsAreNotSupportedByYourHardware, + MyTextsWrapperEnum.MessageBoxCaptionError, MyTextsWrapperEnum.Ok, null)); + + m_doRevert = true; + } + } + + private void OnVideoModeChanged(MinerWars.AppCode.Game.VideoMode.MyVideoModeManager.MyVideoModeChangeOperation result) + { + UpdateControls(m_settingsOld); + UpdateSettings(m_settingsNew); + } + + public void OnMessageBoxCallback(MyGuiScreenMessageBoxCallbackEnum callbackReturn) + { + if (callbackReturn == MyGuiScreenMessageBoxCallbackEnum.YES) + { + // Save current video mode settings + SaveSettings(); + MyConfig.Save(); + + // These are now OLD settings + UpdateSettings(m_settingsOld); + + this.CloseScreenNow(); + } + else + { + m_doRevert = true; + //RevertChanges(); + } + + m_waitingForConfirmation = false; + } + + // Revert changes - setting new video resolution must be done from Draw call, because when called + // from Update while game isn't active (alt-tabed or minimized) it will fail on weird XNA exceptions + void RevertChanges() + { + // Revert and change video mode to OLD settings + MyVideoModeManager.BeginChangeVideoMode(true, + m_settingsOld.VideoAdapter, + m_settingsOld.VideoMode, + m_settingsOld.FullScreen, m_settingsOld.VerticalSync, m_settingsOld.HardwareCursor, m_settingsOld.RenderQuality, m_settingsOld.FieldOfView, false, OnVideoModeChanged); + } + + public override bool CloseScreen() + { + bool ret = base.CloseScreen(); + + // If the screen was closed for whatever reason during we waited for 15secs acknowledgement of changes, we need to revert them (because YES wasn't pressed) + if ((ret == true) && (m_waitingForConfirmation == true)) + { + //RevertChanges(); + } + + return ret; + } + + void AddAdaptersToComboBox() + { + int counter = 0; + foreach (GraphicsAdapter adapter in GraphicsAdapter.Adapters) + { + m_videoAdapterCombobox.AddItem(counter++, new StringBuilder(adapter.Name)); + } + } + + void AddDisplayModesToComboBox(int adapterIndex) + { + m_videoModeCombobox.ClearItems(); + + int counter = 0; + foreach (MyVideoModeEx videoMode in MyVideoModeManager.GetAllSupportedVideoModes(adapterIndex)) + { + m_videoModeCombobox.AddItem(counter++, new StringBuilder( + videoMode.Width + " × " + videoMode.Height + string.Format(videoMode.IsRecommended ? " – {0} ***" : " – {0}", MyTextsWrapper.Get(MyAspectRatioExList.Get(videoMode.AspectRatioEnum).TextShort)) + )); + } + } + + StringBuilder GetRecommendedAspectRatio(int adapterIndex) + { + MyAspectRatioEx recommendedAspectRatio = MyAspectRatioExList.Get(MyAspectRatioExList.GetWindowsDesktopClosestAspectRatio(adapterIndex)); + + StringBuilder sb = new StringBuilder(); + sb.AppendFormat(MyTextsWrapper.Get(MyTextsWrapperEnum.RecommendedAspectRatio).ToString(), MyTextsWrapper.Get(recommendedAspectRatio.TextShort)); + return sb; + } + + public override bool Draw(float backgroundFadeAlpha) + { + if (base.Draw(backgroundFadeAlpha) == false) return false; + + if (m_doRevert) + { + // Revert changes - setting new video resolution must be done from Draw call, because when called + // from Update while game isn't active (alt-tabed or minimized) it will fail on weird XNA exceptions + RevertChanges(); + m_doRevert = false; + } + + return true; + } + } } \ No newline at end of file diff --git a/Sources/MinerWars.GameLib/AppCode/Game/Models/MyMesh.cs b/Sources/MinerWars.GameLib/AppCode/Game/Models/MyMesh.cs index a0a270d..1184ab0 100644 --- a/Sources/MinerWars.GameLib/AppCode/Game/Models/MyMesh.cs +++ b/Sources/MinerWars.GameLib/AppCode/Game/Models/MyMesh.cs @@ -38,8 +38,7 @@ internal class MyMesh /// assetName - just for debug output public MyMesh(MyMeshPartInfo meshInfo, string assetName) { - string textureName = null; - + string textureName = null; MyMaterialDescriptor matDesc = meshInfo.m_MaterialDesc; if (matDesc != null) { @@ -113,6 +112,7 @@ public MyMesh(MyMeshPartInfo meshInfo, string assetName) newNameDiffuse, newNameNormal, matDesc.m_Glossiness, hasNormalTexture, ref matDesc.m_DiffuseColor, + ref matDesc.m_SpecularColor); } } @@ -128,7 +128,7 @@ public MyMesh(MyMeshPartInfo meshInfo, string assetName) //We define at least debug material MinerWarsMath.Vector3 color = MinerWarsMath.Color.Pink.ToVector3(); Materials = new MyMeshMaterial[8]; - Materials[0] = new MyMeshMaterial("", null, null, 0, true, ref color, ref color); + Materials[0] = new MyMeshMaterial("", "Textures2\\Models\\Prefabs\\v01\\v01_cargo_box_de", "Textures2\\Models\\Prefabs\\v01\\v01_cargo_box_ns", 0, true, ref color, ref color); for (int j = 1; j < Materials.Length; j++) { Materials[j] = Materials[0]; diff --git a/Sources/MinerWars.GameLib/AppCode/Game/Models/MyMeshMaterial.cs b/Sources/MinerWars.GameLib/AppCode/Game/Models/MyMeshMaterial.cs index 4c72440..de2076b 100644 --- a/Sources/MinerWars.GameLib/AppCode/Game/Models/MyMeshMaterial.cs +++ b/Sources/MinerWars.GameLib/AppCode/Game/Models/MyMeshMaterial.cs @@ -1,336 +1,336 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using MinerWarsMath.Graphics; -using MinerWars.AppCode.Game.Render; - -using MinerWarsMath; -using MinerWars.AppCode.Game.Textures; - -namespace MinerWars.AppCode.Game.Models -{ - using MinerWars.AppCode.App; - using System.Diagnostics; - using MinerWars.AppCode.Game.Utils; - using MinerWars.AppCode.Game.Managers; - using MinerWars.CommonLIB.AppCode.Import; - - //@ Simple stupid material class which enwrapp 2 textures and generate uniqueID form textures - internal class MyMeshMaterial - { - private const string C_FAKE_NORMAL_TEXTURE = "Textures2\\Models\\fake_n"; - - public int HashCode; - private MyTexture2D m_diffuseTex; - private MyTexture2D m_normalTex; - - private float m_specularIntensity = 1f; - private float m_specularPower = 1f; - private Vector3 m_specularColor; - private Vector3 m_diffuseColor = new Vector3(1f, 1f, 1f); - - private readonly string m_materialName; - private readonly string m_diffuseName; - private readonly string m_normalName; - private readonly bool m_hasNormalTexture; - private MyMeshDrawTechnique m_drawTechnique; - private Vector2 m_emissiveUVAnim; - private bool m_emissivityEnabled = true; - - private bool m_loadedContent; - - Vector2 m_diffuseUVAnim; - public Vector2 DiffuseUVAnim - { - get { return m_diffuseUVAnim; } - set { m_diffuseUVAnim = value; ComputeHashCode(); } - } - - public Vector2 EmissiveUVAnim - { - get - { - if (m_emissivityEnabled) - { - return m_emissiveUVAnim; - } - else - { - return Vector2.Zero; - } - } - set - { - m_emissiveUVAnim = value; - ComputeHashCode(); - } - } - - public bool EmissivityEnabled - { - get { return m_emissivityEnabled; } - set - { - if (m_emissivityEnabled != value) - { - m_emissivityEnabled = value; - ComputeHashCode(); - } - } - } - - public float EmissivityOffset - { - get - { - if (EmissivityEnabled) - { - return MyMinerGame.TotalGamePlayTimeInMilliseconds / 1000.0f; - } - else - { - return 0f; - } - } - } - - public float HoloEmissivity - { - get - { - if (EmissivityEnabled) - { - if (SpecularColor.Y > 0) - { //material with animated emissivity - return (((float)Math.Sin(MyMinerGame.TotalGamePlayTimeInMilliseconds / 1000.0f * SpecularColor.Y * 10.0f + SpecularColor.Z * 2 * (float)Math.PI)) + 1.0f) / 2.0f; - } - else //Holos and decals have multiplied emissivity - { - return 1f; - } - } - else - { - return 0f; - } - } - } - - public MyMeshDrawTechnique DrawTechnique - { - get { return m_drawTechnique; } - set { m_drawTechnique = value; } - } - - public MyTexture2D DiffuseTexture - { - get { return m_diffuseTex; } - set { m_diffuseTex = value; ComputeHashCode(); } - } - public MyTexture2D NormalTexture - { - get { return m_normalTex; } - set { m_normalTex = value; ComputeHashCode(); } - } - public float SpecularIntensity - { - get { return m_specularIntensity; } - set { m_specularIntensity = value; ComputeHashCode(); } - } - public float SpecularPower - { - get { return m_specularPower; } - set { m_specularPower = value; ComputeHashCode(); } - } - public Vector3 SpecularColor - { - get { return m_specularColor; } - set { m_specularColor = value; ComputeHashCode(); } - } - public Vector3 DiffuseColor - { - get { return m_diffuseColor; } - set { m_diffuseColor = value; ComputeHashCode(); } - } - - public string MaterialName - { - get { return m_materialName; } - } - - public MyMeshMaterial(string name, string materialName, MyTexture2D diff, MyTexture2D norm) - { - if (name!= null) - { - m_diffuseName = name + MyMesh.C_POSTFIX_DIFFUSE_EMISSIVE; - m_normalName = name + MyMesh.C_POSTFIX_NORMAL_SPECULAR; - } - m_materialName = materialName; - m_drawTechnique = MyMeshDrawTechnique.MESH; - HashCode = 0; - m_diffuseTex = diff; - m_normalTex = norm; - m_hasNormalTexture = m_normalTex != null; - - ComputeHashCode(); - } - - /// - /// MyMeshMaterial - /// - /// - /// - public MyMeshMaterial(string materialName, string diffuseName, string normalName, float glossiness, bool hasNormalTexture, ref Vector3 diffuseColor, ref Vector3 specularColor) - { - if (diffuseColor == Vector3.Zero) - { - // Debug.Assert(diffuseColor != Vector3.Zero); - diffuseColor = Vector3.One; - } - - m_materialName = materialName; - m_diffuseName = diffuseName; - m_normalName = normalName; - m_specularIntensity = specularColor.X; //because of strange 3DSMAX/FBX conversion, specular level from 3ds max converts to .X component of specular color - m_specularPower = glossiness; - m_diffuseColor = diffuseColor; - m_hasNormalTexture = hasNormalTexture; - - //we are not using specular color directly, we just use it to store extra data (animation of holos) - m_specularColor = specularColor; - } - - /// - /// Preload textures into manager - /// - public void PreloadTexture(LoadingMode loadingMode = (MyFakes.LOAD_TEXTURES_IMMEDIATELY ? LoadingMode.Immediate : LoadingMode.LazyBackground)) - { - if (m_loadedContent || m_diffuseName == null) - { - return; - } - - if (m_hasNormalTexture) - { - DiffuseTexture = MyTextureManager.GetTexture(m_diffuseName, CheckTexture, loadingMode); - - if (MyRenderConstants.RenderQualityProfile.UseNormals) - NormalTexture = MyTextureManager.GetTexture(m_normalName, CheckTexture, loadingMode); - } - else - { - DiffuseTexture = MyTextureManager.GetTexture(m_diffuseName, CheckTexture, loadingMode); - - if (MyRenderConstants.RenderQualityProfile.UseNormals) - NormalTexture = MyTextureManager.GetTexture(C_FAKE_NORMAL_TEXTURE, CheckTexture, loadingMode); - } - - m_loadedContent = true; - } - - /// - /// Checks the normal map. - /// - /// The texture. - private static void CheckTexture(MyTexture texture) - { - MyUtils.AssertTexture((MyTexture2D)texture); - - texture.TextureLoaded -= CheckTexture; - } - - /// - /// ComputeHashCode - /// - /// - private void ComputeHashCode() - { - int result = 1; - int modCode = 0; - - if (m_diffuseTex != null) - { - result = m_diffuseTex.GetHashCode(); - modCode = (1 << 1); - } - - if (m_normalTex != null) - { - result = (result * 397) ^ m_normalTex.GetHashCode(); - modCode += (1 << 2); - } - - if (m_specularIntensity != 0) - { - result = (result * 397) ^ m_specularIntensity.GetHashCode(); - modCode += (1 << 4); - } - - if (m_specularPower != 0) - { - result = (result * 397) ^ m_specularPower.GetHashCode(); - modCode += (1 << 5); - } - - if (m_diffuseColor.GetHashCode() != 0) - { - result = (result * 397) ^ m_diffuseColor.GetHashCode(); - modCode += (1 << 6); - } - - if (DiffuseUVAnim.GetHashCode() != 0) - { - result = (result * 397) ^ DiffuseUVAnim.GetHashCode(); - modCode += (1 << 7); - } - - if (EmissiveUVAnim.GetHashCode() != 0) - { - result = (result * 397) ^ EmissiveUVAnim.GetHashCode(); - modCode += (1 << 8); - } - - result = (result * 397) ^ EmissivityEnabled.GetHashCode(); - modCode += (1 << 9); - - HashCode = (result * 397) ^ modCode; - } - - /// - /// GetHashCode - /// - /// - public override int GetHashCode() - { - unchecked - { - return HashCode; - } - } - - /// - /// Equals - /// - /// - /// - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - return false; - if (obj.GetType() != typeof(MyMeshMaterial)) - return false; - return HashCode == obj.GetHashCode(); - } - - - /// - /// Return modelDrawTechnique based on textures - /// - /// - public MyMeshDrawTechnique GenerateDrawTechnique() - { - return MyMeshDrawTechnique.MESH; - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using MinerWarsMath.Graphics; +using MinerWars.AppCode.Game.Render; + +using MinerWarsMath; +using MinerWars.AppCode.Game.Textures; + +namespace MinerWars.AppCode.Game.Models +{ + using MinerWars.AppCode.App; + using System.Diagnostics; + using MinerWars.AppCode.Game.Utils; + using MinerWars.AppCode.Game.Managers; + using MinerWars.CommonLIB.AppCode.Import; + + //@ Simple stupid material class which enwrapp 2 textures and generate uniqueID form textures + internal class MyMeshMaterial + { + private const string C_FAKE_NORMAL_TEXTURE = "Textures2\\Models\\fake_n"; + + public int HashCode; + private MyTexture2D m_diffuseTex; + private MyTexture2D m_normalTex; + + private float m_specularIntensity = 1f; + private float m_specularPower = 1f; + private Vector3 m_specularColor; + private Vector3 m_diffuseColor = new Vector3(1f, 1f, 1f); + + private readonly string m_materialName; + private readonly string m_diffuseName; + private readonly string m_normalName; + private readonly bool m_hasNormalTexture; + private MyMeshDrawTechnique m_drawTechnique; + private Vector2 m_emissiveUVAnim; + private bool m_emissivityEnabled = true; + + private bool m_loadedContent; + + Vector2 m_diffuseUVAnim; + public Vector2 DiffuseUVAnim + { + get { return m_diffuseUVAnim; } + set { m_diffuseUVAnim = value; ComputeHashCode(); } + } + + public Vector2 EmissiveUVAnim + { + get + { + if (m_emissivityEnabled) + { + return m_emissiveUVAnim; + } + else + { + return Vector2.Zero; + } + } + set + { + m_emissiveUVAnim = value; + ComputeHashCode(); + } + } + + public bool EmissivityEnabled + { + get { return m_emissivityEnabled; } + set + { + if (m_emissivityEnabled != value) + { + m_emissivityEnabled = value; + ComputeHashCode(); + } + } + } + + public float EmissivityOffset + { + get + { + if (EmissivityEnabled) + { + return MyMinerGame.TotalGamePlayTimeInMilliseconds / 1000.0f; + } + else + { + return 0f; + } + } + } + + public float HoloEmissivity + { + get + { + if (EmissivityEnabled) + { + if (SpecularColor.Y > 0) + { //material with animated emissivity + return (((float)Math.Sin(MyMinerGame.TotalGamePlayTimeInMilliseconds / 1000.0f * SpecularColor.Y * 10.0f + SpecularColor.Z * 2 * (float)Math.PI)) + 1.0f) / 2.0f; + } + else //Holos and decals have multiplied emissivity + { + return 1f; + } + } + else + { + return 0f; + } + } + } + + public MyMeshDrawTechnique DrawTechnique + { + get { return m_drawTechnique; } + set { m_drawTechnique = value; } + } + + public MyTexture2D DiffuseTexture + { + get { return m_diffuseTex; } + set { m_diffuseTex = value; ComputeHashCode(); } + } + public MyTexture2D NormalTexture + { + get { return m_normalTex; } + set { m_normalTex = value; ComputeHashCode(); } + } + public float SpecularIntensity + { + get { return m_specularIntensity; } + set { m_specularIntensity = value; ComputeHashCode(); } + } + public float SpecularPower + { + get { return m_specularPower; } + set { m_specularPower = value; ComputeHashCode(); } + } + public Vector3 SpecularColor + { + get { return m_specularColor; } + set { m_specularColor = value; ComputeHashCode(); } + } + public Vector3 DiffuseColor + { + get { return m_diffuseColor; } + set { m_diffuseColor = value; ComputeHashCode(); } + } + + public string MaterialName + { + get { return m_materialName; } + } + + public MyMeshMaterial(string name, string materialName, MyTexture2D diff, MyTexture2D norm) + { + if (name!= null) + { + m_diffuseName = name + MyMesh.C_POSTFIX_DIFFUSE_EMISSIVE; + m_normalName = name + MyMesh.C_POSTFIX_NORMAL_SPECULAR; + } + m_materialName = materialName; + m_drawTechnique = MyMeshDrawTechnique.MESH; + HashCode = 0; + m_diffuseTex = diff; + m_normalTex = norm; + m_hasNormalTexture = m_normalTex != null; + + ComputeHashCode(); + } + + /// + /// MyMeshMaterial + /// + /// + /// + public MyMeshMaterial(string materialName, string diffuseName, string normalName, float glossiness, bool hasNormalTexture, ref Vector3 diffuseColor, ref Vector3 specularColor) + { + if (diffuseColor == Vector3.Zero) + { + // Debug.Assert(diffuseColor != Vector3.Zero); + diffuseColor = Vector3.One; + } + + m_materialName = materialName; + m_diffuseName = diffuseName; + m_normalName = normalName; + m_specularIntensity = specularColor.X; //because of strange 3DSMAX/FBX conversion, specular level from 3ds max converts to .X component of specular color + m_specularPower = glossiness; + m_diffuseColor = diffuseColor; + m_hasNormalTexture = hasNormalTexture; + + //we are not using specular color directly, we just use it to store extra data (animation of holos) + m_specularColor = specularColor; + } + + /// + /// Preload textures into manager + /// + public void PreloadTexture(LoadingMode loadingMode = (MyFakes.LOAD_TEXTURES_IMMEDIATELY ? LoadingMode.Immediate : LoadingMode.LazyBackground)) + { + if (m_loadedContent || m_diffuseName == null) + { + return; + } + + if (m_hasNormalTexture) + { + DiffuseTexture = MyTextureManager.GetTexture(m_diffuseName, CheckTexture, loadingMode); + + if (MyRenderConstants.RenderQualityProfile.UseNormals) + NormalTexture = MyTextureManager.GetTexture(m_normalName, CheckTexture, loadingMode); + } + else + { + DiffuseTexture = MyTextureManager.GetTexture(m_diffuseName, CheckTexture, loadingMode); + + if (MyRenderConstants.RenderQualityProfile.UseNormals) + NormalTexture = MyTextureManager.GetTexture(C_FAKE_NORMAL_TEXTURE, CheckTexture, loadingMode); + } + + m_loadedContent = true; + } + + /// + /// Checks the normal map. + /// + /// The texture. + private static void CheckTexture(MyTexture texture) + { + MyUtils.AssertTexture((MyTexture2D)texture); + + texture.TextureLoaded -= CheckTexture; + } + + /// + /// ComputeHashCode + /// + /// + private void ComputeHashCode() + { + int result = 1; + int modCode = 0; + + if (m_diffuseTex != null) + { + result = m_diffuseTex.GetHashCode(); + modCode = (1 << 1); + } + + if (m_normalTex != null) + { + result = (result * 397) ^ m_normalTex.GetHashCode(); + modCode += (1 << 2); + } + + if (m_specularIntensity != 0) + { + result = (result * 397) ^ m_specularIntensity.GetHashCode(); + modCode += (1 << 4); + } + + if (m_specularPower != 0) + { + result = (result * 397) ^ m_specularPower.GetHashCode(); + modCode += (1 << 5); + } + + if (m_diffuseColor.GetHashCode() != 0) + { + result = (result * 397) ^ m_diffuseColor.GetHashCode(); + modCode += (1 << 6); + } + + if (DiffuseUVAnim.GetHashCode() != 0) + { + result = (result * 397) ^ DiffuseUVAnim.GetHashCode(); + modCode += (1 << 7); + } + + if (EmissiveUVAnim.GetHashCode() != 0) + { + result = (result * 397) ^ EmissiveUVAnim.GetHashCode(); + modCode += (1 << 8); + } + + result = (result * 397) ^ EmissivityEnabled.GetHashCode(); + modCode += (1 << 9); + + HashCode = (result * 397) ^ modCode; + } + + /// + /// GetHashCode + /// + /// + public override int GetHashCode() + { + unchecked + { + return HashCode; + } + } + + /// + /// Equals + /// + /// + /// + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + return false; + if (obj.GetType() != typeof(MyMeshMaterial)) + return false; + return HashCode == obj.GetHashCode(); + } + + + /// + /// Return modelDrawTechnique based on textures + /// + /// + public MyMeshDrawTechnique GenerateDrawTechnique() + { + return MyMeshDrawTechnique.MESH; + } + } +} diff --git a/Sources/MinerWars.GameLib/AppCode/Game/Models/MyModel.cs b/Sources/MinerWars.GameLib/AppCode/Game/Models/MyModel.cs index c51a14d..9115f09 100644 --- a/Sources/MinerWars.GameLib/AppCode/Game/Models/MyModel.cs +++ b/Sources/MinerWars.GameLib/AppCode/Game/Models/MyModel.cs @@ -1,1318 +1,1319 @@ -#region - -using System; -using System.Collections.Generic; -using System.Linq; -using MinerWars.AppCode.App; -using MinerWars.AppCode.Game.Managers; -using MinerWars.AppCode.Game.Utils; -using MinerWars.AppCode.Game.Utils.VertexFormats; -using MinerWars.AppCode.Physics; -using SysUtils.Utils; - -using MinerWars.AppCode.Game.Render; -using SysUtils; -using System.Diagnostics; -using System.IO; -using MinerWars.AppCode.Game.Textures; -using BulletXNA.BulletCollision; -using MinerWars.AppCode.Physics.Collisions; -using MinerWarsMath.Graphics.PackedVector; -using System.Runtime.InteropServices; - -//using MinerWarsMath; -//using MinerWarsMath.Graphics; - -using SharpDX; -using SharpDX.Direct3D9; -using SharpDX.Toolkit; -using SharpDX.Toolkit.Graphics; - -#endregion - -// Coordinate system transformation: -// 3DS MAX displays different coordinate system than XNA, plus when converting to FBX, it looks like it switches sign of Z values (Z in XNA way). -// So when thinking about converting coordinate system, this is it: -// XNA X = 3DSMAX X -// XNA Y = 3DSMAX Z -// XNA Z = NEGATIVE OF 3DSMAX Y - -namespace MinerWars.AppCode.Game.Models -{ - using Vector2 = MinerWarsMath.Vector2; - using Vector3 = MinerWarsMath.Vector3; - using Vector4 = MinerWarsMath.Vector4; - using Rectangle = MinerWarsMath.Rectangle; - using Matrix = MinerWarsMath.Matrix; - using Color = MinerWarsMath.Color; - using BoundingBox = MinerWarsMath.BoundingBox; - using BoundingSphere = MinerWarsMath.BoundingSphere; - using BoundingFrustum = MinerWarsMath.BoundingFrustum; - using MinerWars.CommonLIB.AppCode.Import; - - class MyModel : IDisposable, IPrimitiveManagerBase - { - private const string C_POSTFIX_MASK = "_m"; - - static MyModelExporter m_exporter = new MyModelExporter(); - - public readonly MyModelsEnum ModelEnum; - - public bool KeepInMemory { get; private set; } - - - MyMeshDrawTechnique m_drawTechnique; - VertexBuffer m_vertexBuffer = null; - IndexBuffer m_indexBuffer = null; - int m_verticesCount; - int m_trianglesCount; - int m_vertexBufferSize; - int m_indexBufferSize; - int m_vertexStride; - VertexDeclaration m_vertexDeclaration; - - public int GetVBSize - { - get { return m_vertexBufferSize; } - } - public int GetIBSize - { - get { return m_indexBufferSize; } - } - - // Vertices and indices used for collision detection - [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct MyCompressedVertexNormal - { //8 + 4 bytes - public HalfVector4 Position; - public Byte4 Normal; - } - - // Vertices and indices used for collision detection - [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct MyVertexNormal - { //12 + 12 bytes - public Vector3 Position; - public Vector3 Normal; - } - -#if PACKED_VERTEX_FORMAT - private MyCompressedVertexNormal[] m_vertices; -#else - private MyVertexNormal[] m_vertices; -#endif - - private int[] m_Indicies = null; - private ushort[] m_Indicies_16bit = null; - - public MyTriangleVertexIndices[] Triangles; // Triangles specified by three indicies to "Vertex" list //TODO: Could be made readonly from the outside, and alterable only from the inside of this class - public Dictionary Dummies; - public MyModelInfo ModelInfo; - public MyTexture2D MaskTexture; - - /// - /// State of loading. - /// - private volatile LoadState m_loadState; - - /// - /// Gets or sets the state of the load. - /// - /// - /// The state of the load. - /// - public LoadState LoadState - { - get - { - return this.m_loadState; - } - internal set - { - this.m_loadState = value; - } - } - - public int GetVertexStride() - { - return m_vertexStride; - } - - public VertexDeclaration GetVertexDeclaration() - { - return m_vertexDeclaration; - } - - public Vector3 GetVertexInt(int vertexIndex) - { -#if PACKED_VERTEX_FORMAT - return VF_Packer.UnpackPosition(ref m_vertices[vertexIndex].Position); -#else - return m_vertices[vertexIndex].Position; -#endif - } - - public Vector3 GetVertex(int vertexIndex) - { - return GetVertexInt(vertexIndex); - } - - public void GetVertex(int vertexIndex1, int vertexIndex2, int vertexIndex3, out Vector3 v1, out Vector3 v2, out Vector3 v3) - { - v1 = GetVertex(vertexIndex1); - v2 = GetVertex(vertexIndex2); - v3 = GetVertex(vertexIndex3); - } - - public Vector3 GetVertexNormal(int vertexIndex) - { -#if PACKED_VERTEX_FORMAT - return VF_Packer.UnpackNormal(ref m_vertices[vertexIndex].Normal); -#else - return m_vertices[vertexIndex].Normal; -#endif - } - - public Vector3 GetVertexBinormal(int vertexIndex) - { -#if PACKED_VERTEX_FORMAT - return VF_Packer.UnpackNormal(ref m_forLoadingBinormals[vertexIndex]); -#else - return m_forLoadingBinormals[vertexIndex]; -#endif - } - - public Vector3 GetVertexTangent(int vertexIndex) - { -#if PACKED_VERTEX_FORMAT - return VF_Packer.UnpackNormal(ref m_forLoadingTangents[vertexIndex]); -#else - return m_forLoadingTangents[vertexIndex]; -#endif - } - - // Used only for loading and then disposed. It lives between LoadData and LoadInDraw... but that's OK because it's only during sector loading - // and I have to make it so because we can't load vertex/index buffers from other place than Draw call -#if PACKED_VERTEX_FORMAT - HalfVector2[] m_forLoadingTexCoords0; - HalfVector2[] m_forLoadingTexCoords1; - Byte4[] m_forLoadingBinormals; - Byte4[] m_forLoadingTangents; -#else - Vector2[] m_forLoadingTexCoords0; - Vector2[] m_forLoadingTexCoords1; - Vector3[] m_forLoadingBinormals; - Vector3[] m_forLoadingTangents; -#endif - - float m_specularShininess; - float m_specularPower; - float m_rescaleFactor; - bool m_useChannelTextures; - - // Bounding volumes - public BoundingSphere BoundingSphere; //TODO: Could be made readonly from the outside, and alterable only from the inside of this class - public BoundingBox BoundingBox; //TODO: Could be made readonly from the outside, and alterable only from the inside of this class - - // Size of the bounding box - public Vector3 BoundingBoxSize; //TODO: Could be made readonly from the outside, and alterable only from the inside of this class - public Vector3 BoundingBoxSizeHalf; //TODO: Could be made readonly from the outside, and alterable only from the inside of this class - - // Octree - IMyTriangePruningStructure m_bvh; - - readonly string m_assetName; - bool m_loadedData; - bool m_loadedContent; - - - public bool LoadedData - { - get { return m_loadedData; } - } - - public bool LoadedContent - { - get { return m_loadedContent; } - } - - List m_meshContainer = new List(); - - public bool UseChannels - { - get - { - return m_useChannelTextures && MyRenderConstants.RenderQualityProfile.UseChannels; - } - } - - // Create instance of a model, but doesn't really load the model from file to memory. Only remembers its definition. - // Data are loaded later using lazy-load mechanism - in LoadData or LoadInDraw - // Parameters of this constructor that are nullable aren't mandatory - that's why they are nullable. - // But they might be needed at some point of model's life, so think! - // E.g. if texture isn't specified, then it's not assigned to shader during rendering. Same for "shininess" and "specularPower" - // But models that use it should have null in all other texture parameters, because those textures won't be used. - // IMPORTANT: ASSERTS IN THIS CONSTRUCTOR SHOULD CHECK IF ALL REQUIRED PARAMETERS AND THEIR COMBINATIONS ARE FINE! - // BUT THE REALITY IS THAT I DON'T HAVE TIME TO ASSERT ALL POSSIBLE COMBINATIONS... - - public MyModel(string assetName, MyMeshDrawTechnique drawTechnique, MyModelsEnum modelEnum) - :this(assetName, drawTechnique, modelEnum, false) - { - } - - /// - /// c-tor - this constructor should be used just for max models - not voxels! - /// - /// - /// - /// - /// - public MyModel(string assetName, MyMeshDrawTechnique drawTechnique, MyModelsEnum modelEnum, bool keepInMemory) - { - m_assetName = assetName; - m_loadedData = false; - m_loadedContent = false; - ModelEnum = modelEnum; - m_drawTechnique = drawTechnique; - KeepInMemory = keepInMemory; - - string absFilePath = Directory.GetCurrentDirectory() + "\\Content\\" + m_assetName + ".mwm"; - System.Diagnostics.Debug.Assert(File.Exists(absFilePath), "Model data for " + m_assetName + " does not exists!"); - - LoadState = Managers.LoadState.Unloaded; - } - - /// - /// Use brain w - /// - /// - public List GetMeshList() - { - return m_meshContainer; - } - - - // Sort of lazy-load, where constructor just saves information about what this model should be, but real load is done here - and only one time. - // This loads only vertex data, doesn't touch GPU - // Can be called from main and background thread - public void LoadData() - { - if (m_loadedData) return; - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyModel::LoadData"); - - - MyMwcLog.WriteLine("MyModel.LoadData -> START", LoggingOptions.LOADING_MODELS); - MyMwcLog.IncreaseIndent(LoggingOptions.LOADING_MODELS); - - MyMwcLog.WriteLine("m_assetName: " + m_assetName, LoggingOptions.LOADING_MODELS); - - // Read data from model TAG parameter. There are stored vertex positions, triangle indices, vectors, ... everything we need. - string absFilePath = Directory.GetCurrentDirectory() + "\\Content\\" + m_assetName + ".mwm"; - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("Model - load data - import data"); - - - - MyMwcLog.WriteLine(String.Format("Importing asset {0}, path: {1}", m_assetName, absFilePath), LoggingOptions.LOADING_MODELS); - try - { - m_exporter.ImportData(absFilePath); - } - catch (Exception e) - { - MyMwcLog.WriteLine(String.Format("Importing asset failed {0}, message: {1}, stack:{2}", m_assetName, e.Message, e.StackTrace)); - } - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("Model - load data - load tag data"); - Dictionary tagData = m_exporter.GetTagData(); - if (tagData.Count == 0) - { - throw new Exception(String.Format("Uncompleted tagData for asset: {0}, path: {1}", m_assetName, absFilePath)); - } - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("Model - load data - vertex, normals, texture coords"); - - -#if PACKED_VERTEX_FORMAT - HalfVector4[] vertices = (HalfVector4[])tagData[MyImporterConstants.TAG_VERTICES]; - - System.Diagnostics.Debug.Assert(vertices.Length > 0); - - Byte4[] normals = (Byte4[])tagData[MyImporterConstants.TAG_NORMALS]; - m_vertices = new MyCompressedVertexNormal[vertices.Length]; - if (normals.Length > 0) - { - for (int v = 0; v < vertices.Length; v++) - { - m_vertices[v] = new MyCompressedVertexNormal() - { - Position = vertices[v],// VF_Packer.PackPosition(ref vertices[v]), - Normal = normals[v]//VF_Packer.PackNormalB4(ref normals[v]) - }; - } - } - else - { - for (int v = 0; v < vertices.Length; v++) - { - m_vertices[v] = new MyCompressedVertexNormal() - { - Position = vertices[v],// VF_Packer.PackPosition(ref vertices[v]), - }; - } - } -#else - Vector3[] vertices = (Vector3[])tagData[MyImporterConstants.TAG_VERTICES]; - Vector3[] normals = (Vector3[])tagData[MyImporterConstants.TAG_NORMALS]; - m_vertices = new MyVertexNormal[vertices.Length]; - for (int v = 0; v < vertices.Length; v++) - { - m_vertices[v] = new MyVertexNormal() - { - Position = vertices[v], - Normal = normals[v] - }; - } -#endif - - m_verticesCount = vertices.Length; - -#if PACKED_VERTEX_FORMAT - HalfVector2[] forLoadingTexCoords0 = (HalfVector2[])tagData[MyImporterConstants.TAG_TEXCOORDS0]; - m_forLoadingTexCoords0 = new HalfVector2[forLoadingTexCoords0.Length]; - for (int t = 0; t < forLoadingTexCoords0.Length; t++) - { - m_forLoadingTexCoords0[t] = forLoadingTexCoords0[t];// new HalfVector2(forLoadingTexCoords0[t]); - } -#else - Vector2[] forLoadingTexCoords0 = (Vector2[])tagData[MyImporterConstants.TAG_TEXCOORDS0]; - m_forLoadingTexCoords0 = new Vector2[forLoadingTexCoords0.Length]; - for (int t = 0; t < forLoadingTexCoords0.Length; t++) - { - m_forLoadingTexCoords0[t] = forLoadingTexCoords0[t]; - } -#endif - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("Model - load data - mesh"); - m_meshContainer.Clear(); - - if (tagData.ContainsKey(MyImporterConstants.TAG_MESH_PARTS)) - { - List indices = new List(GetVerticesCount()); // Default capacity estimation - int maxIndex = 0; - - List meshes = tagData[MyImporterConstants.TAG_MESH_PARTS] as List; - foreach (MyMeshPartInfo meshPart in meshes) - { - MyMesh mesh = new MyMesh(meshPart, m_assetName); - - mesh.IndexStart = indices.Count; - mesh.TriCount = meshPart.m_Indicies.Count / 3; - - System.Diagnostics.Debug.Assert(mesh.TriCount > 0); - - foreach(var i in meshPart.m_Indicies) - { - indices.Add(i); - if(i > maxIndex) - { - maxIndex = i; - } - } - - m_meshContainer.Add(mesh); - } - - if (maxIndex <= ushort.MaxValue) - { - // create 16 bit indices - m_Indicies_16bit = new ushort[indices.Count]; - for (int i = 0; i < indices.Count; i++) - { - m_Indicies_16bit[i] = (ushort)indices[i]; - } - } - else - { - // use 32bit indices - m_Indicies = indices.ToArray(); - } - } - - if (tagData.ContainsKey(MyImporterConstants.TAG_MODEL_BVH)) - { - m_bvh = new MyQuantizedBvhAdapter(tagData[MyImporterConstants.TAG_MODEL_BVH] as GImpactQuantizedBvh, this); - } - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("Model - load data - other data"); - if (MyRenderConstants.RenderQualityProfile.UseNormals) - { - -#if PACKED_VERTEX_FORMAT - Byte4[] forLoadingBinormals = (Byte4[])tagData[MyImporterConstants.TAG_BINORMALS]; - Byte4[] forLoadingTangents = (Byte4[])tagData[MyImporterConstants.TAG_TANGENTS]; - m_forLoadingBinormals = new Byte4[forLoadingBinormals.Length]; - m_forLoadingTangents = new Byte4[forLoadingBinormals.Length]; - - for (int v = 0; v < forLoadingBinormals.Length; v++) - { - m_forLoadingBinormals[v] = forLoadingBinormals[v];// VF_Packer.PackNormalB4(ref forLoadingBinormals[v]); - m_forLoadingTangents[v] = forLoadingTangents[v];//VF_Packer.PackNormalB4(ref forLoadingTangents[v]); - } -#else - Vector3[] forLoadingBinormals = (Vector3[])tagData[MyImporterConstants.TAG_BINORMALS]; - Vector3[] forLoadingTangents = (Vector3[])tagData[MyImporterConstants.TAG_TANGENTS]; - m_forLoadingBinormals = new Vector3[forLoadingBinormals.Length]; - m_forLoadingTangents = new Vector3[forLoadingBinormals.Length]; - - for (int v = 0; v < forLoadingBinormals.Length; v++) - { - m_forLoadingBinormals[v] = forLoadingBinormals[v]; - m_forLoadingTangents[v] = forLoadingTangents[v]; - } -#endif - } - - m_specularShininess = (float)tagData[MyImporterConstants.TAG_SPECULAR_SHININESS]; - m_specularPower = (float)tagData[MyImporterConstants.TAG_SPECULAR_POWER]; - m_rescaleFactor = (float)tagData[MyImporterConstants.TAG_RESCALE_FACTOR]; - - m_useChannelTextures = (bool)tagData[MyImporterConstants.TAG_USE_CHANNEL_TEXTURES]; - if (m_useChannelTextures) - { - -#if PACKED_VERTEX_FORMAT - HalfVector2[] forLoadingTexCoords1 = (HalfVector2[])tagData[MyImporterConstants.TAG_TEXCOORDS1]; - System.Diagnostics.Debug.Assert(forLoadingTexCoords1.Length > 0); - m_forLoadingTexCoords1 = new HalfVector2[forLoadingTexCoords1.Length]; - for (int t = 0; t < forLoadingTexCoords1.Length; t++) - { - m_forLoadingTexCoords1[t] = forLoadingTexCoords1[t];// new HalfVector2(forLoadingTexCoords1[t]); - } -#else - Vector2[] forLoadingTexCoords1 = (Vector2[])tagData[MyImporterConstants.TAG_TEXCOORDS1]; - System.Diagnostics.Debug.Assert(forLoadingTexCoords1.Length > 0); - m_forLoadingTexCoords1 = new Vector2[forLoadingTexCoords1.Length]; - for (int t = 0; t < forLoadingTexCoords1.Length; t++) - { - m_forLoadingTexCoords1[t] = forLoadingTexCoords1[t]; - } -#endif - } - - BoundingBox = (BoundingBox)tagData[MyImporterConstants.TAG_BOUNDING_BOX]; - BoundingSphere = (BoundingSphere)tagData[MyImporterConstants.TAG_BOUNDING_SPHERE]; - BoundingBoxSize = BoundingBox.Max - BoundingBox.Min; - BoundingBoxSizeHalf = BoundingBoxSize / 2.0f; - Dummies = tagData[MyImporterConstants.TAG_DUMMIES] as Dictionary; - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); - - - foreach (MyMesh mesh in m_meshContainer) - { - for (int i = 0; i < mesh.Materials.Length; i++) - { - MyMeshMaterial material = mesh.Materials[i]; - - if (Dummies.ContainsKey(material.MaterialName)) - { - MyModelDummy dummy = Dummies[material.MaterialName]; - - material.DiffuseUVAnim = new Vector2( - MyUtils.ReadSingleSafe((string)dummy.CustomData["DiffuseU"]), - MyUtils.ReadSingleSafe((string)dummy.CustomData["DiffuseV"]) - ); - - material.EmissiveUVAnim = new Vector2( - MyUtils.ReadSingleSafe((string)dummy.CustomData["EmissiveU"]), - MyUtils.ReadSingleSafe((string)dummy.CustomData["EmissiveV"]) - ); - } - } - } - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("Model - load data - copy triangle indices"); - // Prepare data - CopyTriangleIndices(); - m_trianglesCount = Triangles.Count(); - - //m_effect = MyModels.GetEffectForDrawTechnique(m_drawTechnique); - - // Remember this numbers as list may be cleared at the end of this method - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); - - MyMwcLog.WriteLine("Triangles.Length: " + Triangles.Length, LoggingOptions.LOADING_MODELS); - MyMwcLog.WriteLine("Vertexes.Length: " + GetVerticesCount(), LoggingOptions.LOADING_MODELS); - MyMwcLog.WriteLine("Centered: " + (bool)tagData[MyImporterConstants.TAG_CENTERED], LoggingOptions.LOADING_MODELS); - MyMwcLog.WriteLine("UseChannelTextures: " + (bool)tagData[MyImporterConstants.TAG_USE_CHANNEL_TEXTURES], LoggingOptions.LOADING_MODELS); - MyMwcLog.WriteLine("Length in meters: " + (float)tagData[MyImporterConstants.TAG_LENGTH_IN_METERS], LoggingOptions.LOADING_MODELS); - MyMwcLog.WriteLine("Rescale to length in meters?: " + (bool)tagData[MyImporterConstants.TAG_RESCALE_TO_LENGTH_IN_METERS], LoggingOptions.LOADING_MODELS); - MyMwcLog.WriteLine("SpecularShininess: " + m_specularShininess, LoggingOptions.LOADING_MODELS); - MyMwcLog.WriteLine("SpecularPower: " + m_specularPower, LoggingOptions.LOADING_MODELS); - MyMwcLog.WriteLine("RescaleFactor: " + m_rescaleFactor, LoggingOptions.LOADING_MODELS); - MyMwcLog.WriteLine("BoundingBox: " + BoundingBox, LoggingOptions.LOADING_MODELS); - MyMwcLog.WriteLine("BoundingSphere: " + BoundingSphere, LoggingOptions.LOADING_MODELS); - - MyPerformanceCounter.PerAppLifetime.MyModelsCount++; - MyPerformanceCounter.PerAppLifetime.MyModelsMeshesCount += m_meshContainer.Count; - MyPerformanceCounter.PerAppLifetime.MyModelsVertexesCount += GetVerticesCount(); - MyPerformanceCounter.PerAppLifetime.MyModelsTrianglesCount += Triangles.Length; - - //MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("Model - load data - octree"); - //// Create octree for fast line intersections. - //// IMPORTANT: This can be calculated only after we know bounding box and vertex/triangleVertexes arrays are filled - //m_octree = new MyModelOctree(this); - //MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); - - // Preload octree & bvh - //var before = System.GC.GetTotalMemory(true); - //DateTime beforeTime = DateTime.Now; - //GetOctree(); - //MyPerformanceCounter.PerAppLifetime.MyModelsOctreeLoadTime += (DateTime.Now - beforeTime); - //var after = System.GC.GetTotalMemory(true); - //MyPerformanceCounter.PerAppLifetime.MyModelsOctreeSizeB += (after - before); - - //var before2 = System.GC.GetTotalMemory(true); - //DateTime beforeTime2 = DateTime.Now; - //GetBvh(); - //MyPerformanceCounter.PerAppLifetime.MyModelsBvhLoadTime += (DateTime.Now - beforeTime2); - //var after2 = System.GC.GetTotalMemory(true); - //MyPerformanceCounter.PerAppLifetime.MyModelsBvhSizeB += (after2 - before2); - - //tempContentManagerForModelOnly.Unload(); - - ModelInfo = new MyModelInfo(GetTrianglesCount(), GetVerticesCount(), BoundingBoxSize); - - m_loadedData = true; - - MyMwcLog.DecreaseIndent(LoggingOptions.LOADING_MODELS); - MyMwcLog.WriteLine("MyModel.LoadData -> END", LoggingOptions.LOADING_MODELS); - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); - } - - - // - // - public void LoadContent() - { - //If model was loaded previously, we need it reload because it has some temporary data discarded - //otherwise model wont load after device reset - // We must also reload when binormals or tangents are missing. - /* - if (m_loadedData && (m_forLoadingTexCoords0 == null || m_forLoadingBinormals == null || m_forLoadingTangents == null || m_meshContainer.Count == 0)) - { - m_loadedData = false; - LoadData(); - } */ - - LoadInDraw(); - - - } - - - - private void CreateRenderDataForMesh() - { - // Creating vertex and index buffer - // Write to GPU - CreateVertexBuffer(); - CreateIndexBuffer(); - - // We don't need this anymore - we need it for merging geometry - // Cleaning up lists - /* - m_forLoadingTexCoords0 = null; - m_forLoadingTexCoords1 = null; - m_forLoadingBinormals = null; - m_forLoadingTangents = null; - */ - - // Cleaning normals if we do not need vertex normal debug drawing - // if (!MyMwcFinalBuildConstants.ENABLE_VERTEX_NORMALS_DEBUG_DRAW) - // m_VertexNormals = null; - } - - // Loads vertex/index buffers and textures, access GPU - // Should be called only from Draw method on main thread - public void LoadInDraw(LoadingMode loadingMode = LoadingMode.Immediate) - { - // If already loaded into GPU - if (m_loadedContent) return; - - // If this model wasn't loaded through lazy-load then it means we don't need it in this game/sector, and we - // don't need to load him into GPU - if (m_loadedData == false) return; - - if (LoadState == Managers.LoadState.Loading) - return; - - if (loadingMode == LoadingMode.Background) - { - MyModels.LoadModelInDrawInBackground(this); - return; - } - - - Debug.Assert(m_forLoadingTexCoords0 != null && m_meshContainer.Count != 0, "Somebody forget to call LoadData on model before rendering"); - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyModel::LoadInDraw"); - - if (m_useChannelTextures) - { - MaskTexture = MyTextureManager.GetTexture(m_assetName + C_POSTFIX_MASK, null, LoadingMode.LazyBackground); - } - - - - // Creating - CreateRenderDataForMesh(); - - - m_loadedContent = true; - - LoadState = Managers.LoadState.Loaded; - - MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); - } - - void CreateVertexBuffer() - { - // Create vertex buffer - vertex format type depends on draw technique - - switch (m_drawTechnique) - { - case MyMeshDrawTechnique.MESH: - case MyMeshDrawTechnique.DECAL: - case MyMeshDrawTechnique.HOLO: - case MyMeshDrawTechnique.ALPHA_MASKED: - { - if (m_forLoadingTexCoords0 == null) throw new Exception("Model '" + m_assetName + "' doesn't have texture channel 0 specified, but this shader requires it"); - - if (m_forLoadingTexCoords0.Length == 0) - { - MyVertexFormatPosition[] vertexArray = new MyVertexFormatPosition[GetVerticesCount()]; - for (int i = 0; i < GetVerticesCount(); i++) - { - Vector4 pos = m_vertices[i].Position.ToVector4(); - vertexArray[i].Position = new Vector3(pos.X, pos.Y, pos.Z); - } - - m_vertexDeclaration = MyVertexFormatPosition.VertexDeclaration; - m_vertexStride = MyVertexFormatPosition.Stride; - m_vertexBufferSize = vertexArray.Length * m_vertexStride; - m_vertexBuffer = new VertexBuffer(MyMinerGame.Static.GraphicsDevice, m_vertexBufferSize, Usage.WriteOnly, VertexFormat.None, Pool.Default); - m_vertexBuffer.Lock(0, 0, LockFlags.None).WriteRange(vertexArray); - m_vertexBuffer.Unlock(); - m_vertexBuffer.Tag = this; - } - else - if (MyRenderConstants.RenderQualityProfile.UseNormals) - { - if (m_forLoadingBinormals == null) - throw new Exception("Model '" + m_assetName + "' doesn't have binormals calculated, but this shader requires them"); - if (m_forLoadingTangents == null) - throw new Exception("Model '" + m_assetName + "' doesn't have tangent vectors calculated, but this shader requires them"); - - if (UseChannels) - { - if (m_forLoadingTexCoords1 == null || m_forLoadingTexCoords1.Length == 0) - { - throw new Exception("Model '" + m_assetName + "' doesn't have UVcoords1 calculated, but this shader requires them"); - } - - MyVertexFormatPositionNormalTextureTangentBinormalMask[] vertexArray = new MyVertexFormatPositionNormalTextureTangentBinormalMask[GetVerticesCount()]; - for (int i = 0; i < GetVerticesCount(); i++) - { -#if PACKED_VERTEX_FORMAT - vertexArray[i].PositionPacked = m_vertices[i].Position; - vertexArray[i].NormalPacked = m_vertices[i].Normal; - vertexArray[i].TexCoordPacked = m_forLoadingTexCoords0[i]; - vertexArray[i].BinormalPacked = m_forLoadingBinormals[i]; - vertexArray[i].TangentPacked = m_forLoadingTangents[i]; - vertexArray[i].MaskCoordPacked = m_forLoadingTexCoords1[i]; -#else - vertexArray[i].Position = m_vertices[i].Position; - vertexArray[i].Normal = m_vertices[i].Normal; - vertexArray[i].TexCoord = m_forLoadingTexCoords0[i]; - vertexArray[i].Binormal = m_forLoadingBinormals[i]; - vertexArray[i].Tangent = m_forLoadingTangents[i]; - vertexArray[i].MaskCoord = m_forLoadingTexCoords1[i]; - -#endif - } - - m_vertexDeclaration = MyVertexFormatPositionNormalTextureTangentBinormalMask.VertexDeclaration; - m_vertexStride = MyVertexFormatPositionNormalTextureTangentBinormalMask.Stride; - m_vertexBufferSize = vertexArray.Length * m_vertexStride; - m_vertexBuffer = new VertexBuffer(MyMinerGame.Static.GraphicsDevice, m_vertexBufferSize, Usage.WriteOnly, VertexFormat.None, Pool.Default); - m_vertexBuffer.Lock(0, 0, LockFlags.None).WriteRange(vertexArray); - m_vertexBuffer.Unlock(); - m_vertexBuffer.Tag = this; - } - else - { - MyVertexFormatPositionNormalTextureTangentBinormal[] vertexArray = new MyVertexFormatPositionNormalTextureTangentBinormal[GetVerticesCount()]; - for (int i = 0; i < GetVerticesCount(); i++) - { -#if PACKED_VERTEX_FORMAT - vertexArray[i].PositionPacked = m_vertices[i].Position; - vertexArray[i].NormalPacked = m_vertices[i].Normal; - vertexArray[i].TexCoordPacked = m_forLoadingTexCoords0[i]; - vertexArray[i].BinormalPacked = m_forLoadingBinormals[i]; - vertexArray[i].TangentPacked = m_forLoadingTangents[i]; -#else - vertexArray[i].Position = m_vertices[i].Position; - vertexArray[i].Normal = m_vertices[i].Normal; - vertexArray[i].TexCoord = m_forLoadingTexCoords0[i]; - vertexArray[i].Binormal = m_forLoadingBinormals[i]; - vertexArray[i].Tangent = m_forLoadingTangents[i]; -#endif - } - - m_vertexDeclaration = MyVertexFormatPositionNormalTextureTangentBinormal.VertexDeclaration; - m_vertexStride = MyVertexFormatPositionNormalTextureTangentBinormal.Stride; - m_vertexBufferSize = vertexArray.Length * m_vertexStride; - m_vertexBuffer = new VertexBuffer(MyMinerGame.Static.GraphicsDevice, m_vertexBufferSize, Usage.WriteOnly, VertexFormat.None, Pool.Default); - m_vertexBuffer.Lock(0, 0, LockFlags.None).WriteRange(vertexArray); - m_vertexBuffer.Unlock(); - m_vertexBuffer.Tag = this; - } - } - else - { - if (UseChannels) - { - MyVertexFormatPositionNormalTextureMask[] vertexArray = new MyVertexFormatPositionNormalTextureMask[GetVerticesCount()]; - for (int i = 0; i < GetVerticesCount(); i++) - { -#if PACKED_VERTEX_FORMAT - vertexArray[i].PositionPacked = m_vertices[i].Position; - vertexArray[i].NormalPacked = m_vertices[i].Normal; - vertexArray[i].TexCoordPacked = m_forLoadingTexCoords0[i]; - vertexArray[i].MaskCoordPacked = m_forLoadingTexCoords1[i]; -#else - vertexArray[i].Position = m_vertices[i].Position; - vertexArray[i].Normal = m_vertices[i].Normal; - vertexArray[i].TexCoord = m_forLoadingTexCoords0[i]; - vertexArray[i].MaskCoord = m_forLoadingTexCoords1[i]; -#endif - } - - m_vertexDeclaration = MyVertexFormatPositionNormalTextureMask.VertexDeclaration; - m_vertexStride = MyVertexFormatPositionNormalTextureMask.Stride; - m_vertexBufferSize = vertexArray.Length * m_vertexStride; - m_vertexBuffer = new VertexBuffer(MyMinerGame.Static.GraphicsDevice, m_vertexBufferSize, Usage.WriteOnly, VertexFormat.None, Pool.Default); - m_vertexBuffer.Lock(0, 0, LockFlags.None).WriteRange(vertexArray); - m_vertexBuffer.Unlock(); - m_vertexBuffer.Tag = this; - } - else - { - MyVertexFormatPositionNormalTexture[] vertexArray = new MyVertexFormatPositionNormalTexture[GetVerticesCount()]; - for (int i = 0; i < GetVerticesCount(); i++) - { - vertexArray[i].Position = GetVertexInt(i); - vertexArray[i].Normal = GetVertexNormal(i); -#if PACKED_VERTEX_FORMAT - vertexArray[i].TexCoord = m_forLoadingTexCoords0[i].ToVector2(); -#else - vertexArray[i].TexCoord = m_forLoadingTexCoords0[i]; -#endif - } - - m_vertexDeclaration = MyVertexFormatPositionNormalTexture.VertexDeclaration; - m_vertexStride = MyVertexFormatPositionNormalTexture.Stride; - m_vertexBufferSize = vertexArray.Length * m_vertexStride; - m_vertexBuffer = new VertexBuffer(MyMinerGame.Static.GraphicsDevice, m_vertexBufferSize, Usage.WriteOnly , VertexFormat.None, Pool.Default); - m_vertexBuffer.Lock(0, 0, LockFlags.None).WriteRange(vertexArray); - m_vertexBuffer.Unlock(); - m_vertexBuffer.Tag = this; - } - } - } - break; - - case MyMeshDrawTechnique.VOXELS_DEBRIS: - case MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID: - { - MyVertexFormatPositionNormal[] vertexArray = new MyVertexFormatPositionNormal[GetVerticesCount()]; - for (int i = 0; i < GetVerticesCount(); i++) - { - vertexArray[i].Position = GetVertexInt(i); - vertexArray[i].Normal = GetVertexNormal(i); - } - - m_vertexDeclaration = MyVertexFormatPositionNormal.VertexDeclaration; - m_vertexStride = MyVertexFormatPositionNormal.Stride; - m_vertexBufferSize = vertexArray.Length * m_vertexStride; - m_vertexBuffer = new VertexBuffer(MyMinerGame.Static.GraphicsDevice, m_vertexBufferSize, Usage.WriteOnly, VertexFormat.None, Pool.Default); - m_vertexBuffer.Lock(0, 0, LockFlags.None).WriteRange(vertexArray); - m_vertexBuffer.Unlock(); - m_vertexBuffer.Tag = this; - } - break; - default: - { - throw new MyMwcExceptionApplicationShouldNotGetHere(); - } - } - - MyPerformanceCounter.PerAppLifetime.ModelVertexBuffersSize += m_vertexBufferSize; - - SignResource(m_vertexBuffer); - } - - void CreateIndexBuffer() - { - MyCommonDebugUtils.AssertDebug(m_indexBuffer == null); - - if (m_Indicies != null) - { - m_indexBuffer = new IndexBuffer(MyMinerGame.Static.GraphicsDevice, m_Indicies.Length * sizeof(int), Usage.WriteOnly, Pool.Default, false); - m_indexBuffer.Lock(0, 0, LockFlags.None).WriteRange(m_Indicies); - m_indexBuffer.Unlock(); - m_indexBuffer.Tag = this; - m_indexBufferSize = m_Indicies.Length * sizeof(int); - } - else if (m_Indicies_16bit != null) - { - m_indexBuffer = new IndexBuffer(MyMinerGame.Static.GraphicsDevice, m_Indicies_16bit.Length * sizeof(short), Usage.WriteOnly, Pool.Default, true); - m_indexBuffer.Lock(0, 0, LockFlags.None).WriteRange(m_Indicies_16bit); - m_indexBuffer.Unlock(); - m_indexBuffer.Tag = this; - m_indexBufferSize = m_Indicies_16bit.Length * sizeof(short); - } - - MyPerformanceCounter.PerAppLifetime.ModelIndexBuffersSize += m_indexBufferSize; - - SignResource(m_indexBuffer); - } - - /// - /// Signs the resource. - /// - /// The index buffer. - [Conditional("DEBUG")] - private void SignResource(IndexBuffer indexBuffer) - { - indexBuffer.DebugName = m_assetName + "_ib"; - } - - bool IsMeshGoingToBeAddedIntoTrianglesArray(MyMesh mesh) - { - return MyMeshPartInfo.IsPhysical(mesh.Materials[0].DrawTechnique); - } - - int GetNumberOfTrianglesForColDet() - { - int trianglesCount = 0; - foreach (MyMesh mesh in m_meshContainer) - { - if (IsMeshGoingToBeAddedIntoTrianglesArray(mesh)) - { - trianglesCount += mesh.TriCount; - } - } - return trianglesCount; - } - - void CopyTriangleIndices() - { - Triangles = new MyTriangleVertexIndices[GetNumberOfTrianglesForColDet()]; - int triangleIndex = 0; - - foreach (MyMesh mesh in m_meshContainer) - { - if (IsMeshGoingToBeAddedIntoTrianglesArray(mesh)) - { - if (m_Indicies != null) - { - for (int i = 0; i < mesh.TriCount; i++) - { - // Notice we swap indices. It's because XNA's clock-wise rule probably differs from FBX's, and JigLib needs it in this order. - // But because of this, I did similar swaping in my col/det functions - Triangles[triangleIndex] = new MyTriangleVertexIndices(m_Indicies[mesh.IndexStart + i * 3 + 0], m_Indicies[mesh.IndexStart + i * 3 + 2], m_Indicies[mesh.IndexStart + i * 3 + 1]); - triangleIndex++; - } - } - else if (m_Indicies_16bit != null) - { - for (int i = 0; i < mesh.TriCount; i++) - { - // Notice we swap indices. It's because XNA's clock-wise rule probably differs from FBX's, and JigLib needs it in this order. - // But because of this, I did similar swaping in my col/det functions - Triangles[triangleIndex] = new MyTriangleVertexIndices(m_Indicies_16bit[mesh.IndexStart + i * 3 + 0], m_Indicies_16bit[mesh.IndexStart + i * 3 + 2], m_Indicies_16bit[mesh.IndexStart + i * 3 + 1]); - triangleIndex++; - } - } - else throw new MyMwcExceptionApplicationShouldNotGetHere(); // Neither 32bit or 16bit indices are set, probably already called mesh.DisposeIndices() - } - } - - // No need to store indices anymore - //m_Indicies = null; - //m_Indicies_16bit = null; - - // Validate this new array, if size is correct and if all indices are OK - MyCommonDebugUtils.AssertDebug(triangleIndex == Triangles.Length); - foreach (MyTriangleVertexIndices triangle in Triangles) - { - MyCommonDebugUtils.AssertDebug(triangle.I0 != triangle.I1); - MyCommonDebugUtils.AssertDebug(triangle.I1 != triangle.I2); - MyCommonDebugUtils.AssertDebug(triangle.I2 != triangle.I0); - MyCommonDebugUtils.AssertDebug((triangle.I0 >= 0) && (triangle.I0 < GetVerticesCount())); - MyCommonDebugUtils.AssertDebug((triangle.I1 >= 0) && (triangle.I1 < GetVerticesCount())); - MyCommonDebugUtils.AssertDebug((triangle.I2 >= 0) && (triangle.I2 < GetVerticesCount())); - } - } - - - private void UnloadTemporaryData() - { - m_forLoadingTexCoords0 = null; - m_forLoadingTexCoords1 = null; - m_forLoadingBinormals = null; - m_forLoadingTangents = null; - } - - public bool UnloadData() - { - if (m_loadedContent) - UnloadContent(); - - UnloadTemporaryData(); - - bool res = m_loadedData; - m_loadedData = false; - if (m_bvh != null) - { - m_bvh.Close(); - m_bvh = null; - } - LoadState = Managers.LoadState.Unloaded; - - MyPerformanceCounter.PerAppLifetime.MyModelsMeshesCount -= m_meshContainer.Count; - if (m_vertices != null) - MyPerformanceCounter.PerAppLifetime.MyModelsVertexesCount -= GetVerticesCount(); - if (Triangles != null) - MyPerformanceCounter.PerAppLifetime.MyModelsTrianglesCount -= Triangles.Length; - if (res) - MyPerformanceCounter.PerAppLifetime.MyModelsCount--; - - m_vertices = null; - Triangles = null; - m_meshContainer.Clear(); - m_Indicies_16bit = null; - m_Indicies = null; - - return res; - } - - public void UnloadContent() - { - //MyPerformanceCounter.PerAppLifetime.MyModelsCount--; - - if (m_vertexBuffer != null) - { - m_vertexBuffer.Dispose(); - m_vertexBuffer = null; - MyPerformanceCounter.PerAppLifetime.ModelVertexBuffersSize -= m_vertexBufferSize; - m_vertexBufferSize = 0; - } - - if (m_indexBuffer != null) - { - m_indexBuffer.Dispose(); - m_indexBuffer = null; - MyPerformanceCounter.PerAppLifetime.ModelIndexBuffersSize -= m_indexBufferSize; - m_indexBufferSize = 0; - } - - LoadState = Managers.LoadState.Unloaded; - - //foreach (MyMesh mesh in m_meshContainer) - //{ - // mesh.DisposeBuffers(); //index - //} - - //m_meshContainer.Clear();// added for LoadContent purpose this will cause whole mesh to reload - - m_loadedContent = false; - } - - public MyModelsEnum GetModelEnum() - { - return ModelEnum; - } - - public IMyTriangePruningStructure GetTrianglePruningStructure() - { - Debug.Assert(m_bvh != null, "BVH should be loaded from content processor"); - return m_bvh; - } - - public void GetTriangleBoundingBox(int triangleIndex, ref BoundingBox boundingBox) - { - boundingBox = BoundingBoxHelper.InitialBox; - Vector3 v1, v2, v3; - GetVertex(Triangles[triangleIndex].I0, Triangles[triangleIndex].I1, Triangles[triangleIndex].I2, out v1, out v2, out v3); - - BoundingBoxHelper.AddTriangle(ref boundingBox, - v1, - v2, - v3); - } - - public int GetTrianglesCount() - { - return m_trianglesCount; - } - - public int GetVerticesCount() - { - return m_verticesCount; - } - - public int GetBVHSize() - { - return m_bvh != null ? m_bvh.Size : 0; - } - - public MyMeshDrawTechnique GetDrawTechnique() - { - return m_drawTechnique; - } - - public void SetDrawTechnique(MyMeshDrawTechnique drawTechnique) - { - m_drawTechnique = drawTechnique; - } - - public float GetSpecularShininess() - { - return m_specularShininess; - } - - public float GetSpecularPower() - { - return m_specularPower; - } - - public float GetRescaleFactor() - { - return m_rescaleFactor; - } - - - /// - /// Render - /// - /// - public void Render() - { - Device device = MyMinerGame.Static.GraphicsDevice; - device.SetStreamSource(0, m_vertexBuffer, 0, m_vertexStride); - device.Indices = m_indexBuffer; - device.VertexDeclaration = GetVertexDeclaration(); - - foreach (MyMesh mesh in m_meshContainer) - { - mesh.Render(device, m_verticesCount); - } - } - - /// - /// Dispose - /// - public void Dispose() - { - m_meshContainer.Clear(); - m_vertexBuffer.Dispose(); - m_vertexBuffer = null; - MyPerformanceCounter.PerAppLifetime.ModelVertexBuffersSize -= m_vertexBufferSize; - m_vertexBufferSize = 0; - - m_indexBuffer.Dispose(); - m_indexBuffer = null; - MyPerformanceCounter.PerAppLifetime.ModelIndexBuffersSize -= m_indexBufferSize; - m_indexBufferSize = 0; - } - - /// - /// File path of the model - /// - internal string AssetName - { - get { return m_assetName; } - } - - internal VertexBuffer VertexBuffer - { - get { return m_vertexBuffer; } - } - - internal IndexBuffer IndexBuffer - { - get { return m_indexBuffer; } - } - - /// - /// Signs the resource. - /// - /// The vertex buffer. - [Conditional("DEBUG")] - private void SignResource(VertexBuffer vertexBuffer) - { - vertexBuffer.DebugName = m_assetName + "_vb"; - } - - // Load only snappoints. - public void LoadOnlyDummies() - { - if (!m_loadedData) - { - MyMwcLog.WriteLine("MyModel.LoadSnapPoints -> START", LoggingOptions.LOADING_MODELS); - MyMwcLog.IncreaseIndent(LoggingOptions.LOADING_MODELS); - - MyMwcLog.WriteLine("m_assetName: " + m_assetName, LoggingOptions.LOADING_MODELS); - - // Read data from model TAG parameter. There are stored vertex positions, triangle indices, vectors, ... everything we need. - string absFilePath = Directory.GetCurrentDirectory() + "\\Content\\" + m_assetName + ".mwm"; - - MyModelExporter exporter = new MyModelExporter(); - - MyMwcLog.WriteLine(String.Format("Importing asset {0}, path: {1}", m_assetName, absFilePath), LoggingOptions.LOADING_MODELS); - - // Read only TAG_DUMMIES data - SortedSet tags = new SortedSet(); - tags.Add(MyImporterConstants.TAG_DUMMIES); - - try - { - exporter.ImportCustomData(absFilePath, tags); - } - catch (Exception e) - { - MyMwcLog.WriteLine(String.Format("Importing asset failed {0}, message: {1}, stack:{2}", m_assetName, e.Message, e.StackTrace)); - } - - Dictionary tagData = exporter.GetTagData(); - //if (tagData.Count == 0) - //{ - // throw new Exception(String.Format("Uncompleted tagData for asset: {0}, path: {1}", m_assetName, absFilePath)); - //} - - //Dummies = tagData[MyImporterConstants.TAG_DUMMIES] as Dictionary; - if (tagData.Count > 0) - { - Dummies = tagData[MyImporterConstants.TAG_DUMMIES] as Dictionary; - } - else - { - Dummies = new Dictionary(); - } - } - } - - // Load only snappoints. - public void LoadOnlyModelInfo() - { - if (!m_loadedData) - { - MyMwcLog.WriteLine("MyModel.LoadModelData -> START", LoggingOptions.LOADING_MODELS); - MyMwcLog.IncreaseIndent(LoggingOptions.LOADING_MODELS); - - MyMwcLog.WriteLine("m_assetName: " + m_assetName, LoggingOptions.LOADING_MODELS); - - // Read data from model TAG parameter. There are stored vertex positions, triangle indices, vectors, ... everything we need. - string absFilePath = Directory.GetCurrentDirectory() + "\\Content\\" + m_assetName + ".mwm"; - - MyModelExporter exporter = new MyModelExporter(); - - MyMwcLog.WriteLine(String.Format("Importing asset {0}, path: {1}", m_assetName, absFilePath), LoggingOptions.LOADING_MODELS); - - // Read only TAG_DUMMIES data - SortedSet tags = new SortedSet(); - tags.Add(MyImporterConstants.TAG_MODEL_INFO); - - try - { - exporter.ImportCustomData(absFilePath, tags); - } - catch (Exception e) - { - MyMwcLog.WriteLine(String.Format("Importing asset failed {0}, message: {1}, stack:{2}", m_assetName, e.Message, e.StackTrace)); - } - - Dictionary tagData = exporter.GetTagData(); - - if (tagData.Count > 0) - { - ModelInfo = tagData[MyImporterConstants.TAG_MODEL_INFO] as MyModelInfo; - } - else - { - ModelInfo = new MyModelInfo(0, 0, Vector3.Zero); - } - } - } - - void IPrimitiveManagerBase.Cleanup() - { - //throw new NotImplementedException(); - } - - bool IPrimitiveManagerBase.IsTrimesh() - { - return true; - //throw new NotImplementedException(); - } - - int IPrimitiveManagerBase.GetPrimitiveCount() - { - return this.m_trianglesCount; - //throw new NotImplementedException(); - } - - void IPrimitiveManagerBase.GetPrimitiveBox(int prim_index, out AABB primbox) - { - BoundingBox bbox = BoundingBoxHelper.InitialBox; - Vector3 v1 = GetVertex(Triangles[prim_index].I0); - Vector3 v2 = GetVertex(Triangles[prim_index].I1); - Vector3 v3 = GetVertex(Triangles[prim_index].I2); - BoundingBoxHelper.AddTriangle(ref bbox, - ref v1, - ref v2, - ref v3); - - primbox = new AABB() { m_min = bbox.Min, m_max = bbox.Max }; - } - - void IPrimitiveManagerBase.GetPrimitiveTriangle(int prim_index, PrimitiveTriangle triangle) - { - triangle.m_vertices[0] = GetVertex(Triangles[prim_index].I0); - triangle.m_vertices[1] = GetVertex(Triangles[prim_index].I1); - triangle.m_vertices[2] = GetVertex(Triangles[prim_index].I2); - } - - public void PreloadTextures(LoadingMode loadingMode, int materialIndex = -1) - { - foreach (MyMesh mesh in GetMeshList()) - { - if (materialIndex == -1) - mesh.Materials[0].PreloadTexture(loadingMode); - else - mesh.Materials[materialIndex].PreloadTexture(loadingMode); - } - } - } -} +#region + +using System; +using System.Collections.Generic; +using System.Linq; +using MinerWars.AppCode.App; +using MinerWars.AppCode.Game.Managers; +using MinerWars.AppCode.Game.Utils; +using MinerWars.AppCode.Game.Utils.VertexFormats; +using MinerWars.AppCode.Physics; +using SysUtils.Utils; + +using MinerWars.AppCode.Game.Render; +using SysUtils; +using System.Diagnostics; +using System.IO; +using MinerWars.AppCode.Game.Textures; +using BulletXNA.BulletCollision; +using MinerWars.AppCode.Physics.Collisions; +using MinerWarsMath.Graphics.PackedVector; +using System.Runtime.InteropServices; + +//using MinerWarsMath; +//using MinerWarsMath.Graphics; + +using SharpDX; +using SharpDX.Direct3D9; +using SharpDX.Toolkit; +using SharpDX.Toolkit.Graphics; + +#endregion + +// Coordinate system transformation: +// 3DS MAX displays different coordinate system than XNA, plus when converting to FBX, it looks like it switches sign of Z values (Z in XNA way). +// So when thinking about converting coordinate system, this is it: +// XNA X = 3DSMAX X +// XNA Y = 3DSMAX Z +// XNA Z = NEGATIVE OF 3DSMAX Y + +namespace MinerWars.AppCode.Game.Models +{ + using Vector2 = MinerWarsMath.Vector2; + using Vector3 = MinerWarsMath.Vector3; + using Vector4 = MinerWarsMath.Vector4; + using Rectangle = MinerWarsMath.Rectangle; + using Matrix = MinerWarsMath.Matrix; + using Color = MinerWarsMath.Color; + using BoundingBox = MinerWarsMath.BoundingBox; + using BoundingSphere = MinerWarsMath.BoundingSphere; + using BoundingFrustum = MinerWarsMath.BoundingFrustum; + using MinerWars.CommonLIB.AppCode.Import; + + class MyModel : IDisposable, IPrimitiveManagerBase + { + private const string C_POSTFIX_MASK = "_m"; + + static MyModelExporter m_exporter = new MyModelExporter(); + + public readonly MyModelsEnum ModelEnum; + + public bool KeepInMemory { get; private set; } + + + MyMeshDrawTechnique m_drawTechnique; + VertexBuffer m_vertexBuffer = null; + IndexBuffer m_indexBuffer = null; + int m_verticesCount; + int m_trianglesCount; + int m_vertexBufferSize; + int m_indexBufferSize; + int m_vertexStride; + VertexDeclaration m_vertexDeclaration; + + public int GetVBSize + { + get { return m_vertexBufferSize; } + } + public int GetIBSize + { + get { return m_indexBufferSize; } + } + + // Vertices and indices used for collision detection + [StructLayout(LayoutKind.Sequential, Pack = 1)] + struct MyCompressedVertexNormal + { //8 + 4 bytes + public HalfVector4 Position; + public Byte4 Normal; + } + + // Vertices and indices used for collision detection + [StructLayout(LayoutKind.Sequential, Pack = 1)] + struct MyVertexNormal + { //12 + 12 bytes + public Vector3 Position; + public Vector3 Normal; + } + +#if PACKED_VERTEX_FORMAT + private MyCompressedVertexNormal[] m_vertices; +#else + private MyVertexNormal[] m_vertices; +#endif + + private int[] m_Indicies = null; + private ushort[] m_Indicies_16bit = null; + + public MyTriangleVertexIndices[] Triangles; // Triangles specified by three indicies to "Vertex" list //TODO: Could be made readonly from the outside, and alterable only from the inside of this class + public Dictionary Dummies; + public MyModelInfo ModelInfo; + public MyTexture2D MaskTexture; + + /// + /// State of loading. + /// + private volatile LoadState m_loadState; + + /// + /// Gets or sets the state of the load. + /// + /// + /// The state of the load. + /// + public LoadState LoadState + { + get + { + return this.m_loadState; + } + internal set + { + this.m_loadState = value; + } + } + + public int GetVertexStride() + { + return m_vertexStride; + } + + public VertexDeclaration GetVertexDeclaration() + { + return m_vertexDeclaration; + } + + public Vector3 GetVertexInt(int vertexIndex) + { +#if PACKED_VERTEX_FORMAT + return VF_Packer.UnpackPosition(ref m_vertices[vertexIndex].Position); +#else + return m_vertices[vertexIndex].Position; +#endif + } + + public Vector3 GetVertex(int vertexIndex) + { + return GetVertexInt(vertexIndex); + } + + public void GetVertex(int vertexIndex1, int vertexIndex2, int vertexIndex3, out Vector3 v1, out Vector3 v2, out Vector3 v3) + { + v1 = GetVertex(vertexIndex1); + v2 = GetVertex(vertexIndex2); + v3 = GetVertex(vertexIndex3); + } + + public Vector3 GetVertexNormal(int vertexIndex) + { +#if PACKED_VERTEX_FORMAT + return VF_Packer.UnpackNormal(ref m_vertices[vertexIndex].Normal); +#else + return m_vertices[vertexIndex].Normal; +#endif + } + + public Vector3 GetVertexBinormal(int vertexIndex) + { +#if PACKED_VERTEX_FORMAT + return VF_Packer.UnpackNormal(ref m_forLoadingBinormals[vertexIndex]); +#else + return m_forLoadingBinormals[vertexIndex]; +#endif + } + + public Vector3 GetVertexTangent(int vertexIndex) + { +#if PACKED_VERTEX_FORMAT + return VF_Packer.UnpackNormal(ref m_forLoadingTangents[vertexIndex]); +#else + return m_forLoadingTangents[vertexIndex]; +#endif + } + + // Used only for loading and then disposed. It lives between LoadData and LoadInDraw... but that's OK because it's only during sector loading + // and I have to make it so because we can't load vertex/index buffers from other place than Draw call +#if PACKED_VERTEX_FORMAT + HalfVector2[] m_forLoadingTexCoords0; + HalfVector2[] m_forLoadingTexCoords1; + Byte4[] m_forLoadingBinormals; + Byte4[] m_forLoadingTangents; +#else + Vector2[] m_forLoadingTexCoords0; + Vector2[] m_forLoadingTexCoords1; + Vector3[] m_forLoadingBinormals; + Vector3[] m_forLoadingTangents; +#endif + + float m_specularShininess; + float m_specularPower; + float m_rescaleFactor; + bool m_useChannelTextures; + + // Bounding volumes + public BoundingSphere BoundingSphere; //TODO: Could be made readonly from the outside, and alterable only from the inside of this class + public BoundingBox BoundingBox; //TODO: Could be made readonly from the outside, and alterable only from the inside of this class + + // Size of the bounding box + public Vector3 BoundingBoxSize; //TODO: Could be made readonly from the outside, and alterable only from the inside of this class + public Vector3 BoundingBoxSizeHalf; //TODO: Could be made readonly from the outside, and alterable only from the inside of this class + + // Octree + IMyTriangePruningStructure m_bvh; + + readonly string m_assetName; + bool m_loadedData; + bool m_loadedContent; + + + public bool LoadedData + { + get { return m_loadedData; } + } + + public bool LoadedContent + { + get { return m_loadedContent; } + } + + List m_meshContainer = new List(); + + public bool UseChannels + { + get + { + return m_useChannelTextures && MyRenderConstants.RenderQualityProfile.UseChannels; + } + } + + // Create instance of a model, but doesn't really load the model from file to memory. Only remembers its definition. + // Data are loaded later using lazy-load mechanism - in LoadData or LoadInDraw + // Parameters of this constructor that are nullable aren't mandatory - that's why they are nullable. + // But they might be needed at some point of model's life, so think! + // E.g. if texture isn't specified, then it's not assigned to shader during rendering. Same for "shininess" and "specularPower" + // But models that use it should have null in all other texture parameters, because those textures won't be used. + // IMPORTANT: ASSERTS IN THIS CONSTRUCTOR SHOULD CHECK IF ALL REQUIRED PARAMETERS AND THEIR COMBINATIONS ARE FINE! + // BUT THE REALITY IS THAT I DON'T HAVE TIME TO ASSERT ALL POSSIBLE COMBINATIONS... + + public MyModel(string assetName, MyMeshDrawTechnique drawTechnique, MyModelsEnum modelEnum) + : this(assetName, drawTechnique, modelEnum, false) + { + } + + /// + /// c-tor - this constructor should be used just for max models - not voxels! + /// + /// + /// + /// + /// + public MyModel(string assetName, MyMeshDrawTechnique drawTechnique, MyModelsEnum modelEnum, bool keepInMemory) + { + m_assetName = assetName; + m_loadedData = false; + m_loadedContent = false; + ModelEnum = modelEnum; + m_drawTechnique = drawTechnique; + KeepInMemory = keepInMemory; + + string absFilePath = Directory.GetCurrentDirectory() + "\\Content\\" + m_assetName + ".mwm"; + System.Diagnostics.Debug.Assert(File.Exists(absFilePath), "Model data for " + m_assetName + " does not exists!"); + + LoadState = Managers.LoadState.Unloaded; + } + + /// + /// Use brain w + /// + /// + public List GetMeshList() + { + return m_meshContainer; + } + + + // Sort of lazy-load, where constructor just saves information about what this model should be, but real load is done here - and only one time. + // This loads only vertex data, doesn't touch GPU + // Can be called from main and background thread + public void LoadData() + { + if (m_loadedData) return; + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyModel::LoadData"); + + + MyMwcLog.WriteLine("MyModel.LoadData -> START", LoggingOptions.LOADING_MODELS); + MyMwcLog.IncreaseIndent(LoggingOptions.LOADING_MODELS); + + MyMwcLog.WriteLine("m_assetName: " + m_assetName, LoggingOptions.LOADING_MODELS); + + // Read data from model TAG parameter. There are stored vertex positions, triangle indices, vectors, ... everything we need. + string absFilePath = Directory.GetCurrentDirectory() + "\\Content\\" + m_assetName + ".mwm"; + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("Model - load data - import data"); + + + + MyMwcLog.WriteLine(String.Format("Importing asset {0}, path: {1}", m_assetName, absFilePath), LoggingOptions.LOADING_MODELS); + try + { + m_exporter.ImportData(absFilePath); + } + catch (Exception e) + { + MyMwcLog.WriteLine(String.Format("Importing asset failed {0}, message: {1}, stack:{2}", m_assetName, e.Message, e.StackTrace)); + } + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("Model - load data - load tag data"); + Dictionary tagData = m_exporter.GetTagData(); + if (tagData.Count == 0) + { + throw new Exception(String.Format("Uncompleted tagData for asset: {0}, path: {1}", m_assetName, absFilePath)); + } + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("Model - load data - vertex, normals, texture coords"); + + +#if PACKED_VERTEX_FORMAT + HalfVector4[] vertices = (HalfVector4[])tagData[MyImporterConstants.TAG_VERTICES]; + + System.Diagnostics.Debug.Assert(vertices.Length > 0); + + Byte4[] normals = (Byte4[])tagData[MyImporterConstants.TAG_NORMALS]; + m_vertices = new MyCompressedVertexNormal[vertices.Length]; + if (normals.Length > 0) + { + for (int v = 0; v < vertices.Length; v++) + { + m_vertices[v] = new MyCompressedVertexNormal() + { + Position = vertices[v],// VF_Packer.PackPosition(ref vertices[v]), + Normal = normals[v]//VF_Packer.PackNormalB4(ref normals[v]) + }; + } + } + else + { + for (int v = 0; v < vertices.Length; v++) + { + m_vertices[v] = new MyCompressedVertexNormal() + { + Position = vertices[v],// VF_Packer.PackPosition(ref vertices[v]), + }; + } + } +#else + Vector3[] vertices = (Vector3[])tagData[MyImporterConstants.TAG_VERTICES]; + Vector3[] normals = (Vector3[])tagData[MyImporterConstants.TAG_NORMALS]; + m_vertices = new MyVertexNormal[vertices.Length]; + for (int v = 0; v < vertices.Length; v++) + { + m_vertices[v] = new MyVertexNormal() + { + Position = vertices[v], + Normal = normals[v] + }; + } +#endif + + m_verticesCount = vertices.Length; + +#if PACKED_VERTEX_FORMAT + HalfVector2[] forLoadingTexCoords0 = (HalfVector2[])tagData[MyImporterConstants.TAG_TEXCOORDS0]; + m_forLoadingTexCoords0 = new HalfVector2[forLoadingTexCoords0.Length]; + for (int t = 0; t < forLoadingTexCoords0.Length; t++) + { + m_forLoadingTexCoords0[t] = forLoadingTexCoords0[t];// new HalfVector2(forLoadingTexCoords0[t]); + } +#else + Vector2[] forLoadingTexCoords0 = (Vector2[])tagData[MyImporterConstants.TAG_TEXCOORDS0]; + m_forLoadingTexCoords0 = new Vector2[forLoadingTexCoords0.Length]; + for (int t = 0; t < forLoadingTexCoords0.Length; t++) + { + m_forLoadingTexCoords0[t] = forLoadingTexCoords0[t]; + } +#endif + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("Model - load data - mesh"); + m_meshContainer.Clear(); + + if (tagData.ContainsKey(MyImporterConstants.TAG_MESH_PARTS)) + { + List indices = new List(GetVerticesCount()); // Default capacity estimation + int maxIndex = 0; + + List meshes = tagData[MyImporterConstants.TAG_MESH_PARTS] as List; + foreach (MyMeshPartInfo meshPart in meshes) + { + + MyMesh mesh = new MyMesh(meshPart, m_assetName); + + mesh.IndexStart = indices.Count; + mesh.TriCount = meshPart.m_Indicies.Count / 3; + + System.Diagnostics.Debug.Assert(mesh.TriCount > 0); + + foreach(var i in meshPart.m_Indicies) + { + indices.Add(i); + if(i > maxIndex) + { + maxIndex = i; + } + } + + m_meshContainer.Add(mesh); + } + + if (maxIndex <= ushort.MaxValue) + { + // create 16 bit indices + m_Indicies_16bit = new ushort[indices.Count]; + for (int i = 0; i < indices.Count; i++) + { + m_Indicies_16bit[i] = (ushort)indices[i]; + } + } + else + { + // use 32bit indices + m_Indicies = indices.ToArray(); + } + } + + if (tagData.ContainsKey(MyImporterConstants.TAG_MODEL_BVH)) + { + m_bvh = new MyQuantizedBvhAdapter(tagData[MyImporterConstants.TAG_MODEL_BVH] as GImpactQuantizedBvh, this); + } + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("Model - load data - other data"); + if (MyRenderConstants.RenderQualityProfile.UseNormals) + { + +#if PACKED_VERTEX_FORMAT + Byte4[] forLoadingBinormals = (Byte4[])tagData[MyImporterConstants.TAG_BINORMALS]; + Byte4[] forLoadingTangents = (Byte4[])tagData[MyImporterConstants.TAG_TANGENTS]; + m_forLoadingBinormals = new Byte4[forLoadingBinormals.Length]; + m_forLoadingTangents = new Byte4[forLoadingBinormals.Length]; + + for (int v = 0; v < forLoadingBinormals.Length; v++) + { + m_forLoadingBinormals[v] = forLoadingBinormals[v];// VF_Packer.PackNormalB4(ref forLoadingBinormals[v]); + m_forLoadingTangents[v] = forLoadingTangents[v];//VF_Packer.PackNormalB4(ref forLoadingTangents[v]); + } +#else + Vector3[] forLoadingBinormals = (Vector3[])tagData[MyImporterConstants.TAG_BINORMALS]; + Vector3[] forLoadingTangents = (Vector3[])tagData[MyImporterConstants.TAG_TANGENTS]; + m_forLoadingBinormals = new Vector3[forLoadingBinormals.Length]; + m_forLoadingTangents = new Vector3[forLoadingBinormals.Length]; + + for (int v = 0; v < forLoadingBinormals.Length; v++) + { + m_forLoadingBinormals[v] = forLoadingBinormals[v]; + m_forLoadingTangents[v] = forLoadingTangents[v]; + } +#endif + } + + m_specularShininess = (float)tagData[MyImporterConstants.TAG_SPECULAR_SHININESS]; + m_specularPower = (float)tagData[MyImporterConstants.TAG_SPECULAR_POWER]; + m_rescaleFactor = (float)tagData[MyImporterConstants.TAG_RESCALE_FACTOR]; + + m_useChannelTextures = (bool)tagData[MyImporterConstants.TAG_USE_CHANNEL_TEXTURES]; + if (m_useChannelTextures) + { + +#if PACKED_VERTEX_FORMAT + HalfVector2[] forLoadingTexCoords1 = (HalfVector2[])tagData[MyImporterConstants.TAG_TEXCOORDS1]; + System.Diagnostics.Debug.Assert(forLoadingTexCoords1.Length > 0); + m_forLoadingTexCoords1 = new HalfVector2[forLoadingTexCoords1.Length]; + for (int t = 0; t < forLoadingTexCoords1.Length; t++) + { + m_forLoadingTexCoords1[t] = forLoadingTexCoords1[t];// new HalfVector2(forLoadingTexCoords1[t]); + } +#else + Vector2[] forLoadingTexCoords1 = (Vector2[])tagData[MyImporterConstants.TAG_TEXCOORDS1]; + System.Diagnostics.Debug.Assert(forLoadingTexCoords1.Length > 0); + m_forLoadingTexCoords1 = new Vector2[forLoadingTexCoords1.Length]; + for (int t = 0; t < forLoadingTexCoords1.Length; t++) + { + m_forLoadingTexCoords1[t] = forLoadingTexCoords1[t]; + } +#endif + } + + BoundingBox = (BoundingBox)tagData[MyImporterConstants.TAG_BOUNDING_BOX]; + BoundingSphere = (BoundingSphere)tagData[MyImporterConstants.TAG_BOUNDING_SPHERE]; + BoundingBoxSize = BoundingBox.Max - BoundingBox.Min; + BoundingBoxSizeHalf = BoundingBoxSize / 2.0f; + Dummies = tagData[MyImporterConstants.TAG_DUMMIES] as Dictionary; + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); + + + foreach (MyMesh mesh in m_meshContainer) + { + for (int i = 0; i < mesh.Materials.Length; i++) + { + MyMeshMaterial material = mesh.Materials[i]; + + if (Dummies.ContainsKey(material.MaterialName)) + { + MyModelDummy dummy = Dummies[material.MaterialName]; + + material.DiffuseUVAnim = new Vector2( + MyUtils.ReadSingleSafe((string)dummy.CustomData["DiffuseU"]), + MyUtils.ReadSingleSafe((string)dummy.CustomData["DiffuseV"]) + ); + + material.EmissiveUVAnim = new Vector2( + MyUtils.ReadSingleSafe((string)dummy.CustomData["EmissiveU"]), + MyUtils.ReadSingleSafe((string)dummy.CustomData["EmissiveV"]) + ); + } + } + } + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("Model - load data - copy triangle indices"); + // Prepare data + CopyTriangleIndices(); + m_trianglesCount = Triangles.Count(); + + //m_effect = MyModels.GetEffectForDrawTechnique(m_drawTechnique); + + // Remember this numbers as list may be cleared at the end of this method + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); + + MyMwcLog.WriteLine("Triangles.Length: " + Triangles.Length, LoggingOptions.LOADING_MODELS); + MyMwcLog.WriteLine("Vertexes.Length: " + GetVerticesCount(), LoggingOptions.LOADING_MODELS); + MyMwcLog.WriteLine("Centered: " + (bool)tagData[MyImporterConstants.TAG_CENTERED], LoggingOptions.LOADING_MODELS); + MyMwcLog.WriteLine("UseChannelTextures: " + (bool)tagData[MyImporterConstants.TAG_USE_CHANNEL_TEXTURES], LoggingOptions.LOADING_MODELS); + MyMwcLog.WriteLine("Length in meters: " + (float)tagData[MyImporterConstants.TAG_LENGTH_IN_METERS], LoggingOptions.LOADING_MODELS); + MyMwcLog.WriteLine("Rescale to length in meters?: " + (bool)tagData[MyImporterConstants.TAG_RESCALE_TO_LENGTH_IN_METERS], LoggingOptions.LOADING_MODELS); + MyMwcLog.WriteLine("SpecularShininess: " + m_specularShininess, LoggingOptions.LOADING_MODELS); + MyMwcLog.WriteLine("SpecularPower: " + m_specularPower, LoggingOptions.LOADING_MODELS); + MyMwcLog.WriteLine("RescaleFactor: " + m_rescaleFactor, LoggingOptions.LOADING_MODELS); + MyMwcLog.WriteLine("BoundingBox: " + BoundingBox, LoggingOptions.LOADING_MODELS); + MyMwcLog.WriteLine("BoundingSphere: " + BoundingSphere, LoggingOptions.LOADING_MODELS); + + MyPerformanceCounter.PerAppLifetime.MyModelsCount++; + MyPerformanceCounter.PerAppLifetime.MyModelsMeshesCount += m_meshContainer.Count; + MyPerformanceCounter.PerAppLifetime.MyModelsVertexesCount += GetVerticesCount(); + MyPerformanceCounter.PerAppLifetime.MyModelsTrianglesCount += Triangles.Length; + + //MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("Model - load data - octree"); + //// Create octree for fast line intersections. + //// IMPORTANT: This can be calculated only after we know bounding box and vertex/triangleVertexes arrays are filled + //m_octree = new MyModelOctree(this); + //MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); + + // Preload octree & bvh + //var before = System.GC.GetTotalMemory(true); + //DateTime beforeTime = DateTime.Now; + //GetOctree(); + //MyPerformanceCounter.PerAppLifetime.MyModelsOctreeLoadTime += (DateTime.Now - beforeTime); + //var after = System.GC.GetTotalMemory(true); + //MyPerformanceCounter.PerAppLifetime.MyModelsOctreeSizeB += (after - before); + + //var before2 = System.GC.GetTotalMemory(true); + //DateTime beforeTime2 = DateTime.Now; + //GetBvh(); + //MyPerformanceCounter.PerAppLifetime.MyModelsBvhLoadTime += (DateTime.Now - beforeTime2); + //var after2 = System.GC.GetTotalMemory(true); + //MyPerformanceCounter.PerAppLifetime.MyModelsBvhSizeB += (after2 - before2); + + //tempContentManagerForModelOnly.Unload(); + + ModelInfo = new MyModelInfo(GetTrianglesCount(), GetVerticesCount(), BoundingBoxSize); + + m_loadedData = true; + + MyMwcLog.DecreaseIndent(LoggingOptions.LOADING_MODELS); + MyMwcLog.WriteLine("MyModel.LoadData -> END", LoggingOptions.LOADING_MODELS); + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); + } + + + // + // + public void LoadContent() + { + //If model was loaded previously, we need it reload because it has some temporary data discarded + //otherwise model wont load after device reset + // We must also reload when binormals or tangents are missing. + /* + if (m_loadedData && (m_forLoadingTexCoords0 == null || m_forLoadingBinormals == null || m_forLoadingTangents == null || m_meshContainer.Count == 0)) + { + m_loadedData = false; + LoadData(); + } */ + + LoadInDraw(); + + + } + + + + private void CreateRenderDataForMesh() + { + // Creating vertex and index buffer + // Write to GPU + CreateVertexBuffer(); + CreateIndexBuffer(); + + // We don't need this anymore - we need it for merging geometry + // Cleaning up lists + /* + m_forLoadingTexCoords0 = null; + m_forLoadingTexCoords1 = null; + m_forLoadingBinormals = null; + m_forLoadingTangents = null; + */ + + // Cleaning normals if we do not need vertex normal debug drawing + // if (!MyMwcFinalBuildConstants.ENABLE_VERTEX_NORMALS_DEBUG_DRAW) + // m_VertexNormals = null; + } + + // Loads vertex/index buffers and textures, access GPU + // Should be called only from Draw method on main thread + public void LoadInDraw(LoadingMode loadingMode = LoadingMode.Immediate) + { + // If already loaded into GPU + if (m_loadedContent) return; + + // If this model wasn't loaded through lazy-load then it means we don't need it in this game/sector, and we + // don't need to load him into GPU + if (m_loadedData == false) return; + + if (LoadState == Managers.LoadState.Loading) + return; + + if (loadingMode == LoadingMode.Background) + { + MyModels.LoadModelInDrawInBackground(this); + return; + } + + + Debug.Assert(m_forLoadingTexCoords0 != null && m_meshContainer.Count != 0, "Somebody forget to call LoadData on model before rendering"); + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("MyModel::LoadInDraw"); + + if (m_useChannelTextures) + { + MaskTexture = MyTextureManager.GetTexture(m_assetName + C_POSTFIX_MASK, null, LoadingMode.LazyBackground); + } + + + + // Creating + CreateRenderDataForMesh(); + + + m_loadedContent = true; + + LoadState = Managers.LoadState.Loaded; + + MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); + } + + void CreateVertexBuffer() + { + // Create vertex buffer - vertex format type depends on draw technique + + switch (m_drawTechnique) + { + case MyMeshDrawTechnique.MESH: + case MyMeshDrawTechnique.DECAL: + case MyMeshDrawTechnique.HOLO: + case MyMeshDrawTechnique.ALPHA_MASKED: + { + if (m_forLoadingTexCoords0 == null) throw new Exception("Model '" + m_assetName + "' doesn't have texture channel 0 specified, but this shader requires it"); + + if (m_forLoadingTexCoords0.Length == 0) + { + MyVertexFormatPosition[] vertexArray = new MyVertexFormatPosition[GetVerticesCount()]; + for (int i = 0; i < GetVerticesCount(); i++) + { + Vector4 pos = m_vertices[i].Position.ToVector4(); + vertexArray[i].Position = new Vector3(pos.X, pos.Y, pos.Z); + } + + m_vertexDeclaration = MyVertexFormatPosition.VertexDeclaration; + m_vertexStride = MyVertexFormatPosition.Stride; + m_vertexBufferSize = vertexArray.Length * m_vertexStride; + m_vertexBuffer = new VertexBuffer(MyMinerGame.Static.GraphicsDevice, m_vertexBufferSize, Usage.WriteOnly, VertexFormat.None, Pool.Default); + m_vertexBuffer.Lock(0, 0, LockFlags.None).WriteRange(vertexArray); + m_vertexBuffer.Unlock(); + m_vertexBuffer.Tag = this; + } + else + if (MyRenderConstants.RenderQualityProfile.UseNormals) + { + if (m_forLoadingBinormals == null) + throw new Exception("Model '" + m_assetName + "' doesn't have binormals calculated, but this shader requires them"); + if (m_forLoadingTangents == null) + throw new Exception("Model '" + m_assetName + "' doesn't have tangent vectors calculated, but this shader requires them"); + + if (UseChannels) + { + if (m_forLoadingTexCoords1 == null || m_forLoadingTexCoords1.Length == 0) + { + throw new Exception("Model '" + m_assetName + "' doesn't have UVcoords1 calculated, but this shader requires them"); + } + + MyVertexFormatPositionNormalTextureTangentBinormalMask[] vertexArray = new MyVertexFormatPositionNormalTextureTangentBinormalMask[GetVerticesCount()]; + for (int i = 0; i < GetVerticesCount(); i++) + { +#if PACKED_VERTEX_FORMAT + vertexArray[i].PositionPacked = m_vertices[i].Position; + vertexArray[i].NormalPacked = m_vertices[i].Normal; + vertexArray[i].TexCoordPacked = m_forLoadingTexCoords0[i]; + vertexArray[i].BinormalPacked = m_forLoadingBinormals[i]; + vertexArray[i].TangentPacked = m_forLoadingTangents[i]; + vertexArray[i].MaskCoordPacked = m_forLoadingTexCoords1[i]; +#else + vertexArray[i].Position = m_vertices[i].Position; + vertexArray[i].Normal = m_vertices[i].Normal; + vertexArray[i].TexCoord = m_forLoadingTexCoords0[i]; + vertexArray[i].Binormal = m_forLoadingBinormals[i]; + vertexArray[i].Tangent = m_forLoadingTangents[i]; + vertexArray[i].MaskCoord = m_forLoadingTexCoords1[i]; + +#endif + } + + m_vertexDeclaration = MyVertexFormatPositionNormalTextureTangentBinormalMask.VertexDeclaration; + m_vertexStride = MyVertexFormatPositionNormalTextureTangentBinormalMask.Stride; + m_vertexBufferSize = vertexArray.Length * m_vertexStride; + m_vertexBuffer = new VertexBuffer(MyMinerGame.Static.GraphicsDevice, m_vertexBufferSize, Usage.WriteOnly, VertexFormat.None, Pool.Default); + m_vertexBuffer.Lock(0, 0, LockFlags.None).WriteRange(vertexArray); + m_vertexBuffer.Unlock(); + m_vertexBuffer.Tag = this; + } + else + { + MyVertexFormatPositionNormalTextureTangentBinormal[] vertexArray = new MyVertexFormatPositionNormalTextureTangentBinormal[GetVerticesCount()]; + for (int i = 0; i < GetVerticesCount(); i++) + { +#if PACKED_VERTEX_FORMAT + vertexArray[i].PositionPacked = m_vertices[i].Position; + vertexArray[i].NormalPacked = m_vertices[i].Normal; + vertexArray[i].TexCoordPacked = m_forLoadingTexCoords0[i]; + vertexArray[i].BinormalPacked = m_forLoadingBinormals[i]; + vertexArray[i].TangentPacked = m_forLoadingTangents[i]; +#else + vertexArray[i].Position = m_vertices[i].Position; + vertexArray[i].Normal = m_vertices[i].Normal; + vertexArray[i].TexCoord = m_forLoadingTexCoords0[i]; + vertexArray[i].Binormal = m_forLoadingBinormals[i]; + vertexArray[i].Tangent = m_forLoadingTangents[i]; +#endif + } + + m_vertexDeclaration = MyVertexFormatPositionNormalTextureTangentBinormal.VertexDeclaration; + m_vertexStride = MyVertexFormatPositionNormalTextureTangentBinormal.Stride; + m_vertexBufferSize = vertexArray.Length * m_vertexStride; + m_vertexBuffer = new VertexBuffer(MyMinerGame.Static.GraphicsDevice, m_vertexBufferSize, Usage.WriteOnly, VertexFormat.None, Pool.Default); + m_vertexBuffer.Lock(0, 0, LockFlags.None).WriteRange(vertexArray); + m_vertexBuffer.Unlock(); + m_vertexBuffer.Tag = this; + } + } + else + { + if (UseChannels) + { + MyVertexFormatPositionNormalTextureMask[] vertexArray = new MyVertexFormatPositionNormalTextureMask[GetVerticesCount()]; + for (int i = 0; i < GetVerticesCount(); i++) + { +#if PACKED_VERTEX_FORMAT + vertexArray[i].PositionPacked = m_vertices[i].Position; + vertexArray[i].NormalPacked = m_vertices[i].Normal; + vertexArray[i].TexCoordPacked = m_forLoadingTexCoords0[i]; + vertexArray[i].MaskCoordPacked = m_forLoadingTexCoords1[i]; +#else + vertexArray[i].Position = m_vertices[i].Position; + vertexArray[i].Normal = m_vertices[i].Normal; + vertexArray[i].TexCoord = m_forLoadingTexCoords0[i]; + vertexArray[i].MaskCoord = m_forLoadingTexCoords1[i]; +#endif + } + + m_vertexDeclaration = MyVertexFormatPositionNormalTextureMask.VertexDeclaration; + m_vertexStride = MyVertexFormatPositionNormalTextureMask.Stride; + m_vertexBufferSize = vertexArray.Length * m_vertexStride; + m_vertexBuffer = new VertexBuffer(MyMinerGame.Static.GraphicsDevice, m_vertexBufferSize, Usage.WriteOnly, VertexFormat.None, Pool.Default); + m_vertexBuffer.Lock(0, 0, LockFlags.None).WriteRange(vertexArray); + m_vertexBuffer.Unlock(); + m_vertexBuffer.Tag = this; + } + else + { + MyVertexFormatPositionNormalTexture[] vertexArray = new MyVertexFormatPositionNormalTexture[GetVerticesCount()]; + for (int i = 0; i < GetVerticesCount(); i++) + { + vertexArray[i].Position = GetVertexInt(i); + vertexArray[i].Normal = GetVertexNormal(i); +#if PACKED_VERTEX_FORMAT + vertexArray[i].TexCoord = m_forLoadingTexCoords0[i].ToVector2(); +#else + vertexArray[i].TexCoord = m_forLoadingTexCoords0[i]; +#endif + } + + m_vertexDeclaration = MyVertexFormatPositionNormalTexture.VertexDeclaration; + m_vertexStride = MyVertexFormatPositionNormalTexture.Stride; + m_vertexBufferSize = vertexArray.Length * m_vertexStride; + m_vertexBuffer = new VertexBuffer(MyMinerGame.Static.GraphicsDevice, m_vertexBufferSize, Usage.WriteOnly, VertexFormat.None, Pool.Default); + m_vertexBuffer.Lock(0, 0, LockFlags.None).WriteRange(vertexArray); + m_vertexBuffer.Unlock(); + m_vertexBuffer.Tag = this; + } + } + } + break; + + case MyMeshDrawTechnique.VOXELS_DEBRIS: + case MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID: + { + MyVertexFormatPositionNormal[] vertexArray = new MyVertexFormatPositionNormal[GetVerticesCount()]; + for (int i = 0; i < GetVerticesCount(); i++) + { + vertexArray[i].Position = GetVertexInt(i); + vertexArray[i].Normal = GetVertexNormal(i); + } + + m_vertexDeclaration = MyVertexFormatPositionNormal.VertexDeclaration; + m_vertexStride = MyVertexFormatPositionNormal.Stride; + m_vertexBufferSize = vertexArray.Length * m_vertexStride; + m_vertexBuffer = new VertexBuffer(MyMinerGame.Static.GraphicsDevice, m_vertexBufferSize, Usage.WriteOnly, VertexFormat.None, Pool.Default); + m_vertexBuffer.Lock(0, 0, LockFlags.None).WriteRange(vertexArray); + m_vertexBuffer.Unlock(); + m_vertexBuffer.Tag = this; + } + break; + default: + { + throw new MyMwcExceptionApplicationShouldNotGetHere(); + } + } + + MyPerformanceCounter.PerAppLifetime.ModelVertexBuffersSize += m_vertexBufferSize; + + SignResource(m_vertexBuffer); + } + + void CreateIndexBuffer() + { + MyCommonDebugUtils.AssertDebug(m_indexBuffer == null); + + if (m_Indicies != null) + { + m_indexBuffer = new IndexBuffer(MyMinerGame.Static.GraphicsDevice, m_Indicies.Length * sizeof(int), Usage.WriteOnly, Pool.Default, false); + m_indexBuffer.Lock(0, 0, LockFlags.None).WriteRange(m_Indicies); + m_indexBuffer.Unlock(); + m_indexBuffer.Tag = this; + m_indexBufferSize = m_Indicies.Length * sizeof(int); + } + else if (m_Indicies_16bit != null) + { + m_indexBuffer = new IndexBuffer(MyMinerGame.Static.GraphicsDevice, m_Indicies_16bit.Length * sizeof(short), Usage.WriteOnly, Pool.Default, true); + m_indexBuffer.Lock(0, 0, LockFlags.None).WriteRange(m_Indicies_16bit); + m_indexBuffer.Unlock(); + m_indexBuffer.Tag = this; + m_indexBufferSize = m_Indicies_16bit.Length * sizeof(short); + } + + MyPerformanceCounter.PerAppLifetime.ModelIndexBuffersSize += m_indexBufferSize; + + SignResource(m_indexBuffer); + } + + /// + /// Signs the resource. + /// + /// The index buffer. + [Conditional("DEBUG")] + private void SignResource(IndexBuffer indexBuffer) + { + indexBuffer.DebugName = m_assetName + "_ib"; + } + + bool IsMeshGoingToBeAddedIntoTrianglesArray(MyMesh mesh) + { + return MyMeshPartInfo.IsPhysical(mesh.Materials[0].DrawTechnique); + } + + int GetNumberOfTrianglesForColDet() + { + int trianglesCount = 0; + foreach (MyMesh mesh in m_meshContainer) + { + if (IsMeshGoingToBeAddedIntoTrianglesArray(mesh)) + { + trianglesCount += mesh.TriCount; + } + } + return trianglesCount; + } + + void CopyTriangleIndices() + { + Triangles = new MyTriangleVertexIndices[GetNumberOfTrianglesForColDet()]; + int triangleIndex = 0; + + foreach (MyMesh mesh in m_meshContainer) + { + if (IsMeshGoingToBeAddedIntoTrianglesArray(mesh)) + { + if (m_Indicies != null) + { + for (int i = 0; i < mesh.TriCount; i++) + { + // Notice we swap indices. It's because XNA's clock-wise rule probably differs from FBX's, and JigLib needs it in this order. + // But because of this, I did similar swaping in my col/det functions + Triangles[triangleIndex] = new MyTriangleVertexIndices(m_Indicies[mesh.IndexStart + i * 3 + 0], m_Indicies[mesh.IndexStart + i * 3 + 2], m_Indicies[mesh.IndexStart + i * 3 + 1]); + triangleIndex++; + } + } + else if (m_Indicies_16bit != null) + { + for (int i = 0; i < mesh.TriCount; i++) + { + // Notice we swap indices. It's because XNA's clock-wise rule probably differs from FBX's, and JigLib needs it in this order. + // But because of this, I did similar swaping in my col/det functions + Triangles[triangleIndex] = new MyTriangleVertexIndices(m_Indicies_16bit[mesh.IndexStart + i * 3 + 0], m_Indicies_16bit[mesh.IndexStart + i * 3 + 2], m_Indicies_16bit[mesh.IndexStart + i * 3 + 1]); + triangleIndex++; + } + } + else throw new MyMwcExceptionApplicationShouldNotGetHere(); // Neither 32bit or 16bit indices are set, probably already called mesh.DisposeIndices() + } + } + + // No need to store indices anymore + //m_Indicies = null; + //m_Indicies_16bit = null; + + // Validate this new array, if size is correct and if all indices are OK + MyCommonDebugUtils.AssertDebug(triangleIndex == Triangles.Length); + foreach (MyTriangleVertexIndices triangle in Triangles) + { + MyCommonDebugUtils.AssertDebug(triangle.I0 != triangle.I1); + MyCommonDebugUtils.AssertDebug(triangle.I1 != triangle.I2); + MyCommonDebugUtils.AssertDebug(triangle.I2 != triangle.I0); + MyCommonDebugUtils.AssertDebug((triangle.I0 >= 0) && (triangle.I0 < GetVerticesCount())); + MyCommonDebugUtils.AssertDebug((triangle.I1 >= 0) && (triangle.I1 < GetVerticesCount())); + MyCommonDebugUtils.AssertDebug((triangle.I2 >= 0) && (triangle.I2 < GetVerticesCount())); + } + } + + + private void UnloadTemporaryData() + { + m_forLoadingTexCoords0 = null; + m_forLoadingTexCoords1 = null; + m_forLoadingBinormals = null; + m_forLoadingTangents = null; + } + + public bool UnloadData() + { + if (m_loadedContent) + UnloadContent(); + + UnloadTemporaryData(); + + bool res = m_loadedData; + m_loadedData = false; + if (m_bvh != null) + { + m_bvh.Close(); + m_bvh = null; + } + LoadState = Managers.LoadState.Unloaded; + + MyPerformanceCounter.PerAppLifetime.MyModelsMeshesCount -= m_meshContainer.Count; + if (m_vertices != null) + MyPerformanceCounter.PerAppLifetime.MyModelsVertexesCount -= GetVerticesCount(); + if (Triangles != null) + MyPerformanceCounter.PerAppLifetime.MyModelsTrianglesCount -= Triangles.Length; + if (res) + MyPerformanceCounter.PerAppLifetime.MyModelsCount--; + + m_vertices = null; + Triangles = null; + m_meshContainer.Clear(); + m_Indicies_16bit = null; + m_Indicies = null; + + return res; + } + + public void UnloadContent() + { + //MyPerformanceCounter.PerAppLifetime.MyModelsCount--; + + if (m_vertexBuffer != null) + { + m_vertexBuffer.Dispose(); + m_vertexBuffer = null; + MyPerformanceCounter.PerAppLifetime.ModelVertexBuffersSize -= m_vertexBufferSize; + m_vertexBufferSize = 0; + } + + if (m_indexBuffer != null) + { + m_indexBuffer.Dispose(); + m_indexBuffer = null; + MyPerformanceCounter.PerAppLifetime.ModelIndexBuffersSize -= m_indexBufferSize; + m_indexBufferSize = 0; + } + + LoadState = Managers.LoadState.Unloaded; + + //foreach (MyMesh mesh in m_meshContainer) + //{ + // mesh.DisposeBuffers(); //index + //} + + //m_meshContainer.Clear();// added for LoadContent purpose this will cause whole mesh to reload + + m_loadedContent = false; + } + + public MyModelsEnum GetModelEnum() + { + return ModelEnum; + } + + public IMyTriangePruningStructure GetTrianglePruningStructure() + { + Debug.Assert(m_bvh != null, "BVH should be loaded from content processor"); + return m_bvh; + } + + public void GetTriangleBoundingBox(int triangleIndex, ref BoundingBox boundingBox) + { + boundingBox = BoundingBoxHelper.InitialBox; + Vector3 v1, v2, v3; + GetVertex(Triangles[triangleIndex].I0, Triangles[triangleIndex].I1, Triangles[triangleIndex].I2, out v1, out v2, out v3); + + BoundingBoxHelper.AddTriangle(ref boundingBox, + v1, + v2, + v3); + } + + public int GetTrianglesCount() + { + return m_trianglesCount; + } + + public int GetVerticesCount() + { + return m_verticesCount; + } + + public int GetBVHSize() + { + return m_bvh != null ? m_bvh.Size : 0; + } + + public MyMeshDrawTechnique GetDrawTechnique() + { + return m_drawTechnique; + } + + public void SetDrawTechnique(MyMeshDrawTechnique drawTechnique) + { + m_drawTechnique = drawTechnique; + } + + public float GetSpecularShininess() + { + return m_specularShininess; + } + + public float GetSpecularPower() + { + return m_specularPower; + } + + public float GetRescaleFactor() + { + return m_rescaleFactor; + } + + + /// + /// Render + /// + /// + public void Render() + { + Device device = MyMinerGame.Static.GraphicsDevice; + device.SetStreamSource(0, m_vertexBuffer, 0, m_vertexStride); + device.Indices = m_indexBuffer; + device.VertexDeclaration = GetVertexDeclaration(); + + foreach (MyMesh mesh in m_meshContainer) + { + mesh.Render(device, m_verticesCount); + } + } + + /// + /// Dispose + /// + public void Dispose() + { + m_meshContainer.Clear(); + m_vertexBuffer.Dispose(); + m_vertexBuffer = null; + MyPerformanceCounter.PerAppLifetime.ModelVertexBuffersSize -= m_vertexBufferSize; + m_vertexBufferSize = 0; + + m_indexBuffer.Dispose(); + m_indexBuffer = null; + MyPerformanceCounter.PerAppLifetime.ModelIndexBuffersSize -= m_indexBufferSize; + m_indexBufferSize = 0; + } + + /// + /// File path of the model + /// + internal string AssetName + { + get { return m_assetName; } + } + + internal VertexBuffer VertexBuffer + { + get { return m_vertexBuffer; } + } + + internal IndexBuffer IndexBuffer + { + get { return m_indexBuffer; } + } + + /// + /// Signs the resource. + /// + /// The vertex buffer. + [Conditional("DEBUG")] + private void SignResource(VertexBuffer vertexBuffer) + { + vertexBuffer.DebugName = m_assetName + "_vb"; + } + + // Load only snappoints. + public void LoadOnlyDummies() + { + if (!m_loadedData) + { + MyMwcLog.WriteLine("MyModel.LoadSnapPoints -> START", LoggingOptions.LOADING_MODELS); + MyMwcLog.IncreaseIndent(LoggingOptions.LOADING_MODELS); + + MyMwcLog.WriteLine("m_assetName: " + m_assetName, LoggingOptions.LOADING_MODELS); + + // Read data from model TAG parameter. There are stored vertex positions, triangle indices, vectors, ... everything we need. + string absFilePath = Directory.GetCurrentDirectory() + "\\Content\\" + m_assetName + ".mwm"; + + MyModelExporter exporter = new MyModelExporter(); + + MyMwcLog.WriteLine(String.Format("Importing asset {0}, path: {1}", m_assetName, absFilePath), LoggingOptions.LOADING_MODELS); + + // Read only TAG_DUMMIES data + SortedSet tags = new SortedSet(); + tags.Add(MyImporterConstants.TAG_DUMMIES); + + try + { + exporter.ImportCustomData(absFilePath, tags); + } + catch (Exception e) + { + MyMwcLog.WriteLine(String.Format("Importing asset failed {0}, message: {1}, stack:{2}", m_assetName, e.Message, e.StackTrace)); + } + + Dictionary tagData = exporter.GetTagData(); + //if (tagData.Count == 0) + //{ + // throw new Exception(String.Format("Uncompleted tagData for asset: {0}, path: {1}", m_assetName, absFilePath)); + //} + + //Dummies = tagData[MyImporterConstants.TAG_DUMMIES] as Dictionary; + if (tagData.Count > 0) + { + Dummies = tagData[MyImporterConstants.TAG_DUMMIES] as Dictionary; + } + else + { + Dummies = new Dictionary(); + } + } + } + + // Load only snappoints. + public void LoadOnlyModelInfo() + { + if (!m_loadedData) + { + MyMwcLog.WriteLine("MyModel.LoadModelData -> START", LoggingOptions.LOADING_MODELS); + MyMwcLog.IncreaseIndent(LoggingOptions.LOADING_MODELS); + + MyMwcLog.WriteLine("m_assetName: " + m_assetName, LoggingOptions.LOADING_MODELS); + + // Read data from model TAG parameter. There are stored vertex positions, triangle indices, vectors, ... everything we need. + string absFilePath = Directory.GetCurrentDirectory() + "\\Content\\" + m_assetName + ".mwm"; + + MyModelExporter exporter = new MyModelExporter(); + + MyMwcLog.WriteLine(String.Format("Importing asset {0}, path: {1}", m_assetName, absFilePath), LoggingOptions.LOADING_MODELS); + + // Read only TAG_DUMMIES data + SortedSet tags = new SortedSet(); + tags.Add(MyImporterConstants.TAG_MODEL_INFO); + + try + { + exporter.ImportCustomData(absFilePath, tags); + } + catch (Exception e) + { + MyMwcLog.WriteLine(String.Format("Importing asset failed {0}, message: {1}, stack:{2}", m_assetName, e.Message, e.StackTrace)); + } + + Dictionary tagData = exporter.GetTagData(); + + if (tagData.Count > 0) + { + ModelInfo = tagData[MyImporterConstants.TAG_MODEL_INFO] as MyModelInfo; + } + else + { + ModelInfo = new MyModelInfo(0, 0, Vector3.Zero); + } + } + } + + void IPrimitiveManagerBase.Cleanup() + { + //throw new NotImplementedException(); + } + + bool IPrimitiveManagerBase.IsTrimesh() + { + return true; + //throw new NotImplementedException(); + } + + int IPrimitiveManagerBase.GetPrimitiveCount() + { + return this.m_trianglesCount; + //throw new NotImplementedException(); + } + + void IPrimitiveManagerBase.GetPrimitiveBox(int prim_index, out AABB primbox) + { + BoundingBox bbox = BoundingBoxHelper.InitialBox; + Vector3 v1 = GetVertex(Triangles[prim_index].I0); + Vector3 v2 = GetVertex(Triangles[prim_index].I1); + Vector3 v3 = GetVertex(Triangles[prim_index].I2); + BoundingBoxHelper.AddTriangle(ref bbox, + ref v1, + ref v2, + ref v3); + + primbox = new AABB() { m_min = bbox.Min, m_max = bbox.Max }; + } + + void IPrimitiveManagerBase.GetPrimitiveTriangle(int prim_index, PrimitiveTriangle triangle) + { + triangle.m_vertices[0] = GetVertex(Triangles[prim_index].I0); + triangle.m_vertices[1] = GetVertex(Triangles[prim_index].I1); + triangle.m_vertices[2] = GetVertex(Triangles[prim_index].I2); + } + + public void PreloadTextures(LoadingMode loadingMode, int materialIndex = -1) + { + foreach (MyMesh mesh in GetMeshList()) + { + if (materialIndex == -1) + mesh.Materials[0].PreloadTexture(loadingMode); + else + mesh.Materials[materialIndex].PreloadTexture(loadingMode); + } + } + } +} diff --git a/Sources/MinerWars.GameLib/AppCode/Game/Models/MyModels_Data.cs b/Sources/MinerWars.GameLib/AppCode/Game/Models/MyModels_Data.cs index ebca74c..fe12b65 100644 --- a/Sources/MinerWars.GameLib/AppCode/Game/Models/MyModels_Data.cs +++ b/Sources/MinerWars.GameLib/AppCode/Game/Models/MyModels_Data.cs @@ -1,3064 +1,3064 @@ -using System; -using MinerWarsMath.Graphics; -using MinerWars.CommonLIB.AppCode.Networking; -using MinerWars.CommonLIB.AppCode.Utils; -using SysUtils.Utils; - -using SysUtils; -using KeenSoftwareHouse.Library.Extensions; -using System.Collections.Generic; -using System.IO; -using MinerWars.AppCode.Game.Utils; -using MinerWars.CommonLIB.AppCode.Import; - -namespace MinerWars.AppCode.Game.Models -{ - public enum MyModelsEnum : int - { - MissileLauncher, - Autocannon_Barrel, - Autocannon_Base, - Liberator, - Enforcer, - Kammler, - Gettysburg, - Virginia, - Baer, - Hewer, - Razorclaw, - Greiser, - Tracer, - EAC02_Cockpit, - EAC02_Cockpit_glass, - EAC03_Cockpit, - EAC03_Cockpit_glass, - EAC04_Cockpit, - EAC04_Cockpit_glass, - EAC05_Cockpit, - EAC05_Cockpit_glass, - OmniCorp01_Cockpit, - OmniCorp01_Cockpit_glass, - OmniCorp03_Cockpit, - OmniCorp03_Cockpit_glass, - OmniCorp04_Cockpit, - OmniCorp04_Cockpit_glass, - OmniCorp_EAC01_Cockpit, - OmniCorp_EAC01_Cockpit_glass, - Cockpit_CN_03, - Cockpit_CN_03_glass, - Cockpit_SS_04, - Cockpit_SS_04_glass, - Cockpit_Razorclaw, - Cockpit_Razorclaw_glass, - //AnnaV, - Kai, - Kai_COL, - Kai_LOD1, - Missile, - ExplosionDebrisVoxel, - HarvestingTube, - Debris1, //Steel scrap - Debris2, //Cylindrical tripod - Debris3, //Wing scrap - Debris4, //steel gun scrap - Debris5, //ship wing ventilation scrap - Debris6, //wired parts - Debris7, //steel solid part - Debris8, //fat wires part - Debris9, //box cover - Debris10,//square steel plate - Debris11,//small tripod - Debris12,//exploded barrel - Debris13,//exploded tube - Debris14,//steel turbine or what - Debris15,//steel ribs - Debris16,//satelitte - Debris17,//chamfer cover box - Debris18,//Exploded pile - Debris19,//reflector or what - Debris20,//steel arm - Debris21,//old box - Debris22,//box with cables - Debris23,//lw debris - Debris24,//steel corner part - Debris25,//exploded dose - Debris26,//exploded tube - Debris27,//wired connected parts - Debris28,//rocket abandoned - Debris29,//circular tripod - Debris30,//christmas tree tripod - Debris31,//hook part - Debris32_pilot, - cistern, - pipe_bundle, - Standard_Container_1, - Standard_Container_2, - Standard_Container_3, - Standard_Container_4, - UtilityVehicle_1, - DebrisField, - HarvestingHead, - Drill_Base, - Drill_Gear1, - Drill_Gear2, - Drill_Gear3, - LaserDrill, - NuclearDrill, - NuclearDrillHead, - PressureDrill, - SawDrill, - ThermalDrill, - ThermalDrillHead, - MotherShipSaya, - MotherShipSaya_COL, - MotherShipSaya_LOD1, - - //Small ships - SmallShip_Doon, - SmallShip_Doon_LOD1, - SmallShip_Jacknife, - SmallShip_Jacknife_LOD1, - SmallShip_Hammer, - SmallShip_Hammer_LOD1, - SmallShip_ORG, - SmallShip_ORG_LOD1, - SmallShip_ORG_NoPaint, - SmallShip_ORG_NoPaint_LOD1, - SmallShip_YG_Closed, - SmallShip_YG_Closed_LOD1, - SmallShip_Hawk, - SmallShip_Hawk_LOD1, - SmallShip_Phoenix, - SmallShip_Phoenix_LOD1, - SmallShip_Leviathan, - SmallShip_Leviathan_LOD1, - SmallShip_Rockheater, - SmallShip_Rockheater_LOD1, - SmallShip_SteelHead, - SmallShip_SteelHead_LOD1, - SmallShip_Talon, - SmallShip_Talon_LOD1, - SmallShip_Stanislav, - SmallShip_Stanislav_LOD1, - Liberator_LOD1, - Enforcer_LOD1, - Kammler_LOD1, - Gettysburg_LOD1, - Virginia_LOD1, - Baer_LOD1, - Hewer_LOD1, - Razorclaw_LOD1, - Greiser_LOD1, - Tracer_LOD1, - - // Drones - DroneCN, - DroneSS, - DroneUS, - - // Largeship weapons - LargeShipMachineGunBarrel, - LargeShipMachineGunBase, - LargeShipMachineGunBase_COL, - LargeShipMissileLauncher9Barrel, - LargeShipMissileLauncher9Base, - LargeShipMissileLauncher9Base_COL, - LargeShipMissileLauncher4Barrel, - LargeShipMissileLauncher4Base, - LargeShipMissileLauncher4Base_COL, - LargeShipMissileLauncher6Barrel, - LargeShipMissileLauncher6Base, - LargeShipMissileLauncher6Base_COL, - LargeShipCiwsBarrel, - LargeShipCiwsBase, - LargeShipCiwsBase_COL, - LargeShipAutocannonBarrel, - LargeShipAutocannonBase, - LargeShipAutocannonBase_COL, - - StaticAsteroid10m_A_LOD0, - StaticAsteroid10m_A_LOD1, - StaticAsteroid10m_A_LOD2, - StaticAsteroid20m_A_LOD0, - StaticAsteroid20m_A_LOD1, - StaticAsteroid20m_A_LOD2, - StaticAsteroid30m_A_LOD0, - StaticAsteroid30m_A_LOD1, - StaticAsteroid30m_A_LOD2, - StaticAsteroid50m_A_LOD0, - StaticAsteroid50m_A_LOD1, - StaticAsteroid50m_A_LOD2, - StaticAsteroid100m_A_LOD0, - StaticAsteroid100m_A_LOD1, - StaticAsteroid100m_A_LOD2, - StaticAsteroid300m_A_LOD0, - StaticAsteroid300m_A_LOD1, - StaticAsteroid300m_A_LOD2, - StaticAsteroid500m_A_LOD0, - StaticAsteroid500m_A_LOD1, - StaticAsteroid500m_A_LOD2, - StaticAsteroid1000m_A_LOD0, - StaticAsteroid1000m_A_LOD1, - StaticAsteroid1000m_A_LOD2, - StaticAsteroid2000m_A_LOD0, - StaticAsteroid2000m_A_LOD1, - StaticAsteroid2000m_A_LOD2, - StaticAsteroid5000m_A_LOD0, - StaticAsteroid5000m_A_LOD1, - StaticAsteroid5000m_A_LOD2, - StaticAsteroid10000m_A_LOD0, - StaticAsteroid10000m_A_LOD1, - StaticAsteroid10000m_A_LOD2, - /* Removed - StaticAsteroid40000m_A_LOD0, - StaticAsteroid40000m_A_LOD1, - StaticAsteroid40000m_A_LOD2, - */ - StaticAsteroid10m_B_LOD0, - StaticAsteroid10m_B_LOD1, - StaticAsteroid10m_B_LOD2, - StaticAsteroid20m_B_LOD0, - StaticAsteroid20m_B_LOD1, - StaticAsteroid20m_B_LOD2, - StaticAsteroid30m_B_LOD0, - StaticAsteroid30m_B_LOD1, - StaticAsteroid30m_B_LOD2, - StaticAsteroid50m_B_LOD0, - StaticAsteroid50m_B_LOD1, - StaticAsteroid50m_B_LOD2, - StaticAsteroid100m_B_LOD0, - StaticAsteroid100m_B_LOD1, - StaticAsteroid100m_B_LOD2, - StaticAsteroid300m_B_LOD0, - StaticAsteroid300m_B_LOD1, - StaticAsteroid300m_B_LOD2, - StaticAsteroid500m_B_LOD0, - StaticAsteroid500m_B_LOD1, - StaticAsteroid500m_B_LOD2, - StaticAsteroid1000m_B_LOD0, - StaticAsteroid1000m_B_LOD1, - StaticAsteroid1000m_B_LOD2, - StaticAsteroid2000m_B_LOD0, - StaticAsteroid2000m_B_LOD1, - StaticAsteroid2000m_B_LOD2, - StaticAsteroid5000m_B_LOD0, - StaticAsteroid5000m_B_LOD1, - StaticAsteroid5000m_B_LOD2, - StaticAsteroid10000m_B_LOD0, - StaticAsteroid10000m_B_LOD1, - StaticAsteroid10000m_B_LOD2, - /* Removed - StaticAsteroid10m_C_LOD0, - StaticAsteroid10m_C_LOD1, - StaticAsteroid20m_C_LOD0, - StaticAsteroid20m_C_LOD1, - StaticAsteroid30m_C_LOD0, - StaticAsteroid30m_C_LOD1, - StaticAsteroid50m_C_LOD0, - StaticAsteroid50m_C_LOD1, - StaticAsteroid100m_C_LOD0, - StaticAsteroid100m_C_LOD1, - StaticAsteroid300m_C_LOD0, - StaticAsteroid300m_C_LOD1, - StaticAsteroid500m_C_LOD0, - StaticAsteroid500m_C_LOD1, - StaticAsteroid1000m_C_LOD0, - StaticAsteroid1000m_C_LOD1, - StaticAsteroid2000m_C_LOD0, - StaticAsteroid2000m_C_LOD1, - StaticAsteroid5000m_C_LOD0, - StaticAsteroid5000m_C_LOD1, - StaticAsteroid10000m_C_LOD0, - StaticAsteroid10000m_C_LOD1, - - StaticAsteroid10m_D_LOD0, - StaticAsteroid10m_D_LOD1, - StaticAsteroid20m_D_LOD0, - StaticAsteroid20m_D_LOD1, - StaticAsteroid30m_D_LOD0, - StaticAsteroid30m_D_LOD1, - StaticAsteroid50m_D_LOD0, - StaticAsteroid50m_D_LOD1, - StaticAsteroid100m_D_LOD0, - StaticAsteroid100m_D_LOD1, - StaticAsteroid300m_D_LOD0, - StaticAsteroid300m_D_LOD1, - StaticAsteroid500m_D_LOD0, - StaticAsteroid500m_D_LOD1, - StaticAsteroid1000m_D_LOD0, - StaticAsteroid1000m_D_LOD1, - StaticAsteroid2000m_D_LOD0, - StaticAsteroid2000m_D_LOD1, - StaticAsteroid5000m_D_LOD0, - StaticAsteroid5000m_D_LOD1, - StaticAsteroid10000m_D_LOD0, - StaticAsteroid10000m_D_LOD1, - - StaticAsteroid10m_E_LOD0, - StaticAsteroid10m_E_LOD1, - StaticAsteroid20m_E_LOD0, - StaticAsteroid20m_E_LOD1, - StaticAsteroid30m_E_LOD0, - StaticAsteroid30m_E_LOD1, - StaticAsteroid50m_E_LOD0, - StaticAsteroid50m_E_LOD1, - StaticAsteroid100m_E_LOD0, - StaticAsteroid100m_E_LOD1, - StaticAsteroid300m_E_LOD0, - StaticAsteroid300m_E_LOD1, - StaticAsteroid500m_E_LOD0, - StaticAsteroid500m_E_LOD1, - StaticAsteroid1000m_E_LOD0, - StaticAsteroid1000m_E_LOD1, - StaticAsteroid2000m_E_LOD0, - StaticAsteroid2000m_E_LOD1, - StaticAsteroid5000m_E_LOD0, - StaticAsteroid5000m_E_LOD1, - StaticAsteroid10000m_E_LOD0, - StaticAsteroid10000m_E_LOD1, - */ - UniversalLauncher, - MineBasic, - MineSmart, - FlashBomb, - IlluminatingShell, - DecoyFlare, - SphereExplosive, - SmokeBomb, - AsteroidKiller, - DirectionalExplosive, - TimeBomb, - RemoteBomb, - GravityBomb, - Hologram, - RemoteCamera, - Rifle, - Sniper, - MachineGun, - Shotgun, - MinerShip_Generic_CockpitInterior, - MinerShip_Generic_CockpitGlass, - Ardant, - Ardant_COL, - Ardant_LOD1, - //PREFAB MODULES - GizmoTranslation, - GizmoRotation, - p430_a01_passage_10m, - p430_a01_passage_10m_LOD1, - p430_a01_passage_10m_COL, - p430_a02_passage_40m, - p430_a02_passage_40m_LOD1, - p430_a02_passage_40m_COL, - p424_a01_pipe_base, - p424_a01_pipe_base_COL, - p423_a01_pipe_junction, - p422_a01_pipe_turn_90, - p421_a01_pipe_straight_80m, - p421_a02_pipe_straight_40m, - p421_a03_pipe_straight_10m, - p413_g01_junction_6axes, - p413_g01_junction_6axes_COL, - p414_g02_entrance_60m, - p414_g02_entrance_60m_LOD1, - p414_g02_entrance_60m_COL, - p410_g01_turn_90_right_0m, - p410_g01_turn_90_right_0m_LOD1, - p410_g01_turn_90_right_0m_COL, - p411_g01_straight_1, - p411_g02_straight_2, - p411_g03_straight_3, - p411_g04_straight_4, - //p414_f02_entrance_60m, - p412_f21_turn_s_up, - p412_f21_turn_s_up_COL, - p412_f22_turn_s_left, - p412_f22_turn_s_left_COL, - p412_f23_turn_s_right, - p412_f23_turn_s_right_COL, - p412_f24_turn_s_down, - p412_f24_turn_s_down_COL, - p412_f01_turn_90_up_230m, - p412_f02_turn_90_left_230m, - p412_f02_turn_90_left_230m_COL, - p412_f02_turn_90_left_230m_LOD1, - p412_f03_turn_90_right_230m, - p412_f03_turn_90_right_230m_LOD1, - p412_f03_turn_90_right_230m_COL, - p412_f04_turn_90_down_230m, - p412_f04_turn_90_down_230m_COL, - p411_f01_straight_1, - p411_f02_straight_2, - p411_f03_straight_3, - p414_e01_entrance_60m, - p414_e01_entrance_60m_LOD1, - p414_e01_entrance_60m_COL, - p411_e01_straight_1, - p411_e02_straight_2, - p411_e03_straight_3, - p411_e04_straight_4, - p411_e05_straight_5, - p411_e01_straight_1_COL, - p411_e02_straight_2_COL, - p411_e03_straight_3_COL, - p411_e04_straight_4_COL, - p411_e05_straight_5_COL, - p415_d01_doorcase, - p415_d01_doorcase_COL, - p415_d02_door1, - p415_d03_door2_a, - p415_d03_door2_a_COL, - p415_d03_door2_b, - p415_d03_door2_b_COL, - p413_d01_junction_t_horizontal, - p413_d03_junction_x_horizontal, - p413_d03_junction_x_horizontal_COL, - p414_d01_entrance_60m, - p414_d01_entrance_60m_COL, - p411_d01_straight_10m, - p411_d01_straight_10m_LOD1, - p411_d01_straight_10m_COL, - p411_d02_straight_40m_with_hole, - p411_d03_straight_60m, - p411_d04_straight_120m, - p411_d05_straight_180m, - p415_c01_doorcase, - p415_c02_door1_right, - p415_c02_door1_right_COL, - p415_c02_door1_left, - p415_c02_door1_left_COL, - p415_c03_door2_a_left, - p415_c03_door2_a_right, - p415_c03_door2_b_left, - p415_c03_door2_b_right, - p415_c02_door1, - p415_c03_door2_a, - p415_c03_door2_b, - p415_c04_door3, - p413_c01_junction_t_horizontal, - p413_c01_junction_t_horizontal_LOD1, - p413_c01_junction_x_horizontal, - p413_c01_junction_x_horizontal_COL, - p413_c01_junction_x_horizontal_LOD1, - p414_c01_entrance_60m, - p414_c01_entrance_60m_COL, - p411_c01_straight_10m, - p411_c01_straight_10m_COL, - p411_c02_straight_40m_with_hole, - p411_c02_straight_40m_with_hole_COL, - p411_c02_straight_40m_with_hole_LOD1, - p411_c03_straight_60m, - p411_c03_straight_60m_LOD1, - p411_c03_straight_60m_COL, - p411_c04_straight_120m, - p411_c04_straight_120m_LOD1, - p411_c04_straight_120m_COL, - p411_c05_straight_180m, - p415_b01_doorcase, - p415_b01_doorcase_LOD1, - p415_b01_doorcase_COL, - //p415_b02_door, - p413_b01_junction_t_horizontal, - p413_b01_junction_t_horizontal_LOD1, - p413_b01_junction_t_horizontal_COL, - p413_b02_junction_t_vertical, - p413_b02_junction_t_vertical_LOD1, - p413_b02_junction_t_vertical_COL, - p414_b02_entrance_60m, - p412_b21_turn_s_up, - p412_b21_turn_s_up_COL, - p412_b22_turn_s_left, - p412_b23_turn_s_right, - p412_b23_turn_s_right_COL, - p412_b24_turn_s_down, - p412_b11_turn_90_up_160m, - p412_b12_turn_90_left_160m, - p412_b13_turn_90_right_160m, - p412_b13_turn_90_right_160m_COL, - p412_b14_turn_90_down_160m, - p412_b14_turn_90_down_160m_COL, - p412_b01_turn_90_up_80m, - p412_b01_turn_90_up_80m_COL, - p412_b02_turn_90_left_80m, - p412_b02_turn_90_left_80m_COL, - p412_b03_turn_90_right_80m, - p412_b03_turn_90_right_80m_COL, - p412_b04_turn_90_down_80m, - p412_b04_turn_90_down_80m_COL, - p411_b01_straight_10m, - p411_b01_straight_10m_LOD1, - p411_b01_straight_10m_COL, - p411_b02_straight_30m_yellow, - p411_b02_straight_30m_yellow_LOD1, - p411_b02_straight_30m_yellow_COL, - p411_b03_straight_320m, - p411_b03_straight_320m_LOD1, - p411_b03_straight_320m_COL, - p411_b04_straight_80m_with_side_grates, - p411_b04_straight_80m_with_side_grates_LOD1, - p411_b04_straight_80m_with_side_grates_COL, - p411_b05_straight_80m_with_side_open, - p411_b05_straight_80m_with_side_open_LOD1, - p411_b05_straight_80m_with_side_open_COL, - p411_b06_straight_180m_concrete, - p411_b06_straight_180m_concrete_LOD1, - p411_b06_straight_180m_concrete_COL, - p411_b06_straight_200m, - p411_b06_straight_200m_LOD1, - p411_b06_straight_200m_COL, - p411_b07_straight_180m_blue, - p411_b07_straight_180m_blue_LOD1, - p411_b07_straight_180m_blue_COL, - p411_b09_straight_30m_gray, - p411_b09_straight_30m_gray_LOD1, - p411_b09_straight_30m_gray_COL, - p411_b11_straight_220m, - p411_b11_straight_220m_LOD1, - p411_b11_straight_220m_COL, - p411_b12_straight_160m_dark_metal, - p411_b12_straight_160m_dark_metal_LOD1, - p411_b12_straight_160m_dark_metal_COL, - p411_b13_straight_100m_tube_inside, - p411_b13_straight_100m_tube_inside_LOD1, - p411_b13_straight_100m_tube_inside_COL, - p415_a01_doorcase, - p415_a01_doorcase_LOD1, - p415_a01_doorcase_COL, - p415_a02_door, - p415_a02_door_left, - p415_a02_door_left_COL, - p415_a02_door_right, - p415_a02_door_right_COL, - p413_a01_junction_t_horizontal, - p413_a01_junction_t_horizontal_LOD1, - p413_a01_junction_t_horizontal_COL, - p413_a02_junction_t_vertical, - p413_a02_junction_t_vertical_LOD1, - p413_a02_junction_t_vertical_COL, - //p414_a01_entrance_30m, - p414_a02_entrance_60m, - p414_a02_entrance_60m_LOD1, - p414_a02_entrance_60m_COL, - p412_a21_turn_s_up, - p412_a21_turn_s_up_LOD1, - p412_a21_turn_s_up_COL, - p412_a22_turn_s_left, - p412_a22_turn_s_left_LOD1, - p412_a22_turn_s_left_COL, - p412_a23_turn_s_right, - p412_a23_turn_s_right_LOD1, - p412_a23_turn_s_right_COL, - p412_a24_turn_s_down, - p412_a24_turn_s_down_LOD1, - p412_a24_turn_s_down_COL, - p412_a11_turn_90_up_160m, - p412_a11_turn_90_up_160m_LOD1, - p412_a11_turn_90_up_160m_COL, - p412_a12_turn_90_left_160m, - p412_a12_turn_90_left_160m_LOD1, - p412_a12_turn_90_left_160m_COL, - p412_a13_turn_90_right_160m, - p412_a13_turn_90_right_160m_LOD1, - p412_a13_turn_90_right_160m_COL, - p412_a14_turn_90_down_160m, - p412_a14_turn_90_down_160m_LOD1, - p412_a14_turn_90_down_160m_COL, - p412_a01_turn_90_up_80m, - p412_a01_turn_90_up_80m_LOD1, - p412_a01_turn_90_up_80m_COL, - p412_a02_turn_90_left_80m, - p412_a02_turn_90_left_80m_LOD1, - p412_a02_turn_90_left_80m_COL, - p412_a03_turn_90_right_80m, - p412_a03_turn_90_right_80m_LOD1, - p412_a03_turn_90_right_80m_COL, - p412_a04_turn_90_down_80m, - p412_a04_turn_90_down_80m_LOD1, - p412_a04_turn_90_down_80m_COL, - p411_a01_straight_10m, - p411_a01_straight_10m_LOD1, - p411_a01_straight_10m_COL, - p411_a02_straight_60m_with_hole, - p411_a02_straight_60m_with_hole_LOD1, - p411_a02_straight_60m_with_hole_COL, - p411_a03_straight_120m, - p411_a03_straight_120m_LOD1, - p411_a03_straight_120m_COL, - p411_a04_straight_80m, - p411_a04_straight_80m_LOD1, - p411_a04_straight_80m_COL, - p411_a05_straight_80m_with_extension, - p411_a05_straight_80m_with_extension_LOD1, - p411_a05_straight_80m_with_extension_COL, - p382_e01_bridge5, - p382_e01_bridge5_LOD1, - p382_d01_bridge4, - p382_d01_bridge4_COL, - p382_c01_bridge3, - p382_c01_bridge3_COL, - p382_b01_bridge2, - p382_a01_bridge1, - p382_a01_bridge1_COL, - p382_a01_bridge1_LOD1, - p381_c01_building3, - p381_c01_building3_COL, - p381_b01_building2, - p381_b01_building2_COL, - p381_a01_building1, - p381_a01_building1_COL, - //p361_a01_small_hangar, - //p361_a01_small_hangar_COL, - p362_a01_short_distance_antenna, - p362_a01_short_distance_antenna_COL, - p361_a01_long_distance_antenna, - p361_a01_long_distance_antenna_COL, - p351_a01_weapon_mount, - p351_a01_weapon_mount_COL, - p345_a01_refinery, - p345_a01_refinery_COL, - p344_a01_container_arm_filled, - p344_a01_container_arm_filled_LOD1, - p344_a01_container_arm_filled_COL, - p344_a02_container_arm_empty, - p344_a02_container_arm_empty_COL, - p344_a02_container_arm_empty_LOD1, - p343_a01_ore_storage, - p343_a01_ore_storage_LOD1, - p343_a01_ore_storage_COL, - p342_a01_loading_bay, - p342_a01_loading_bay_LOD1, - p342_a01_loading_bay_COL, - p341_b01_open_dock_variation1, - p341_b01_open_dock_variation1_LOD1, - p341_b01_open_dock_variation1_COL, - p341_b02_open_dock_variation2, - p341_b02_open_dock_variation2_LOD1, - p341_b02_open_dock_variation2_COL, - p341_a01_open_dock_variation1, - p341_a01_open_dock_variation1_LOD1, - p341_a01_open_dock_variation1_COL, - p341_a01_open_dock_variation1_doorleft, - p341_a01_open_dock_variation1_doorright, - p341_a02_open_dock_variation2, - p341_a02_open_dock_variation2_LOD1, - p341_a02_open_dock_variation2_COL, - p333_a01_hydroponic_building, - p333_a01_hydroponic_building_COL, - p332_a01_oxygen_storage, - p332_a01_oxygen_storage_LOD1, - p332_a01_oxygen_storage_COL, - p331_a01_oxygen_generator, - p331_a01_oxygen_generator_COL, - p324b01_fuel_storage_b, - p324a01_fuel_storage_a, - p323a01_fuel_generator, - p323a01_fuel_generator_COL, - p322a01_battery, - p322a01_battery_COL, - p321c01_inertia_generator, - p321c01_inertia_generator_COL, - p321c01_inertia_generator_center, - p321c01_inertia_generator_center_COL, - p321c01_inertia_generator_center_LOD1, - p321c01_inertia_generator_LOD1, - p321b01_nuclear_reactor, - //p321a01_solar_panel, - //p321a01_solar_panel_LOD1, - //p321a01_solar_panel_COL, - p312a01_short_term_thruster_latitude, - p312a01_short_term_thruster_latitude_COL, - p312a02_short_term_thruster_lateral, - p312a02_short_term_thruster_lateral_COL, - p311a01_long_term_thruster, - p231a01_armor, - p231a02_armor, - p231a03_armor, - p231a04_armor, - p231a05_armor, - p231a06_armor, - p231a07_armor, - p231a08_armor, - p231a09_armor, - p231a10_armor, - p231a11_armor, - p231a12_armor, - p231a13_armor, - p231a14_armor, - p231a15_armor, - p231a16_armor, - p231a17_armor, - p231a18_armor, - - p221a01_chamber_v1, - p221a01_chamber_v1_LOD1, - p221a01_chamber_v1_COL, - - p221b01_chamber_v1, - p221b01_chamber_v1_LOD1, - - p221c01_chamber_v1, - p221c01_chamber_v1_LOD1, - p221c01_chamber_v1_COL, - - p221d01_chamber_v1, - p221d01_chamber_v1_LOD1, - p221d01_chamber_v1_COL, - - p221e01_chamber_v1, - p221e01_chamber_v1_LOD1, - p221e01_chamber_v1_COL, - - p221f01_chamber_v1, - p221f01_chamber_v1_LOD1, - p221f01_chamber_v1_COL, - - p221g01_chamber_v1, - p221g01_chamber_v1_LOD1, - p221g01_chamber_v1_COL, - - p221h01_chamber_v1, - p221h01_chamber_v1_LOD1, - p221h01_chamber_v1_COL, - - p221j01_chamber_v1, - p221j01_chamber_v1_LOD1, - p221j01_chamber_v1_COL, - - p221k01_chamber_v1, - p221k01_chamber_v1_LOD1, - - - - - p211h01_panel_535mx130m, - p211h01_panel_535mx130m_COL, - p211h01_panel_535mx130m_LOD1, - p211g01_panel_120mx60m, - p211g02_panel_60mx60m, - p211g03_panel_60mx30m, - p211g03_panel_60mx30m_LOD1, - p211g03_panel_60mx30m_COL, - //p211g03_panel_60mx30m_COL, - p211f01_panel_120mx60m, - p211f01_panel_120mx60m_LOD1, - p211f01_panel_120mx60m_COL, - p211f02_panel_60mx60m, - p211f02_panel_60mx60m_LOD1, - p211f02_panel_60mx60m_COL, - p211f03_panel_60mx30m, - p211f03_panel_60mx30m_COL, - p211e01_panel_120mx60m, - p211e01_panel_120mx60m_LOD1, - p211e01_panel_120mx60m_COL, - p211e02_panel_60mx60m, - p211e02_panel_60mx60m_LOD1, - p211e02_panel_60mx60m_COL, - p211e03_panel_60mx30m, - p211e03_panel_60mx30m_LOD1, - p211e03_panel_60mx30m_COL, - p211d01_panel_120mx60m, - p211d01_panel_120mx60m_LOD1, - p211d01_panel_120mx60m_COL, - p211d02_panel_60mx60m, - p211d03_panel_60mx30m, - p211d03_panel_60mx30m_LOD1, - p211d03_panel_60mx30m_COL, - p211c01_panel_120mx60m, - p211c02_panel_60mx60m, - p211c02_panel_60mx60m_COL, - p211c03_panel_60mx30m, - p211b01_panel_120mx60m, - p211b01_panel_120mx60m_COL, - p211b02_panel_60mx60m, - p211b02_panel_60mx60m_COL, - p211b03_panel_60mx30m, - p211b03_panel_60mx30m_COL, - p211a01_panel_120mx60m, - p211a01_panel_120mx60m_COL, - p211a02_panel_60mx60m, - p211a02_panel_60mx60m_COL, - p211a03_panel_60mx30m, - p211a03_panel_60mx30m_COL, - p142b01_cage_empty, - p142b02_cage_halfcut, - p142b03_cage_with_corners, - p142b03_cage_with_corners_LOD1, - p142b03_cage_with_corners_COL, - p142b11_cage_pillar, - p142b11_cage_pillar_COL, - p142b12_cage_edge, - p142a01_cage_empty, - p142a01_cage_empty_COL, - p142a02_cage_halfcut, - p142a02_cage_halfcut_COL, - p142a03_cage_with_corners, - p142a03_cage_with_corners_COL, - p142a11_cage_pillar, - p142a12_cage_edge, - p141b01_thick_frame_straight_10m, - p141b02_thick_frame_straight_60m, - p141b02_thick_frame_straight_60m_COL, - p141b11_thick_frame_edge, - p141b12_thick_frame_corner, - p141b31_thick_frame_joint, - p141b31_thick_frame_joint_COL, - p141a01_thick_frame_straight_10m, - p141a01_thick_frame_straight_10m_COL, - p141a02_thick_frame_straight_60m, - p141a02_thick_frame_straight_60m_COL, - p141a11_thick_frame_edge, - p141a11_thick_frame_edge_COL, - p141a12_thick_frame_corner, - p141a31_thick_frame_joint, - p141a31_thick_frame_joint_COL, - p130j01_j_straight_30m, - p130j01_j_straight_30m_COL, - p130j02_j_straight_10m, - p130j02_j_straight_10m_COL, - p130i01_i_straight_30m, - p130i02_i_straight_10m, - p130i02_i_straight_10m_COL, - p130h01_h_straight_30m, - p130h01_h_straight_30m_COL, - p130h02_h_straight_10m, - p130h02_h_straight_10m_COL, - //p130g01_g_straight_30m, - //p130g02_g_straight_10m, - //p130f01_f_straight_30m, - //p130f02_f_straight_10m, - //p130e01_e_straight_30m, - //p130e02_e_straight_10m, - //p130d01_d_straight_30m, - ////p130d02_d_straight_10m, - //p130c01_c_straight_30m, - //p130c02_c_straight_10m, - //p130b01_b_straight_30m, - //p130b02_b_straight_10m, - //p130a01_a_straight_30m, - //p130a02_a_straight_10m, - p120d01_d_straight_10m, - p120d01_d_straight_10m_COL, - p120d02_d_straight_40m, - p120d02_d_straight_40m_COL, - p120c01_c_straight_10m, - p120c01_c_straight_10m_COL, - p120c02_c_straight_40m, - p120c02_c_straight_40m_COL, - p120b01_b_straight_10m, - p120b01_b_straight_10m_COL, - p120b02_b_straight_40m, - p120b02_b_straight_40m_COL, - p120a01_strong_lattice_straight_10m, - p120a01_strong_lattice_straight_10m_COL, - p120a02_strong_lattice_straight_60m, - p120a03_strong_lattice_straight_120m, - p120a21_strong_lattice_junction_t_strong, - p120a21_strong_lattice_junction_t_strong_COL, - p120a22_strong_lattice_junction_t_weak, - p120a23_strong_lattice_junction_t_rotated, - p120a23_strong_lattice_junction_t_rotated_COL, - p120a51_strong_to_weak_lattice_2to1, - p120a51_strong_to_weak_lattice_2to1_COL, - p120a52_strong_to_weak_lattice_1to2, - p120a61_weak_lattice_junction_t_rotated, - p120a61_weak_lattice_junction_t_rotated_COL, - p110b01_lattice_beam_straight_10m, - p110b02_lattice_beam_straight_30m, - p110b02_lattice_beam_straight_30m_COL, - p110b03_lattice_beam_straight_60m, - p110b04_lattice_beam_straight_60m_with_panels, - p110b21_lattice_beam_junction_t_strong, - p110b22_lattice_beam_junction_t_weak, - p110b31_lattice_beam_joint_horizontal, - p110b31_lattice_beam_joint_horizontal_COL, - p110b32_lattice_beam_joint_vertical, - p110b32_lattice_beam_joint_vertical_COL, - p110a01_solid_beam_straight_10m, - p110a01_solid_beam_straight_10m_COL, - p110a02_solid_beam_straight_20m, - p110a02_solid_beam_straight_20m_COL, - p110a03_solid_beam_straight_40m_with_hole, - p110a03_solid_beam_straight_40m_with_hole_COL, - p110a04_solid_beam_straight_40m_lattice, - p110a04_solid_beam_straight_40m_lattice_LOD1, - p110a04_solid_beam_straight_40m_lattice_COL, - p110a05_solid_beam_straight_80m, - p110a11_solid_beam_junction_x_strong, - p110a11_solid_beam_junction_x_strong_LOD1, - p110a11_solid_beam_junction_x_strong_COL, - p110a12_solid_beam_junction_x_weak, - p110a13_solid_beam_junction_x_rotated, - p110a13_solid_beam_junction_x_rotated_LOD1, - p110a13_solid_beam_junction_x_rotated_COL, - p110a21_solid_beam_junction_t_strong, - p110a21_solid_beam_junction_t_strong_COL, - p110a22_solid_beam_junction_t_weak, - p110a23_solid_beam_junction_t_rotated, - p110a23_solid_beam_junction_t_rotated_COL, - p110a31_solid_beam_joint_horizontal, - p110a31_solid_beam_joint_horizontal_COL, - p110a32_solid_beam_joint_vertical, - p110a32_solid_beam_joint_vertical_COL, - p110a33_solid_beam_joint_longitudinal, - p110a33_solid_beam_joint_longitudinal_COL, - p110a41_solid_beam_superjoint, - p110a41_solid_beam_superjoint_COL, - - //Debug - plane_10_50, - plane_50_20, - plane_100_10, - plane_100_50, - plane_128_70, - plane_150_50, - plane_255_70, - plane_300_70, - plane_800_10, - plane_800_70, - sphere_smooth, - - //Simple object draw - BoxLowRes, - BoxHiRes, - Sphere, - Sphere_low, - Cone, - Hemisphere, - Hemisphere_low, - Capsule, - - //Lights - default_light_0, - default_light_0_COL, - p521_a01_light1, - p521_a01_light1_COL, - p521_a02_light2, - p521_a02_light2_COL, - p521_a03_light3, - p521_a03_light3_COL, - p521_a04_light4, - p521_a04_light4_COL, - - //particles prefab - default_particlesprefab_0, - p551_a01_particles, - p551_b01_particles, - p551_c01_particles, - p551_d01_particles, - - //sound prefab - default_soundprefab_0, - p561_a01_sound, - p561_b01_sound, - p561_c01_sound, - p561_d01_sound, - - // billboard prefab: - p511_a01_billboard, - p511_a01_billboard_COL, - p511_a01_billboard_LOD1, - p511_a02_billboard, - p511_a02_billboard_COL, - p511_a02_billboard_LOD1, - p511_a03_billboard, - p511_a03_billboard_COL, - p511_a03_billboard_LOD1, - p511_a04_billboard, - p511_a04_billboard_COL, - p511_a04_billboard_LOD1, - p511_a05_billboard, - p511_a05_billboard_COL, - p511_a05_billboard_LOD1, - p511_a06_billboard, - p511_a06_billboard_COL, - p511_a06_billboard_LOD1, - p511_a07_billboard, - p511_a07_billboard_COL, - p511_a07_billboard_LOD1, - p511_a08_billboard, - p511_a08_billboard_COL, - p511_a08_billboard_LOD1, - p511_a09_billboard, - p511_a09_billboard_COL, - p511_a09_billboard_LOD1, - p511_a10_billboard, - p511_a10_billboard_COL, - p511_a10_billboard_LOD1, - p511_a11_billboard, - p511_a11_billboard_COL, - p511_a11_billboard_LOD1, - p511_a12_billboard, - p511_a12_billboard_COL, - p511_a12_billboard_LOD1, - p511_a14_billboard, - //p511_a14_billboard_COL, - p511_a14_billboard_LOD1, - p511_a15_billboard, - p511_a15_billboard_COL, - p511_a15_billboard_LOD1, - p511_a16_billboard, - p511_a16_billboard_COL, - p511_a16_billboard_LOD1, - - // sign prefabs: - p531_a01_sign1, - p531_a02_sign2, - p531_a03_sign3, - p531_a04_sign4, - p531_a05_sign5, - p531_a06_sign6, - p531_a07_sign7, - p531_a08_sign8, - p531_a09_sign9, - p531_a10_sign10, - p531_a11_sign11, - p531_a12_sign12, - - p531_c_administrative_area, - p531_c_armory, - p531_c_arrow_L, - p531_c_arrow_R, - p531_c_arrow_str, - p531_c_cargo_bay, - p531_c_command_center, - p531_c_commercial_area, - p531_c_communications, - p531_c_defenses, - p531_c_docks, - p531_c_docks_COL, - p531_c_emergency_exit, - p531_c_engineering_area, - p531_c_engineering_area_COL, - p531_c_exit, - p531_c_experimental_labs, - p531_c_foundry, - p531_c_habitats, - p531_c_habitats_COL, - p531_c_hangars, - p531_c_hangars_COL, - p531_c_industrial_area, - p531_c_landing_bay, - p531_c_maintenance, - p531_c_maintenance_COL, - p531_c_military_area, - p531_c_mines, - p531_c_ore_processing, - p531_c_outer_area, - p531_c_prison, - p531_c_public_area, - p531_c_reactor, - p531_c_reactor_COL, - p531_c_research, - p531_c_restricted_area, - p531_c_security, - p531_c_sign, - p531_c_storage, - p531_c_storage_COL, - p531_c_technical_area, - p531_c_trade_port, - - p221a02_chamber_v2, - p221a02_chamber_v2_LOD1, - p221a02_chamber_v2_COL, - p221b02_chamber_v2, - p221c02_chamber_v2, - p221c02_chamber_v2_LOD1, - p221c02_chamber_v2_COL, - p221d02_chamber_v2, - p221d02_chamber_v2_LOD1, - p221d02_chamber_v2_COL, - p221e02_chamber_v2, - - p221b02_chamber_v2_LOD1, - p221e02_chamber_v2_LOD1, - - // Prefabs Beams small: - p130a01_a_straight_10m, - p130a01_a_straight_10m_COL, - p130a02_a_straight_30m, - p130a02_a_straight_30m_LOD1, - p130a02_a_straight_30m_COL, - p130b01_b_straight_10m, - p130b01_b_straight_10m_COL, - p130b02_b_straight_30m, - p130b02_b_straight_30m_LOD1, - p130b02_b_straight_30m_COL, - p130c01_c_straight_10m, - p130c01_c_straight_10m_COL, - p130c02_c_straight_30m, - p130c02_c_straight_30m_LOD1, - p130c02_c_straight_30m_COL, - p130d01_d_straight_10m, - p130d01_d_straight_10m_COL, - p130d02_d_straight_30m, - p130d02_d_straight_30m_LOD1, - p130d02_d_straight_30m_COL, - p130e01_e_straight_10m, - p130e01_e_straight_10m_COL, - p130e02_e_straight_30m, - p130e02_e_straight_30m_LOD1, - p130e02_e_straight_30m_COL, - - // Solar panels: - p321b01_solar_panel, - p321b01_solar_panel_LOD1, - p321b01_solar_panel_COL, - p321c01_solar_panel, - p321c01_solar_panel_COL, - p321c01_solar_panel_LOD1, - - p413_d02_junction_t_vertical, - p413_d02_junction_t_vertical_LOD1, - p413_d02_junction_t_vertical_COL, - p413_d04_junction_x_vertical, - p413_d04_junction_x_vertical_LOD1, - p413_d04_junction_x_vertical_COL, - - p412_f11_turn_90_up_230m, - p412_f11_turn_90_up_230m_COL, - p412_f11_turn_90_up_230m_LOD1, - p412_f12_turn_90_left_230m, - p412_f12_turn_90_left_230m_LOD1, - p412_f12_turn_90_left_230m_COL, - p412_f13_turn_90_right_230m, - p412_f13_turn_90_right_230m_LOD1, - p412_f13_turn_90_right_230m_COL, - p412_f14_turn_90_down_230m, - p412_f14_turn_90_down_230m_LOD1, - p412_f14_turn_90_down_230m_COL, - - p411_f04_straight_4, - p411_f05_straight_5, - p411_g05_straight_5, - p414_f01_entrance_60m, - p414_f01_entrance_60m_LOD1, - p414_f01_entrance_60m_COL, - p414_g01_entrance_60m, - p414_g01_entrance_60m_LOD1, - p414_g01_entrance_60m_COL, - - p571_a01_traffic_sign, - p571_a01_traffic_sign_COL, - p571_b01_traffic_sign, - p571_box01_traffic_sign, - p571_box01_traffic_sign_COL, - p571_box02_traffic_sign, - p571_c01_traffic_sign, - p571_c01_traffic_sign_COL, - p571_d01_traffic_sign, - p571_e01_traffic_sign, - p571_f01_traffic_sign, - p571_f01_traffic_sign_COL, - p571_g01_traffic_sign, - p571_h01_traffic_sign, - p571_i01_traffic_sign, - p571_i01_traffic_sign_COL, - p571_j01_traffic_sign, - p571_j01_traffic_sign_COL, - p571_k01_traffic_sign, - p571_k01_traffic_sign_COL, - p571_l01_traffic_sign, - p571_l01_traffic_sign_COL, - - //Simple object to be replace by custom import - SimpleObject, - //AsteroidPrefabTest, - FoundationFactory, - FoundationFactory_COL, - - // new prefabs - p385_a01_temple_900m, - p385_a01_temple_900m_COL, - p383_a01_church, - p383_a01_church_LOD1, - p383_a01_church_COL, - p334_a01_food_grow, - p334_a01_food_grow_COL, - p345_a01_bio_exp, - p345_a01_bio_mach_exp, - p345_a01_bio_mach_exp_COL, - p345_a01_recycle, - p345_a01_recycle_COL, - p345_a01_recycle_LOD1, - - p541_escape_pod, - p541_escape_pod_LOD1, - p541_escape_pod_COL, - p541_escape_pod_base, - p541_escape_pod_base_LOD1, - p541_escape_pod_base_COL, - p541_ventilator_body, - p541_ventilator_body_LOD1, - p541_ventilator_body_COL, - p541_ventilator_propeller, - p541_ventilator_propeller_COL, - - p349_a_tower, - p349_a_tower_LOD1, - p349_a_tower_COL, - p349_b_tower, - p349_b_tower_LOD1, - p349_b_tower_COL, - p349_c_tower, - p349_c_tower_LOD1, - p349_c_tower_COL, - - //p361_a02_hangar_panel, - - p531_b_faction, - p531_b_faction_COL, - p531_b_faction_holo, - p531_b_faction_holo_COL, - armor_hull, - armor_hull_LOD1, - armor_hull_COL, - - FourthReichMothership, - FourthReichMothership_B, - FourthReichMothership_B_COL, - FourthReichMothership_LOD1, - FourthReichMothership_B_LOD1, - RusMothership, - RusMothership_COL, - RusMothership_LOD1, - Russian_Mothership_Hummer, - Russian_Mothership_Hummer_LOD1, - Russian_Mothership_Hummer_COL, - - p231a01_armor_LOD01, - p231a02_armor_LOD01, - p231a03_armor_LOD01, - p231a04_armor_LOD01, - p231a05_armor_LOD01, - p231a06_armor_LOD01, - p231a07_armor_LOD01, - p231a08_armor_LOD01, - p231a09_armor_LOD01, - p231a10_armor_LOD01, - p231a11_armor_LOD01, - p231a12_armor_LOD01, - p231a13_armor_LOD01, - p231a14_armor_LOD01, - p231a15_armor_LOD01, - p231a16_armor_LOD01, - p231a17_armor_LOD01, - p231a18_armor_LOD01, - - p311a01_long_term_thruster_LOD1, - p312a01_short_term_thruster_latitude_LOD1, - p312a02_short_term_thruster_lateral_LOD1, - - p321d01_big_solar_panel, - p321d01_big_solar_panel_LOD1, - p321d01_big_solar_panel_COL, - - p321b01_nuclear_reactor_LOD1, - //p321c01_inertia_generator_LOD1, - p322a01_battery_LOD1, - p323a01_fuel_generator_LOD1, - p324a01_fuel_storage_a_LOD1, - p324a01_fuel_storage_a_COL, - //p324b01_fuel_storage_b_LOD01, - - p331_a01_oxygen_generator_LOD1, - p333_a01_hydroponic_building_LOD1, - p334_a01_food_grow_LOD01, - - //p342_a01_loading_bay_LOD1, - p345_a01_refinery_LOD1, - p345_a01_bio_exp_LOD1, - p345_a01_bio_exp_COL, - p345_a01_bio_mach_exp_LOD1, - //p349_a_tower_LOD01, - //p349_b_tower_LOD01, - //p349_c_tower_LOD01, - - p381_a01_building1_LOD1, - p381_b01_building2_LOD1, - - p385_a01_temple_900m_LOD1, - - p212a01_panel_large, - p212a01_panel_large_LOD1, - p212a01_panel_large_COL, - p212a01_panel_medium, - p212a01_panel_medium_COL, - p212a01_panel_medium_LOD1, - p212a01_panel_small, - p212a01_panel_small_COL, - p212b02_panel_medium, - p212b02_panel_medium_COL, - p212b02_panel_medium_LOD1, - p212b02_panel_small, - p212b02_panel_small_COL, - p212c03_panel_medium, - p212c03_panel_medium_LOD1, - p212c03_panel_medium_COL, - p212c03_panel_small, - p212c03_panel_small_COL, - p212d04_panel_medium, - p212d04_panel_medium_COL, - p212d04_panel_small, - p212d04_panel_small_COL, - p212e05_panel_medium, - p212e05_panel_medium_COL, - p212e05_panel_small, - p212e05_panel_small_COL, - - p341_c01_closed_dock_v1, - p341_c01_closed_dock_v1_COL, - p341_c01_closed_dock_v1_LOD1, - - MysteriousBox_matt_5m, - MysteriousBox_spec_5m, - MysteriousBox_mid_5m, - - p212b02_panel_large, - p212b02_panel_large_COL, - p212b02_panel_large_LOD1, - p212c03_panel_large, - p212c03_panel_large_LOD1, - p212c03_panel_large_COL, - p212d04_panel_large, - p212d04_panel_large_LOD1, - p212d04_panel_large_COL, - p212e05_panel_large, - p212e05_panel_large_LOD1, - p212e05_panel_large_COL, - p212f01_panel_large, - p212f01_panel_large_COL, - - Alien_gate, - Alien_gate_LOD1, - - mship_body, - mship_body_LOD1, - mship_engine, - mship_engine_LOD1, - mship_shield_back_large_left, - mship_shield_back_large_left_LOD1, - mship_shield_back_large_right, - mship_shield_back_large_right_LOD1, - mship_shield_back_small_left, - mship_shield_back_small_left_LOD1, - mship_shield_back_small_right, - mship_shield_back_small_right_LOD1, - mship_shield_front_large_left, - mship_shield_front_large_left_LOD1, - mship_shield_front_large_right, - mship_shield_front_large_right_LOD1, - mship_shield_front_small_left, - mship_shield_front_small_left_LOD1, - mship_shield_front_small_right, - mship_shield_front_small_right_LOD1, - mship_shield_front_small02_left, - mship_shield_front_small02_left_LOD1, - mship_shield_front_small02_right, - mship_shield_front_small02_right_LOD1, - - p411_d02_straight_40m_with_hole_COL, - p411_d03_straight_60m_COL, - p411_d04_straight_120m_COL, - p411_d05_straight_180m_COL, - p411_d02_straight_40m_with_hole_LOD1, - p411_d03_straight_60m_LOD1, - p411_d04_straight_120m_LOD1, - p411_d05_straight_180m_LOD1, - - p381_d03_hospital, - p381_d03_hospital_LOD1, - p381_d03_hospital_COL, - p381_d05_food_grow, - p381_d05_food_grow_LOD1, - p381_c01_building3_LOD1, - p381_c01_building4, - p381_c01_building4_COL, - p381_c01_building4_LOD1, - - Cable_corner_25m, - Cable_corner_25m_COL, - Cable_S_45m, - Cable_S_45m_COL, - Cable_straight_180, - Cable_straight_180_COL, - Cable_straight_45, - Cable_straight_45_COL, - Cable_straight_90, - Cable_straight_90_COL, - Connection_box, - Connection_box_COL, - - //p411_d02_straight_40m_with_hole_COL, - //p411_d02_straight_40m_with_hole_LOD1, - //p411_d03_straight_60m_COL, - //p411_d03_straight_60m_LOD1, - //p411_d04_straight_120m_COL, - //p411_d04_straight_120m_LOD1, - //p411_d05_straight_180m_COL, - //p411_d05_straight_180m_LOD1, - - p411_f01_straight_1_COL, - p411_f02_straight_2_COL, - p411_f03_straight_3_COL, - p411_f04_straight_4_COL, - p411_f05_straight_5_COL, - - p411_g02_straight_2_COL, - p411_g03_straight_3_COL, - p411_g04_straight_4_COL, - p411_g05_straight_5_COL, - - cargo_box_1, - cargo_box_2, - cargo_box_3, - cargo_box_4, - cargo_box_5, - cargo_box_6, - cargo_box_7, - cargo_box_8, - cargo_box_9, - cargo_box_10, - cargo_box_small, - p541_security_hub, - p541_security_hub_LOD1, - p541_security_hub_COL, - Alarm, - Bank_node, - Bank_node_COL, - Cam, - Alarm_off, - - p361_b01_long_distance_antenna_big, - p361_b01_long_distance_antenna_big_LOD1, - p361_b01_long_distance_antenna_big_COL, - p361_b01_long_distance_antenna_dish, - p361_b01_long_distance_antenna_dish_COL, - p361_b01_long_distance_antenna_dish_LOD1, - fourth_reich_wreck, - fourth_reich_wreck_LOD1, - fourth_reich_wreck_COL, - p344_a03_container, - p231b01_armor, - p231b01_armor_LOD1, - p231b01_armor_COL, - p231b01_armor_corner, - p231b01_armor_corner_LOD1, - p231b01_armor_corner_COL, - p231b01_armor_edge, - p231b01_armor_edge_COL, - p231b01_armor_edge_LOD1, - p231b01_armor_hole, - p231b01_armor_hole_LOD1, - p231b01_armor_hole_COL, - - p150a03_shelf_1, - p150a03_shelf_1_LOD1, - p150a03_shelf_1_COL, - p150a02_shelf_1X2, - p150a02_shelf_1X2_LOD1, - p150a02_shelf_1X2_COL, - p150a01_shelf_1X3, - p150a01_shelf_1X3_LOD1, - p150a01_shelf_1X3_COL, - //LargeShipMachineGunBarrel_LOD1, - //LargeShipMachineGunBase_LOD1, - p221b01_chamber_v1_COL, - p221b02_chamber_v2_COL, - p221e02_chamber_v2_COL, - p382_d01_bridge4_LOD1, - p382_c01_bridge3_LOD1, - p382_b01_bridge2_LOD1, - p362_a01_short_distance_antenna_LOD1, - p361_a01_long_distance_antenna_LOD1, - p351_a01_weapon_mount_LOD1, - p411_e01_straight_1_LOD1, - p411_e02_straight_2_LOD1, - p411_e03_straight_3_LOD1, - p411_e04_straight_4_LOD1, - p411_e05_straight_5_LOD1, - p413_d01_junction_t_horizontal_LOD1, - p413_d03_junction_x_horizontal_LOD1, - p412_b21_turn_s_up_LOD1, - p412_b22_turn_s_left_LOD1, - p412_b23_turn_s_right_LOD1, - p412_b24_turn_s_down_LOD1, - p412_b11_turn_90_up_160m_LOD1, - p412_b12_turn_90_left_160m_LOD1, - p412_b13_turn_90_right_160m_LOD1, - p412_b14_turn_90_down_160m_LOD1, - p412_b01_turn_90_up_80m_LOD1, - p412_b02_turn_90_left_80m_LOD1, - p412_b03_turn_90_right_80m_LOD1, - p412_b04_turn_90_down_80m_LOD1, - p413_c01_junction_t_horizontal_COL, - p411_c05_straight_180m_COL, - p411_c05_straight_180m_LOD1, - p414_b02_entrance_60m_LOD1, - - p611_asteroid_part_A, - p611_asteroid_part_A_LOD1, - p611_asteroid_part_B, - p611_asteroid_part_B_LOD1, - p363_a01_big_antenna_300m, - p363_a01_big_antenna_300m_LOD1, - p363_a01_big_antenna_300m_COL, - p130d02_d_straight_300m, - p130d02_d_straight_300m_COL, - p130d02_d_straight_300m_LOD1, - p130j01_j_straight_300m, - p130j01_j_straight_300m_LOD1, - p130j01_j_straight_300m_COL, - p120c02_c_straight_400m, - p120c02_c_straight_400m_LOD1, - p120c02_c_straight_400m_COL, - p110b03_lattice_beam_straight_420m, - p110b03_lattice_beam_straight_420m_COL, - p110b03_lattice_beam_straight_420m_LOD1, - p110b04_lattice_beam_straight_420m_with_panels, - p110b04_lattice_beam_straight_420m_with_panels_LOD1, - p110b04_lattice_beam_straight_420m_with_panels_COL, - p345_a01_bio_exp_center, - p345_a01_bio_exp_center_LOD1, - p345_a01_bio_exp_center_COL, - p345_a01_bio_exp_tanks, - p345_a01_bio_exp_tanks_LOD1, - p345_a01_bio_exp_tanks_COL, - p541_ventilator_body_standalone, - p541_ventilator_body_standalone_LOD1, - p541_ventilator_body_standalone_COL, - p541_ventilator_propeller_standalone, - p541_ventilator_propeller_standalone_COL, - p541_ventilator_propeller_standalone_LOD1, - - p321c03_centrifuge, - p321c03_centrifuge_centre, - p321c03_centrifuge_centre_LOD1, - p321c03_centrifuge_centre_COL, - p321c03_centrifuge_COL, - p321c03_centrifuge_LOD1, - p321c04_box_generator, - p321c04_box_generator_COL, - p321c04_box_generator_LOD1, - p321c04_two_big_inertia, - p321c04_two_big_inertia_LOD1, - p321c05_centrifuge_big, - p321c05_centrifuge_big_COL, - p321c05_centrifuge_big_LOD1, - p321c05_centrifuge_centre_big, - p321c05_centrifuge_centre_big_LOD1, - p363_a01_big_antenna_1500m, - p363_a01_big_antenna_1500m_COL, - p363_a01_big_antenna_1500m_LOD1, - p541_ventilator_propeller_big, - p541_ventilator_propeller_big_COL, - p541_ventilator_propeller_big_LOD1, - p321c02_generator_wall_big, - p321c02_generator_wall_big_COL, - p321c02_generator_wall_big_LOD1, - p321c02_inertia_generator_center_big, - p321c02_inertia_generator_center_big_LOD1, - p321c02_inertia_generator_center_big_COL, - p321c02_inertia_generator_center_vert, - p321c02_inertia_generator_center_vert_LOD1, - - p321c06_inertia_B_centre, - p321c06_inertia_B_centre_LOD1, - p321c06_inertia_B_centre_COL, - p321c06_inertia_generator_B, - p321c06_inertia_generator_B_COL, - p321c06_inertia_generator_B_LOD1, - p4221_a01_cooling_device_ventilator_1, - p4221_a01_cooling_device_ventilator_2, - p4221_a01_cooling_device_wall_340x400, - p4221_a01_cooling_device_wall_340x400_COL, - p4221_a01_cooling_device_wall_340x400_LOD1, - p4222_a01_pipes_connector, - p4222_a01_pipes_connector_center, - p4222_a01_pipes_connector_center_LOD1, - p4222_a01_pipes_connector_COL, - p4222_a01_pipes_connector_LOD1, - p4223_a01_open_pipe, - p4223_a01_open_pipe_COL, - p4223_a01_open_pipe_LOD1, - p311b01_long_term_thruster, - p311b01_long_term_thruster_LOD1, - p321c07_generator, - p321c07_generator_center, - p321c07_generator_center_LOD1, - p321c07_generator_COL, - p321c07_generator_LOD1, - p321c07_generator_propeller_1, - p321c07_generator_propeller_1_COL, - p321c07_generator_propeller_2, - p321c07_generator_propeller_2_COL, - p221k01_chamber_v2, - p221k01_chamber_v2_LOD1, - - p581_a01_barrel_biohazard, - p581_a01_barrel_biohazard_2, - p581_a01_nuke_barrel, - p581_a01_red_barrel, - p581_a01_simple_barrel, - p581_a01_simple_barrel_2, - cargo_box_11, - cargo_box_12, - Barrel_prop_A, - Barrel_prop_B, - Barrel_prop_C, - //Barrel_prop_D, - //Barrel_prop_E, - CargoBox_prop_A, - CargoBox_prop_B, - CargoBox_prop_C, - CannonBall_Capsule_1, - CannonBall_Capsule_1_COL, - Missile_pack01, - Missile_pack01_COL, - Missile_pack02, - Missile_pack02_COL, - Missile_plazma01, - Missile_plazma01_COL, - Missile_stack_biochem01, - Missile_stack_biochem01_COL, - - p231a01_armor_COL, - p231a02_armor_COL, - p231a03_armor_COL, - p231a04_armor_COL, - p231a05_armor_COL, - p231a06_armor_COL, - p231a07_armor_COL, - p231a08_armor_COL, - p231a09_armor_COL, - p231a10_armor_COL, - p231a11_armor_COL, - p231a12_armor_COL, - p231a13_armor_COL, - p231a14_armor_COL, - p231a15_armor_COL, - p231a16_armor_COL, - p231a17_armor_COL, - p231a18_armor_COL, - p110a12_solid_beam_junction_x_weak_COL, - p110a12_solid_beam_junction_x_weak_LOD1, - p110a22_solid_beam_junction_t_weak_COL, - p110a22_solid_beam_junction_t_weak_LOD1, - p110a05_solid_beam_straight_80m_COL, - p110a05_solid_beam_straight_80m_LOD1, - p110b01_lattice_beam_straight_10m_COL, - p110b01_lattice_beam_straight_10m_LOD1, - p110b04_lattice_beam_straight_60m_with_panels_COL, - p110b04_lattice_beam_straight_60m_with_panels_LOD1, - p110b21_lattice_beam_junction_t_strong_COL, - p110b21_lattice_beam_junction_t_strong_LOD1, - p110b03_lattice_beam_straight_60m_COL, - p110b03_lattice_beam_straight_60m_LOD1, - p110b22_lattice_beam_junction_t_weak_COL, - p110b22_lattice_beam_junction_t_weak_LOD1, - p142a11_cage_pillar_COL, - p142a11_cage_pillar_LOD1, - p211d02_panel_60mx60m_COL, - p211d02_panel_60mx60m_LOD1, - p211g01_panel_120mx60m_COL, - p211g01_panel_120mx60m_LOD1, - p211g02_panel_60mx60m_COL, - p211g02_panel_60mx60m_LOD1, - p344_a03_container_COL, - p344_a03_container_LOD1, - p415_c03_door2_a_left_COL, - p415_c03_door2_a_left_LOD1, - p415_c03_door2_a_right_COL, - p415_c03_door2_a_right_LOD1, - p415_c03_door2_b_right_COL, - p415_c03_door2_b_right_LOD1, - p415_c03_door2_b_left_COL, - p415_c03_door2_b_left_LOD1, - p415_c01_doorcase_COL, - p415_c01_doorcase_LOD1, - p421_a02_pipe_straight_40m_COL, - p421_a02_pipe_straight_40m_LOD1, - p421_a03_pipe_straight_10m_COL, - p421_a03_pipe_straight_10m_LOD1, - p421_a01_pipe_straight_80m_COL, - p421_a01_pipe_straight_80m_LOD1, - p423_a01_pipe_junction_COL, - p423_a01_pipe_junction_LOD1, - p422_a01_pipe_turn_90_COL, - p422_a01_pipe_turn_90_LOD1, - p120a22_strong_lattice_junction_t_weak_COL, - p120a22_strong_lattice_junction_t_weak_LOD1, - p120a02_strong_lattice_straight_60m_COL, - p120a02_strong_lattice_straight_60m_LOD1, - p120a03_strong_lattice_straight_120m_COL, - p120a03_strong_lattice_straight_120m_LOD1, - p411_g01_straight_1_COL, - p411_g01_straight_1_LOD1, - p324b01_fuel_storage_b_COL, - p324b01_fuel_storage_b_LOD1, - p581_a01_o2_barrel, - p581_a01_o2_barrel_COL, - - p211a01_panel_120mx60m_LOD1, - p211a02_panel_60mx60m_LOD1, - p211a03_panel_60mx30m_LOD1, - p211c01_panel_120mx60m_LOD1, - p211c02_panel_60mx60m_LOD1, - p211c03_panel_60mx30m_LOD1, - p211b01_panel_120mx60m_LOD1, - p211b02_panel_60mx60m_LOD1, - p211b03_panel_60mx30m_LOD1, - - Nuclear_Warhead_closed, - Nuclear_Warhead_closed_COL, - Nuclear_Warhead_open, - Nuclear_Warhead_open_COL, - CargoBox_prop_D, - p581_a01_nuke_barrel_1, - p581_a01_simple_barrel_3, - p221L01_chamber_v1, - p221L01_chamber_v1_LOD1, - p221L01_chamber_v1_COL, - - - p221m01_chamber_bottom_v1, - p221m01_chamber_bottom_v1_LOD1, - p221m01_chamber_bottom_v1_COL, - p221m01_chamber_center_v1, - p221m01_chamber_center_v1_LOD1, - p221m01_chamber_center_v1_COL, - p221m01_chamber_top_v1, - p221m01_chamber_top_v1_LOD1, - p221m01_chamber_top_v1_COL, - p321e01_solar_panel, - p321e01_solar_panel_LOD1, - p321e01_solar_panel_COL, - p110a06_solid_beam_straight_420m, - - gattling_ammo_belt, - gattling_ammo_belt_COL, - - p311b01_cut_thruster, - p311b01_cut_thruster_LOD1, - p311b01_cut_thruster_COL, - p312b01_cut_thruster_lateral, - p312b01_cut_thruster_lateral_LOD1, - p312b01_cut_thruster_lateral_COL, - p312b02_cut_thruster_latitude, - p312b02_cut_thruster_latitude_LOD1, - p312b02_cut_thruster_latitude_COL, - alien_detector_unit, - alien_detector_unit_COL, - p381_c01_building5, - p381_c01_building5_LOD1, - p381_c01_building5_COL, - p381_c01_building6, - p381_c01_building6_LOD1, - p381_c01_building6_COL, - p381_c01_building7, - p381_c01_building7_LOD1, - p381_c01_building7_COL, - p221n01_chamber_v1, - p221n01_chamber_v1_LOD1, - p221n01_chamber_v1_COL, - p531_d_medic_cross, - p531_d_medic_cross_COL, - - p541_screen_A, - p541_screen_A_LOD1, - p541_screen_A_COL, - p541_screen_B, - p541_screen_B_COL, - p541_screen_B_LOD1, - p541_terminal_A, - p541_terminal_A_COL, - p541_terminal_A_LOD1, - - alien_artefact, - alien_artefact_COL, - - bomb, - bomb_COL, - - p581_a01_universal_barrel_COL, - rail_gun, - rail_gun_COL, - rail_gun_LOD1, - p345_a01_recycle_sphere, - p345_a01_recycle_sphere_LOD1, - p345_a01_recycle_sphere_COL, - prison, - prison_COL, - vendor, - vendor_COL, - hangar_screen, - hangar_screen_COL, - - ScannerPlane, - ScannerRays, - Nuclear_Warhead_open_LOD1, - Nuclear_Warhead_closed_LOD1, - - p511_a17_billboard_portrait_1, - p511_a17_billboard_portrait_1_COL, - p412_b24_turn_s_down_COL, - p414_b02_entrance_60m_COL, - p415_d01_doorcase_LOD1, - p411_g02_straight_2_LOD1, - p411_g03_straight_3_LOD1, - p411_g04_straight_4_LOD1, - p411_g05_straight_5_LOD1, - p511_a14_billboard_COL, - p413_g01_junction_6axes_LOD1, - - p511_a18_billboard, - p511_a18_billboard_COL, - p511_a18_billboard_LOD1, - - p511_a19_billboard, - p511_a19_billboard_COL, - p511_a19_billboard_LOD1, - - p511_a17_billboard_portrait_2, - } - - public enum MyModelTexturesEnum - { - }; - - static partial class MyModels - { - static void InitModels() - { - MyMwcLog.WriteLine("MyModels.InitModels - START"); - MyMwcLog.IncreaseIndent(); - - if (m_models != null) - return; //models already inited - - m_models = new MyModel[Enum.GetValues(typeof(MyModelsEnum)).Length]; - m_modelsByAssertName = new Dictionary(); - - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // Static asteroids - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // Indestructible_01: 10-20m - // Indestructible_02: 30-100m - // Indestructible_03: 300-5000m - // Indestructible_04: 10000m - - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10m\\StaticAsteroid10m_A_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid10m_A_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10m\\StaticAsteroid10m_A_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid10m_A_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10m\\StaticAsteroid10m_A_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid10m_A_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\20m\\StaticAsteroid20m_A_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid20m_A_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\20m\\StaticAsteroid20m_A_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid20m_A_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\20m\\StaticAsteroid20m_A_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid20m_A_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\30m\\StaticAsteroid30m_A_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid30m_A_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\30m\\StaticAsteroid30m_A_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid30m_A_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\30m\\StaticAsteroid30m_A_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid30m_A_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\50m\\StaticAsteroid50m_A_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid50m_A_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\50m\\StaticAsteroid50m_A_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid50m_A_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\50m\\StaticAsteroid50m_A_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid50m_A_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\100m\\StaticAsteroid100m_A_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid100m_A_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\100m\\StaticAsteroid100m_A_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid100m_A_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\100m\\StaticAsteroid100m_A_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid100m_A_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\300m\\StaticAsteroid300m_A_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid300m_A_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\300m\\StaticAsteroid300m_A_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid300m_A_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\300m\\StaticAsteroid300m_A_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid300m_A_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\500m\\StaticAsteroid500m_A_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid500m_A_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\500m\\StaticAsteroid500m_A_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid500m_A_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\500m\\StaticAsteroid500m_A_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid500m_A_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\1000m\\StaticAsteroid1000m_A_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid1000m_A_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\1000m\\StaticAsteroid1000m_A_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid1000m_A_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\1000m\\StaticAsteroid1000m_A_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid1000m_A_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\2000m\\StaticAsteroid2000m_A_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid2000m_A_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\2000m\\StaticAsteroid2000m_A_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid2000m_A_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\2000m\\StaticAsteroid2000m_A_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid2000m_A_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\5000m\\StaticAsteroid5000m_A_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid5000m_A_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\5000m\\StaticAsteroid5000m_A_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid5000m_A_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\5000m\\StaticAsteroid5000m_A_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid5000m_A_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10000m\\StaticAsteroid10000m_A_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid10000m_A_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10000m\\StaticAsteroid10000m_A_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid10000m_A_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10000m\\StaticAsteroid10000m_A_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid10000m_A_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - //AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\40000m\\StaticAsteroid40000m_A_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid40000m_A_LOD0, MyFakes.UNLOAD_OPTIMIZATION_STATIC_ASTEROIDS)); - //AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\40000m\\StaticAsteroid40000m_A_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid40000m_A_LOD1, MyFakes.UNLOAD_OPTIMIZATION_STATIC_ASTEROIDS)); - //AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\40000m\\StaticAsteroid40000m_A_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid40000m_A_LOD2, MyFakes.UNLOAD_OPTIMIZATION_STATIC_ASTEROIDS)); - - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10m\\StaticAsteroid10m_B_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid10m_B_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10m\\StaticAsteroid10m_B_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid10m_B_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10m\\StaticAsteroid10m_B_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid10m_B_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\20m\\StaticAsteroid20m_B_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid20m_B_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\20m\\StaticAsteroid20m_B_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid20m_B_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\20m\\StaticAsteroid20m_B_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid20m_B_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\30m\\StaticAsteroid30m_B_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid30m_B_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\30m\\StaticAsteroid30m_B_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid30m_B_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\30m\\StaticAsteroid30m_B_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid30m_B_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\50m\\StaticAsteroid50m_B_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid50m_B_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\50m\\StaticAsteroid50m_B_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid50m_B_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\50m\\StaticAsteroid50m_B_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid50m_B_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\100m\\StaticAsteroid100m_B_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid100m_B_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\100m\\StaticAsteroid100m_B_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid100m_B_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\100m\\StaticAsteroid100m_B_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid100m_B_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\300m\\StaticAsteroid300m_B_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid300m_B_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\300m\\StaticAsteroid300m_B_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid300m_B_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\300m\\StaticAsteroid300m_B_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid300m_B_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\500m\\StaticAsteroid500m_B_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid500m_B_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\500m\\StaticAsteroid500m_B_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid500m_B_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\500m\\StaticAsteroid500m_B_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid500m_B_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\1000m\\StaticAsteroid1000m_B_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid1000m_B_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\1000m\\StaticAsteroid1000m_B_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid1000m_B_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\1000m\\StaticAsteroid1000m_B_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid1000m_B_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\2000m\\StaticAsteroid2000m_B_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid2000m_B_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\2000m\\StaticAsteroid2000m_B_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid2000m_B_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\2000m\\StaticAsteroid2000m_B_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid2000m_B_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\5000m\\StaticAsteroid5000m_B_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid5000m_B_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\5000m\\StaticAsteroid5000m_B_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid5000m_B_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\5000m\\StaticAsteroid5000m_B_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid5000m_B_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10000m\\StaticAsteroid10000m_B_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid10000m_B_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10000m\\StaticAsteroid10000m_B_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid10000m_B_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10000m\\StaticAsteroid10000m_B_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid10000m_B_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); - /* Removed - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10m\\StaticAsteroid10m_C_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid10m_C_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10m\\StaticAsteroid10m_C_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid10m_C_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\20m\\StaticAsteroid20m_C_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid20m_C_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\20m\\StaticAsteroid20m_C_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid20m_C_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\30m\\StaticAsteroid30m_C_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid30m_C_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\30m\\StaticAsteroid30m_C_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid30m_C_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\50m\\StaticAsteroid50m_C_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid50m_C_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\50m\\StaticAsteroid50m_C_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid50m_C_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\100m\\StaticAsteroid100m_C_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid100m_C_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\100m\\StaticAsteroid100m_C_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid100m_C_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\300m\\StaticAsteroid300m_C_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid300m_C_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\300m\\StaticAsteroid300m_C_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid300m_C_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\500m\\StaticAsteroid500m_C_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid500m_C_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\500m\\StaticAsteroid500m_C_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid500m_C_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\1000m\\StaticAsteroid1000m_C_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid1000m_C_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\1000m\\StaticAsteroid1000m_C_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid1000m_C_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\2000m\\StaticAsteroid2000m_C_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid2000m_C_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\2000m\\StaticAsteroid2000m_C_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid2000m_C_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\5000m\\StaticAsteroid5000m_C_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid5000m_C_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\5000m\\StaticAsteroid5000m_C_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid5000m_C_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10000m\\StaticAsteroid10000m_C_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid10000m_C_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10000m\\StaticAsteroid10000m_C_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid10000m_C_LOD1)); - - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10m\\StaticAsteroid10m_D_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid10m_D_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10m\\StaticAsteroid10m_D_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid10m_D_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\20m\\StaticAsteroid20m_D_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid20m_D_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\20m\\StaticAsteroid20m_D_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid20m_D_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\30m\\StaticAsteroid30m_D_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid30m_D_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\30m\\StaticAsteroid30m_D_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid30m_D_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\50m\\StaticAsteroid50m_D_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid50m_D_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\50m\\StaticAsteroid50m_D_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid50m_D_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\100m\\StaticAsteroid100m_D_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid100m_D_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\100m\\StaticAsteroid100m_D_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid100m_D_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\300m\\StaticAsteroid300m_D_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid300m_D_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\300m\\StaticAsteroid300m_D_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid300m_D_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\500m\\StaticAsteroid500m_D_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid500m_D_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\500m\\StaticAsteroid500m_D_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid500m_D_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\1000m\\StaticAsteroid1000m_D_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid1000m_D_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\1000m\\StaticAsteroid1000m_D_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid1000m_D_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\2000m\\StaticAsteroid2000m_D_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid2000m_D_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\2000m\\StaticAsteroid2000m_D_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid2000m_D_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\5000m\\StaticAsteroid5000m_D_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid5000m_D_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\5000m\\StaticAsteroid5000m_D_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid5000m_D_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10000m\\StaticAsteroid10000m_D_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid10000m_D_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10000m\\StaticAsteroid10000m_D_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid10000m_D_LOD1)); - - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10m\\StaticAsteroid10m_E_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid10m_E_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10m\\StaticAsteroid10m_E_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid10m_E_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\20m\\StaticAsteroid20m_E_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid20m_E_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\20m\\StaticAsteroid20m_E_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid20m_E_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\30m\\StaticAsteroid30m_E_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid30m_E_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\30m\\StaticAsteroid30m_E_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid30m_E_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\50m\\StaticAsteroid50m_E_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid50m_E_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\50m\\StaticAsteroid50m_E_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid50m_E_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\100m\\StaticAsteroid100m_E_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid100m_E_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\100m\\StaticAsteroid100m_E_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid100m_E_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\300m\\StaticAsteroid300m_E_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid300m_E_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\300m\\StaticAsteroid300m_E_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid300m_E_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\500m\\StaticAsteroid500m_E_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid500m_E_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\500m\\StaticAsteroid500m_E_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid500m_E_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\1000m\\StaticAsteroid1000m_E_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid1000m_E_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\1000m\\StaticAsteroid1000m_E_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid1000m_E_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\2000m\\StaticAsteroid2000m_E_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid2000m_E_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\2000m\\StaticAsteroid2000m_E_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid2000m_E_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\5000m\\StaticAsteroid5000m_E_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid5000m_E_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\5000m\\StaticAsteroid5000m_E_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid5000m_E_LOD1)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10000m\\StaticAsteroid10000m_E_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid10000m_E_LOD0)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10000m\\StaticAsteroid10000m_E_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid10000m_E_LOD1)); - */ - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // Large ships - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\LargeShip_Kai", MyModelsEnum.Kai, MyModelsEnum.Kai_LOD1, MyModelsEnum.Kai_COL); - - AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\LargeShip_Saya", MyModelsEnum.MotherShipSaya, MyModelsEnum.MotherShipSaya_LOD1, MyModelsEnum.MotherShipSaya_COL); - - AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\LargeShip_Ardant", MyModelsEnum.Ardant, MyModelsEnum.Ardant_LOD1, MyModelsEnum.Ardant_COL); - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // Guns for mining ships - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // Large debris fields - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // Editor - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - ////////////////////////////////////////////////////////////////////////// - //* - ////////////////////////////////////////////////////////////////////////// - AddEntityModels("Models2\\Prefabs\\04_Connections\\03_Passage\\01\\01_Straight\\p430_a01_passage_10m", MyModelsEnum.p430_a01_passage_10m, MyModelsEnum.p430_a01_passage_10m_LOD1, MyModelsEnum.p430_a01_passage_10m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\03_Passage\\01\\01_Straight\\p430_a02_passage_40m", MyModelsEnum.p430_a02_passage_40m, MyModelsEnum.p430_a02_passage_40m_LOD1, MyModelsEnum.p430_a02_passage_40m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\02_Pipe\\01\\04_Base\\p424_a01_pipe_base", MyModelsEnum.p424_a01_pipe_base, null, MyModelsEnum.p424_a01_pipe_base_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\02_Pipe\\01\\03_Junction\\p423_a01_pipe_junction", MyModelsEnum.p423_a01_pipe_junction, MyModelsEnum.p423_a01_pipe_junction_LOD1, MyModelsEnum.p423_a01_pipe_junction_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\02_Pipe\\01\\02_Turn\\p422_a01_pipe_turn_90", MyModelsEnum.p422_a01_pipe_turn_90, MyModelsEnum.p422_a01_pipe_turn_90_LOD1, MyModelsEnum.p422_a01_pipe_turn_90_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\02_Pipe\\01\\01_Straight\\p421_a01_pipe_straight_80m", MyModelsEnum.p421_a01_pipe_straight_80m, MyModelsEnum.p421_a01_pipe_straight_80m_LOD1, MyModelsEnum.p421_a01_pipe_straight_80m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\02_Pipe\\01\\01_Straight\\p421_a02_pipe_straight_40m", MyModelsEnum.p421_a02_pipe_straight_40m, MyModelsEnum.p421_a02_pipe_straight_40m_LOD1, MyModelsEnum.p421_a02_pipe_straight_40m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\02_Pipe\\01\\01_Straight\\p421_a03_pipe_straight_10m", MyModelsEnum.p421_a03_pipe_straight_10m, MyModelsEnum.p421_a03_pipe_straight_10m_LOD1, MyModelsEnum.p421_a03_pipe_straight_10m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\07\\05_Junction\\p413_g01_junction_6axes", MyModelsEnum.p413_g01_junction_6axes, MyModelsEnum.p413_g01_junction_6axes_LOD1, MyModelsEnum.p413_g01_junction_6axes_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\07\\04_Entrance\\p414_g02_entrance_60m", MyModelsEnum.p414_g02_entrance_60m, MyModelsEnum.p414_g02_entrance_60m_LOD1, MyModelsEnum.p414_g02_entrance_60m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\07\\02_Turn90\\00_0m\\p410_g01_turn_90_right_0m", MyModelsEnum.p410_g01_turn_90_right_0m, MyModelsEnum.p410_g01_turn_90_right_0m_LOD1, MyModelsEnum.p410_g01_turn_90_right_0m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\07\\01_Straight\\p411_g01_straight_1", MyModelsEnum.p411_g01_straight_1, MyModelsEnum.p411_g01_straight_1_LOD1, MyModelsEnum.p411_g01_straight_1_COL); - //AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\07\\01_Straight\\p411_g02_straight_2", MyMeshDrawTechnique.MESH, MyModelsEnum.p411_g02_straight_2)); - //AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\07\\01_Straight\\p411_g03_straight_3", MyMeshDrawTechnique.MESH, MyModelsEnum.p411_g03_straight_3)); - //AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\07\\01_Straight\\p411_g04_straight_4", MyMeshDrawTechnique.MESH, MyModelsEnum.p411_g04_straight_4)); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\07\\01_Straight\\p411_g02_straight_2", MyModelsEnum.p411_g02_straight_2, MyModelsEnum.p411_g02_straight_2_LOD1, MyModelsEnum.p411_g02_straight_2_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\07\\01_Straight\\p411_g03_straight_3", MyModelsEnum.p411_g03_straight_3, MyModelsEnum.p411_g03_straight_3_LOD1, MyModelsEnum.p411_g03_straight_3_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\07\\01_Straight\\p411_g04_straight_4", MyModelsEnum.p411_g04_straight_4, MyModelsEnum.p411_g04_straight_4_LOD1, MyModelsEnum.p411_g04_straight_4_COL); - //AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\04_Entrance\\p414_f02_entrance_60m", MyMeshDrawTechnique.MESH, MyModelsEnum.p414_f02_entrance_60m)); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\03_TurnS\\p412_f21_turn_s_up", MyModelsEnum.p412_f21_turn_s_up, null, MyModelsEnum.p412_f21_turn_s_up_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\03_TurnS\\p412_f22_turn_s_left", MyModelsEnum.p412_f22_turn_s_left, null, MyModelsEnum.p412_f22_turn_s_left_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\03_TurnS\\p412_f23_turn_s_right", MyModelsEnum.p412_f23_turn_s_right, null, MyModelsEnum.p412_f23_turn_s_right_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\03_TurnS\\p412_f24_turn_s_down", MyModelsEnum.p412_f24_turn_s_down, null, MyModelsEnum.p412_f24_turn_s_down_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\02_Turn90\\01_230m\\p412_f01_turn_90_up_230m", MyModelsEnum.p412_f01_turn_90_up_230m, null, null); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\02_Turn90\\01_230m\\p412_f02_turn_90_left_230m", MyModelsEnum.p412_f02_turn_90_left_230m, MyModelsEnum.p412_f02_turn_90_left_230m_LOD1, MyModelsEnum.p412_f02_turn_90_left_230m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\02_Turn90\\01_230m\\p412_f03_turn_90_right_230m", MyModelsEnum.p412_f03_turn_90_right_230m, MyModelsEnum.p412_f03_turn_90_right_230m_LOD1, MyModelsEnum.p412_f03_turn_90_right_230m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\02_Turn90\\01_230m\\p412_f04_turn_90_down_230m", MyModelsEnum.p412_f04_turn_90_down_230m, null, MyModelsEnum.p412_f04_turn_90_down_230m_COL); - //AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\01_Straight\\p411_f01_straight_1", MyMeshDrawTechnique.MESH, MyModelsEnum.p411_f01_straight_1)); - //AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\01_Straight\\p411_f02_straight_2", MyMeshDrawTechnique.MESH, MyModelsEnum.p411_f02_straight_2)); - //AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\01_Straight\\p411_f03_straight_3", MyMeshDrawTechnique.MESH, MyModelsEnum.p411_f03_straight_3)); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\01_Straight\\p411_f01_straight_1", MyModelsEnum.p411_f01_straight_1, null, MyModelsEnum.p411_f01_straight_1_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\01_Straight\\p411_f02_straight_2", MyModelsEnum.p411_f02_straight_2, null, MyModelsEnum.p411_f02_straight_2_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\01_Straight\\p411_f03_straight_3", MyModelsEnum.p411_f03_straight_3, null, MyModelsEnum.p411_f03_straight_3_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\05\\04_Entrance\\p414_e01_entrance_60m", MyModelsEnum.p414_e01_entrance_60m, MyModelsEnum.p414_e01_entrance_60m_LOD1, MyModelsEnum.p414_e01_entrance_60m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\05\\01_Straight\\p411_e01_straight_1", MyModelsEnum.p411_e01_straight_1, MyModelsEnum.p411_e01_straight_1_LOD1, MyModelsEnum.p411_e01_straight_1_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\05\\01_Straight\\p411_e02_straight_2", MyModelsEnum.p411_e02_straight_2, MyModelsEnum.p411_e02_straight_2_LOD1, MyModelsEnum.p411_e02_straight_2_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\05\\01_Straight\\p411_e03_straight_3", MyModelsEnum.p411_e03_straight_3, MyModelsEnum.p411_e03_straight_3_LOD1, MyModelsEnum.p411_e03_straight_3_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\05\\01_Straight\\p411_e04_straight_4", MyModelsEnum.p411_e04_straight_4, MyModelsEnum.p411_e04_straight_4_LOD1, MyModelsEnum.p411_e04_straight_4_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\05\\01_Straight\\p411_e05_straight_5", MyModelsEnum.p411_e05_straight_5, MyModelsEnum.p411_e05_straight_5_LOD1, MyModelsEnum.p411_e05_straight_5_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\04\\06_Other\\01_Door\\p415_d01_doorcase", MyModelsEnum.p415_d01_doorcase, MyModelsEnum.p415_d01_doorcase_LOD1, MyModelsEnum.p415_d01_doorcase_COL); - AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\04\\06_Other\\01_Door\\p415_d02_door1", MyMeshDrawTechnique.MESH, MyModelsEnum.p415_d02_door1)); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\04\\06_Other\\01_Door\\p415_d03_door2_a", MyModelsEnum.p415_d03_door2_a, null, MyModelsEnum.p415_d03_door2_a_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\04\\06_Other\\01_Door\\p415_d03_door2_b", MyModelsEnum.p415_d03_door2_b, null, MyModelsEnum.p415_d03_door2_b_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\04\\05_Junction\\p413_d01_junction_t_horizontal", MyModelsEnum.p413_d01_junction_t_horizontal, MyModelsEnum.p413_d01_junction_t_horizontal_LOD1, null); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\04\\05_Junction\\p413_d03_junction_x_horizontal", MyModelsEnum.p413_d03_junction_x_horizontal, MyModelsEnum.p413_d03_junction_x_horizontal_LOD1, MyModelsEnum.p413_d03_junction_x_horizontal_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\04\\04_Entrance\\p414_d01_entrance_60m", MyModelsEnum.p414_d01_entrance_60m, null, MyModelsEnum.p414_d01_entrance_60m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\04\\01_Straight\\p411_d01_straight_10m", MyModelsEnum.p411_d01_straight_10m, MyModelsEnum.p411_d01_straight_10m_LOD1, MyModelsEnum.p411_d01_straight_10m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\04\\01_Straight\\p411_d02_straight_40m_with_hole", MyModelsEnum.p411_d02_straight_40m_with_hole, MyModelsEnum.p411_d02_straight_40m_with_hole_LOD1, MyModelsEnum.p411_d02_straight_40m_with_hole_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\04\\01_Straight\\p411_d03_straight_60m", MyModelsEnum.p411_d03_straight_60m, MyModelsEnum.p411_d03_straight_60m_LOD1, MyModelsEnum.p411_d03_straight_60m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\04\\01_Straight\\p411_d04_straight_120m", MyModelsEnum.p411_d04_straight_120m, MyModelsEnum.p411_d04_straight_120m_LOD1, MyModelsEnum.p411_d04_straight_120m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\04\\01_Straight\\p411_d05_straight_180m", MyModelsEnum.p411_d05_straight_180m, MyModelsEnum.p411_d05_straight_180m_LOD1, MyModelsEnum.p411_d05_straight_180m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\06_Other\\01_Door\\p415_c01_doorcase", MyModelsEnum.p415_c01_doorcase, MyModelsEnum.p415_c01_doorcase_LOD1, MyModelsEnum.p415_c01_doorcase_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\06_Other\\01_Door\\p415_c02_door1_right", MyModelsEnum.p415_c02_door1_right, null, MyModelsEnum.p415_c02_door1_right_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\06_Other\\01_Door\\p415_c02_door1_left", MyModelsEnum.p415_c02_door1_left, null, MyModelsEnum.p415_c02_door1_left_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\06_Other\\01_Door\\p415_c03_door2_a_left", MyModelsEnum.p415_c03_door2_a_left, MyModelsEnum.p415_c03_door2_a_left_LOD1, MyModelsEnum.p415_c03_door2_a_left_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\06_Other\\01_Door\\p415_c03_door2_a_right", MyModelsEnum.p415_c03_door2_a_right, MyModelsEnum.p415_c03_door2_a_right_LOD1, MyModelsEnum.p415_c03_door2_a_right_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\06_Other\\01_Door\\p415_c03_door2_b_left", MyModelsEnum.p415_c03_door2_b_left, MyModelsEnum.p415_c03_door2_b_left_LOD1, MyModelsEnum.p415_c03_door2_b_left_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\06_Other\\01_Door\\p415_c03_door2_b_right", MyModelsEnum.p415_c03_door2_b_right, MyModelsEnum.p415_c03_door2_b_right_LOD1, MyModelsEnum.p415_c03_door2_b_right_COL); - AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\06_Other\\01_Door\\p415_c02_door1", MyMeshDrawTechnique.MESH, MyModelsEnum.p415_c02_door1)); - AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\06_Other\\01_Door\\p415_c03_door2_a", MyMeshDrawTechnique.MESH, MyModelsEnum.p415_c03_door2_a)); - AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\06_Other\\01_Door\\p415_c03_door2_b", MyMeshDrawTechnique.MESH, MyModelsEnum.p415_c03_door2_b)); - AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\06_Other\\01_Door\\p415_c04_door3", MyMeshDrawTechnique.MESH, MyModelsEnum.p415_c04_door3)); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\05_Junction\\p413_c01_junction_t_horizontal", MyModelsEnum.p413_c01_junction_t_horizontal, MyModelsEnum.p413_c01_junction_t_horizontal_LOD1, MyModelsEnum.p413_c01_junction_t_horizontal_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\05_Junction\\p413_c01_junction_x_horizontal", MyModelsEnum.p413_c01_junction_x_horizontal, MyModelsEnum.p413_c01_junction_x_horizontal_LOD1, MyModelsEnum.p413_c01_junction_x_horizontal_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\04_Entrance\\p414_c01_entrance_60m", MyModelsEnum.p414_c01_entrance_60m, null, MyModelsEnum.p414_c01_entrance_60m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\01_Straight\\p411_c01_straight_10m", MyModelsEnum.p411_c01_straight_10m, null, MyModelsEnum.p411_c01_straight_10m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\01_Straight\\p411_c02_straight_40m_with_hole", MyModelsEnum.p411_c02_straight_40m_with_hole, MyModelsEnum.p411_c02_straight_40m_with_hole_LOD1, MyModelsEnum.p411_c02_straight_40m_with_hole_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\01_Straight\\p411_c03_straight_60m", MyModelsEnum.p411_c03_straight_60m, MyModelsEnum.p411_c03_straight_60m_LOD1, MyModelsEnum.p411_c03_straight_60m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\01_Straight\\p411_c04_straight_120m", MyModelsEnum.p411_c04_straight_120m, MyModelsEnum.p411_c04_straight_120m_LOD1, MyModelsEnum.p411_c04_straight_120m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\01_Straight\\p411_c05_straight_180m", MyModelsEnum.p411_c05_straight_180m, MyModelsEnum.p411_c05_straight_180m_LOD1, MyModelsEnum.p411_c05_straight_180m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\06_Other\\01_Door\\p415_b01_doorcase", MyModelsEnum.p415_b01_doorcase, MyModelsEnum.p415_b01_doorcase_LOD1, MyModelsEnum.p415_b01_doorcase_COL); - //AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\06_Other\\01_Door\\p415_b02_door", MyMeshDrawTechnique.MESH, MyModelsEnum.p415_b02_door)); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\05_Junction\\p413_b01_junction_t_horizontal", MyModelsEnum.p413_b01_junction_t_horizontal, MyModelsEnum.p413_b01_junction_t_horizontal_LOD1, MyModelsEnum.p413_b01_junction_t_horizontal_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\05_Junction\\p413_b02_junction_t_vertical", MyModelsEnum.p413_b02_junction_t_vertical, MyModelsEnum.p413_b02_junction_t_vertical_LOD1, MyModelsEnum.p413_b02_junction_t_vertical_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\04_Entrance\\p414_b02_entrance_60m", MyModelsEnum.p414_b02_entrance_60m, MyModelsEnum.p414_b02_entrance_60m_LOD1, MyModelsEnum.p414_b02_entrance_60m_COL); - //AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\04_Entrance\\p414_b02_entrance_60m_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p414_b02_entrance_60m_LOD1)); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\03_TurnS\\p412_b21_turn_s_up", MyModelsEnum.p412_b21_turn_s_up, MyModelsEnum.p412_b21_turn_s_up_LOD1, MyModelsEnum.p412_b21_turn_s_up_COL); - AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\03_TurnS\\p412_b22_turn_s_left", MyMeshDrawTechnique.MESH, MyModelsEnum.p412_b22_turn_s_left)); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\03_TurnS\\p412_b23_turn_s_right", MyModelsEnum.p412_b23_turn_s_right, MyModelsEnum.p412_b23_turn_s_right_LOD1, MyModelsEnum.p412_b23_turn_s_right_COL); - //AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\03_TurnS\\p412_b24_turn_s_down", MyMeshDrawTechnique.MESH, MyModelsEnum.p412_b24_turn_s_down)); - AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\03_TurnS\\p412_b22_turn_s_left_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p412_b22_turn_s_left_LOD1)); - //AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\03_TurnS\\p412_b24_turn_s_down_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p412_b24_turn_s_down_LOD1)); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\03_TurnS\\p412_b24_turn_s_down", MyModelsEnum.p412_b24_turn_s_down, MyModelsEnum.p412_b24_turn_s_down_LOD1, MyModelsEnum.p412_b24_turn_s_down_COL); - - AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\02_Turn90\\02_160m\\p412_b11_turn_90_up_160m", MyMeshDrawTechnique.MESH, MyModelsEnum.p412_b11_turn_90_up_160m)); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\02_Turn90\\02_160m\\p412_b12_turn_90_left_160m", MyModelsEnum.p412_b12_turn_90_left_160m, MyModelsEnum.p412_b12_turn_90_left_160m_LOD1, null); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\02_Turn90\\02_160m\\p412_b13_turn_90_right_160m", MyModelsEnum.p412_b13_turn_90_right_160m, MyModelsEnum.p412_b13_turn_90_right_160m_LOD1, MyModelsEnum.p412_b13_turn_90_right_160m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\02_Turn90\\02_160m\\p412_b14_turn_90_down_160m", MyModelsEnum.p412_b14_turn_90_down_160m, MyModelsEnum.p412_b14_turn_90_down_160m_LOD1, MyModelsEnum.p412_b14_turn_90_down_160m_COL); - AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\02_Turn90\\02_160m\\p412_b11_turn_90_up_160m_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p412_b11_turn_90_up_160m_LOD1)); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\02_Turn90\\01_80m\\p412_b01_turn_90_up_80m", MyModelsEnum.p412_b01_turn_90_up_80m, MyModelsEnum.p412_b01_turn_90_up_80m_LOD1, MyModelsEnum.p412_b01_turn_90_up_80m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\02_Turn90\\01_80m\\p412_b02_turn_90_left_80m", MyModelsEnum.p412_b02_turn_90_left_80m, MyModelsEnum.p412_b02_turn_90_left_80m_LOD1, MyModelsEnum.p412_b02_turn_90_left_80m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\02_Turn90\\01_80m\\p412_b03_turn_90_right_80m", MyModelsEnum.p412_b03_turn_90_right_80m, MyModelsEnum.p412_b03_turn_90_right_80m_LOD1, MyModelsEnum.p412_b03_turn_90_right_80m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\02_Turn90\\01_80m\\p412_b04_turn_90_down_80m", MyModelsEnum.p412_b04_turn_90_down_80m, MyModelsEnum.p412_b04_turn_90_down_80m_LOD1, MyModelsEnum.p412_b04_turn_90_down_80m_COL); - - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\01_Straight\\p411_b01_straight_10m", MyModelsEnum.p411_b01_straight_10m, MyModelsEnum.p411_b01_straight_10m_LOD1, MyModelsEnum.p411_b01_straight_10m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\01_Straight\\p411_b02_straight_30m_yellow", MyModelsEnum.p411_b02_straight_30m_yellow, MyModelsEnum.p411_b02_straight_30m_yellow_LOD1, MyModelsEnum.p411_b02_straight_30m_yellow_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\01_Straight\\p411_b03_straight_320m", MyModelsEnum.p411_b03_straight_320m, MyModelsEnum.p411_b03_straight_320m_LOD1, MyModelsEnum.p411_b03_straight_320m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\01_Straight\\p411_b04_straight_80m_with_side_grates", MyModelsEnum.p411_b04_straight_80m_with_side_grates, MyModelsEnum.p411_b04_straight_80m_with_side_grates_LOD1, MyModelsEnum.p411_b04_straight_80m_with_side_grates_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\01_Straight\\p411_b05_straight_80m_with_side_open", MyModelsEnum.p411_b05_straight_80m_with_side_open, MyModelsEnum.p411_b05_straight_80m_with_side_open_LOD1, MyModelsEnum.p411_b05_straight_80m_with_side_open_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\01_Straight\\p411_b06_straight_180m_concrete", MyModelsEnum.p411_b06_straight_180m_concrete, MyModelsEnum.p411_b06_straight_180m_concrete_LOD1, MyModelsEnum.p411_b06_straight_180m_concrete_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\01_Straight\\p411_b06_straight_200m", MyModelsEnum.p411_b06_straight_200m, MyModelsEnum.p411_b06_straight_200m_LOD1, MyModelsEnum.p411_b06_straight_200m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\01_Straight\\p411_b07_straight_180m_blue", MyModelsEnum.p411_b07_straight_180m_blue, MyModelsEnum.p411_b07_straight_180m_blue_LOD1, MyModelsEnum.p411_b07_straight_180m_blue_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\01_Straight\\p411_b09_straight_30m_gray", MyModelsEnum.p411_b09_straight_30m_gray, MyModelsEnum.p411_b09_straight_30m_gray_LOD1, MyModelsEnum.p411_b09_straight_30m_gray_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\01_Straight\\p411_b11_straight_220m", MyModelsEnum.p411_b11_straight_220m, MyModelsEnum.p411_b11_straight_220m_LOD1, MyModelsEnum.p411_b11_straight_220m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\01_Straight\\p411_b12_straight_160m_dark_metal", MyModelsEnum.p411_b12_straight_160m_dark_metal, MyModelsEnum.p411_b12_straight_160m_dark_metal_LOD1, MyModelsEnum.p411_b12_straight_160m_dark_metal_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\01_Straight\\p411_b13_straight_100m_tube_inside", MyModelsEnum.p411_b13_straight_100m_tube_inside, MyModelsEnum.p411_b13_straight_100m_tube_inside_LOD1, MyModelsEnum.p411_b13_straight_100m_tube_inside_COL); - - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\06_Other\\01_Door\\p415_a01_doorcase", MyModelsEnum.p415_a01_doorcase, MyModelsEnum.p415_a01_doorcase_LOD1, MyModelsEnum.p415_a01_doorcase_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\06_Other\\01_Door\\p415_a02_door_left", MyModelsEnum.p415_a02_door_left, null, MyModelsEnum.p415_a02_door_left_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\06_Other\\01_Door\\p415_a02_door_right", MyModelsEnum.p415_a02_door_right, null, MyModelsEnum.p415_a02_door_right_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\06_Other\\01_Door\\p415_a02_door", MyModelsEnum.p415_a02_door, null, null); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\05_Junction\\p413_a01_junction_t_horizontal", MyModelsEnum.p413_a01_junction_t_horizontal, MyModelsEnum.p413_a01_junction_t_horizontal_LOD1, MyModelsEnum.p413_a01_junction_t_horizontal_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\05_Junction\\p413_a02_junction_t_vertical", MyModelsEnum.p413_a02_junction_t_vertical, MyModelsEnum.p413_a02_junction_t_vertical_LOD1, MyModelsEnum.p413_a02_junction_t_vertical_COL); - //AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\04_Entrance\\p414_a01_entrance_30m", MyModelsEnum.p414_a01_entrance_30m, null, null); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\04_Entrance\\p414_a02_entrance_60m", MyModelsEnum.p414_a02_entrance_60m, MyModelsEnum.p414_a02_entrance_60m_LOD1, MyModelsEnum.p414_a02_entrance_60m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\03_TurnS\\p412_a21_turn_s_up", MyModelsEnum.p412_a21_turn_s_up, MyModelsEnum.p412_a21_turn_s_up_LOD1, MyModelsEnum.p412_a21_turn_s_up_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\03_TurnS\\p412_a22_turn_s_left", MyModelsEnum.p412_a22_turn_s_left, MyModelsEnum.p412_a22_turn_s_left_LOD1, MyModelsEnum.p412_a22_turn_s_left_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\03_TurnS\\p412_a23_turn_s_right", MyModelsEnum.p412_a23_turn_s_right, MyModelsEnum.p412_a23_turn_s_right_LOD1, MyModelsEnum.p412_a23_turn_s_right_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\03_TurnS\\p412_a24_turn_s_down", MyModelsEnum.p412_a24_turn_s_down, MyModelsEnum.p412_a24_turn_s_down_LOD1, MyModelsEnum.p412_a24_turn_s_down_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\02_Turn90\\02_160m\\p412_a11_turn_90_up_160m", MyModelsEnum.p412_a11_turn_90_up_160m, MyModelsEnum.p412_a11_turn_90_up_160m_LOD1, MyModelsEnum.p412_a11_turn_90_up_160m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\02_Turn90\\02_160m\\p412_a12_turn_90_left_160m", MyModelsEnum.p412_a12_turn_90_left_160m, MyModelsEnum.p412_a12_turn_90_left_160m_LOD1, MyModelsEnum.p412_a12_turn_90_left_160m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\02_Turn90\\02_160m\\p412_a13_turn_90_right_160m", MyModelsEnum.p412_a13_turn_90_right_160m, MyModelsEnum.p412_a13_turn_90_right_160m_LOD1, MyModelsEnum.p412_a13_turn_90_right_160m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\02_Turn90\\02_160m\\p412_a14_turn_90_down_160m", MyModelsEnum.p412_a14_turn_90_down_160m, MyModelsEnum.p412_a14_turn_90_down_160m_LOD1, MyModelsEnum.p412_a14_turn_90_down_160m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\02_Turn90\\01_80m\\p412_a01_turn_90_up_80m", MyModelsEnum.p412_a01_turn_90_up_80m, MyModelsEnum.p412_a01_turn_90_up_80m_LOD1, MyModelsEnum.p412_a01_turn_90_up_80m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\02_Turn90\\01_80m\\p412_a02_turn_90_left_80m", MyModelsEnum.p412_a02_turn_90_left_80m, MyModelsEnum.p412_a02_turn_90_left_80m_LOD1, MyModelsEnum.p412_a02_turn_90_left_80m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\02_Turn90\\01_80m\\p412_a03_turn_90_right_80m", MyModelsEnum.p412_a03_turn_90_right_80m, MyModelsEnum.p412_a03_turn_90_right_80m_LOD1, MyModelsEnum.p412_a03_turn_90_right_80m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\02_Turn90\\01_80m\\p412_a04_turn_90_down_80m", MyModelsEnum.p412_a04_turn_90_down_80m, MyModelsEnum.p412_a04_turn_90_down_80m_LOD1, MyModelsEnum.p412_a04_turn_90_down_80m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\01_Straight\\p411_a01_straight_10m", MyModelsEnum.p411_a01_straight_10m, MyModelsEnum.p411_a01_straight_10m_LOD1, MyModelsEnum.p411_a01_straight_10m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\01_Straight\\p411_a02_straight_60m_with_hole", MyModelsEnum.p411_a02_straight_60m_with_hole, MyModelsEnum.p411_a02_straight_60m_with_hole_LOD1, MyModelsEnum.p411_a02_straight_60m_with_hole_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\01_Straight\\p411_a03_straight_120m", MyModelsEnum.p411_a03_straight_120m, MyModelsEnum.p411_a03_straight_120m_LOD1,MyModelsEnum.p411_a03_straight_120m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\01_Straight\\p411_a04_straight_80m", MyModelsEnum.p411_a04_straight_80m, MyModelsEnum.p411_a04_straight_80m_LOD1, MyModelsEnum.p411_a04_straight_80m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\01_Straight\\p411_a05_straight_80m_with_extension", MyModelsEnum.p411_a05_straight_80m_with_extension, MyModelsEnum.p411_a05_straight_80m_with_extension_LOD1, MyModelsEnum.p411_a05_straight_80m_with_extension_COL); - - AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\02_Bridge\\05\\p382_e01_bridge5", MyMeshDrawTechnique.MESH, MyModelsEnum.p382_e01_bridge5)); - AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\02_Bridge\\05\\p382_e01_bridge5_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p382_e01_bridge5_LOD1)); - AddEntityModels("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\02_Bridge\\04\\p382_d01_bridge4", MyModelsEnum.p382_d01_bridge4, MyModelsEnum.p382_d01_bridge4_LOD1, MyModelsEnum.p382_d01_bridge4_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\02_Bridge\\03\\p382_c01_bridge3", MyModelsEnum.p382_c01_bridge3, MyModelsEnum.p382_c01_bridge3_LOD1, MyModelsEnum.p382_c01_bridge3_COL); - AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\02_Bridge\\02\\p382_b01_bridge2", MyMeshDrawTechnique.MESH, MyModelsEnum.p382_b01_bridge2)); - AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\02_Bridge\\02\\p382_b01_bridge2_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p382_b01_bridge2_LOD1)); - AddEntityModels("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\02_Bridge\\01\\p382_a01_bridge1", MyModelsEnum.p382_a01_bridge1, MyModelsEnum.p382_a01_bridge1_LOD1, MyModelsEnum.p382_a01_bridge1_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\01_LivingQuarters\\03\\p381_c01_building4", MyModelsEnum.p381_c01_building4, MyModelsEnum.p381_c01_building4_LOD1, MyModelsEnum.p381_c01_building4_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\01_LivingQuarters\\03\\p381_c01_building3", MyModelsEnum.p381_c01_building3, MyModelsEnum.p381_c01_building3_LOD1, MyModelsEnum.p381_c01_building3_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\01_LivingQuarters\\02\\p381_b01_building2", MyModelsEnum.p381_b01_building2, MyModelsEnum.p381_b01_building2_LOD1, MyModelsEnum.p381_b01_building2_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\01_LivingQuarters\\01\\p381_a01_building1", MyModelsEnum.p381_a01_building1, MyModelsEnum.p381_a01_building1_LOD1, MyModelsEnum.p381_a01_building1_COL); - //AddEntityModels("Models2\\Prefabs\\03_Modules\\07_Hangars\\01_Small\\01\\p361_a01_small_hangar", MyModelsEnum.p361_a01_small_hangar, null, MyModelsEnum.p361_a01_small_hangar_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\06_Communications\\02_ShortDistanceAntenna\\p362_a01_short_distance_antenna", MyModelsEnum.p362_a01_short_distance_antenna, MyModelsEnum.p362_a01_short_distance_antenna_LOD1, MyModelsEnum.p362_a01_short_distance_antenna_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\06_Communications\\01_LongDistanceAntenna\\01\\p361_a01_long_distance_antenna", MyModelsEnum.p361_a01_long_distance_antenna, MyModelsEnum.p361_a01_long_distance_antenna_LOD1, MyModelsEnum.p361_a01_long_distance_antenna_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\05_Weaponry\\01_WeaponMount\\01\\p351_a01_weapon_mount", MyModelsEnum.p351_a01_weapon_mount, MyModelsEnum.p351_a01_weapon_mount_LOD1, MyModelsEnum.p351_a01_weapon_mount_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\05_Refinery\\01\\p345_a01_refinery", MyModelsEnum.p345_a01_refinery, MyModelsEnum.p345_a01_refinery_LOD1, MyModelsEnum.p345_a01_refinery_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\04_CargoStorage\\01\\p344_a01_container_arm_filled", MyModelsEnum.p344_a01_container_arm_filled, MyModelsEnum.p344_a01_container_arm_filled_LOD1, MyModelsEnum.p344_a01_container_arm_filled_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\04_CargoStorage\\01\\p344_a02_container_arm_empty", MyModelsEnum.p344_a02_container_arm_empty, MyModelsEnum.p344_a02_container_arm_empty_LOD1, MyModelsEnum.p344_a02_container_arm_empty_COL); - //AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\04_Industry\\03_OreStorage\\01\\p343_a01_ore_storage", MyMeshDrawTechnique.MESH, MyModelsEnum.p343_a01_ore_storage)); - AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\03_OreStorage\\01\\p343_a01_ore_storage", MyModelsEnum.p343_a01_ore_storage, null, MyModelsEnum.p343_a01_ore_storage_COL); - //AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\04_Industry\\02_LoadingBay\\01\\p342_a01_loading_bay", MyMeshDrawTechnique.MESH, MyModelsEnum.p342_a01_loading_bay)); - AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\02_LoadingBay\\01\\p342_a01_loading_bay", MyModelsEnum.p342_a01_loading_bay, null, MyModelsEnum.p342_a01_loading_bay_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\01_Docks\\02\\p341_b01_open_dock_variation1", MyModelsEnum.p341_b01_open_dock_variation1, MyModelsEnum.p341_b01_open_dock_variation1_LOD1, MyModelsEnum.p341_b01_open_dock_variation1_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\01_Docks\\02\\p341_b02_open_dock_variation2", MyModelsEnum.p341_b02_open_dock_variation2, MyModelsEnum.p341_b02_open_dock_variation2_LOD1, MyModelsEnum.p341_b02_open_dock_variation2_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\01_Docks\\01\\p341_a01_open_dock_variation1", MyModelsEnum.p341_a01_open_dock_variation1, MyModelsEnum.p341_a01_open_dock_variation1_LOD1, MyModelsEnum.p341_a01_open_dock_variation1_COL); - AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\04_Industry\\01_Docks\\01\\p341_a01_open_dock_variation1_doorleft", MyMeshDrawTechnique.MESH, MyModelsEnum.p341_a01_open_dock_variation1_doorleft)); - AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\04_Industry\\01_Docks\\01\\p341_a01_open_dock_variation1_doorright", MyMeshDrawTechnique.MESH, MyModelsEnum.p341_a01_open_dock_variation1_doorright)); - AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\01_Docks\\01\\p341_a02_open_dock_variation2", MyModelsEnum.p341_a02_open_dock_variation2, MyModelsEnum.p341_a02_open_dock_variation2_LOD1, MyModelsEnum.p341_a02_open_dock_variation2_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\03_LifeSupport\\03_HydroponicFarm\\01\\p333_a01_hydroponic_building", MyModelsEnum.p333_a01_hydroponic_building, MyModelsEnum.p333_a01_hydroponic_building_LOD1, MyModelsEnum.p333_a01_hydroponic_building_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\03_LifeSupport\\02_OxygenStorage\\01\\p332_a01_oxygen_storage", MyModelsEnum.p332_a01_oxygen_storage, MyModelsEnum.p332_a01_oxygen_storage_LOD1, MyModelsEnum.p332_a01_oxygen_storage_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\03_LifeSupport\\01_OxygenGeneration\\01\\p331_a01_oxygen_generator", MyModelsEnum.p331_a01_oxygen_generator, MyModelsEnum.p331_a01_oxygen_generator_LOD1, MyModelsEnum.p331_a01_oxygen_generator_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\04_FuelStorage\\02\\p324b01_fuel_storage_b", MyModelsEnum.p324b01_fuel_storage_b, MyModelsEnum.p324b01_fuel_storage_b_LOD1, MyModelsEnum.p324b01_fuel_storage_b_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\04_FuelStorage\\01\\p324a01_fuel_storage_a", MyModelsEnum.p324a01_fuel_storage_a, MyModelsEnum.p324a01_fuel_storage_a_LOD1, MyModelsEnum.p324a01_fuel_storage_a_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\03_FuelGeneration\\01\\p323a01_fuel_generator", MyModelsEnum.p323a01_fuel_generator, MyModelsEnum.p323a01_fuel_generator_LOD1, MyModelsEnum.p323a01_fuel_generator_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\02_PowerStorage\\01\\p322a01_battery", MyModelsEnum.p322a01_battery, MyModelsEnum.p322a01_battery_LOD1, MyModelsEnum.p322a01_battery_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c01_inertia_generator", MyModelsEnum.p321c01_inertia_generator, MyModelsEnum.p321c01_inertia_generator_LOD1, MyModelsEnum.p321c01_inertia_generator_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c01_inertia_generator_center", MyModelsEnum.p321c01_inertia_generator_center, MyModelsEnum.p321c01_inertia_generator_center_LOD1, MyModelsEnum.p321c01_inertia_generator_center_COL); - AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\02\\p321b01_nuclear_reactor", MyMeshDrawTechnique.MESH, MyModelsEnum.p321b01_nuclear_reactor)); - //AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\01\\p321a01_solar_panel", MyModelsEnum.p321a01_solar_panel, MyModelsEnum.p321a01_solar_panel_LOD1, MyModelsEnum.p321a01_solar_panel_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\01_Flight\\02_ShortTermThruster\\01\\p312a01_short_term_thruster_latitude", MyModelsEnum.p312a01_short_term_thruster_latitude, MyModelsEnum.p312a01_short_term_thruster_latitude_LOD1, MyModelsEnum.p312a01_short_term_thruster_latitude_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\01_Flight\\02_ShortTermThruster\\01\\p312a02_short_term_thruster_lateral", MyModelsEnum.p312a02_short_term_thruster_lateral, MyModelsEnum.p312a02_short_term_thruster_lateral_LOD1, MyModelsEnum.p312a02_short_term_thruster_lateral_COL); - AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\01_Flight\\01_LongTermThruster\\01\\p311a01_long_term_thruster", MyMeshDrawTechnique.MESH, MyModelsEnum.p311a01_long_term_thruster)); - AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a01_armor", MyModelsEnum.p231a01_armor, MyModelsEnum.p231a01_armor_LOD01, MyModelsEnum.p231a01_armor_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a02_armor", MyModelsEnum.p231a02_armor, MyModelsEnum.p231a02_armor_LOD01, MyModelsEnum.p231a02_armor_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a03_armor", MyModelsEnum.p231a03_armor, MyModelsEnum.p231a03_armor_LOD01, MyModelsEnum.p231a03_armor_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a04_armor", MyModelsEnum.p231a04_armor, MyModelsEnum.p231a04_armor_LOD01, MyModelsEnum.p231a04_armor_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a05_armor", MyModelsEnum.p231a05_armor, MyModelsEnum.p231a05_armor_LOD01, MyModelsEnum.p231a05_armor_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a06_armor", MyModelsEnum.p231a06_armor, MyModelsEnum.p231a06_armor_LOD01, MyModelsEnum.p231a06_armor_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a07_armor", MyModelsEnum.p231a07_armor, MyModelsEnum.p231a07_armor_LOD01, MyModelsEnum.p231a07_armor_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a08_armor", MyModelsEnum.p231a08_armor, MyModelsEnum.p231a08_armor_LOD01, MyModelsEnum.p231a08_armor_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a09_armor", MyModelsEnum.p231a09_armor, MyModelsEnum.p231a09_armor_LOD01, MyModelsEnum.p231a09_armor_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a10_armor", MyModelsEnum.p231a10_armor, MyModelsEnum.p231a10_armor_LOD01, MyModelsEnum.p231a10_armor_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a11_armor", MyModelsEnum.p231a11_armor, MyModelsEnum.p231a11_armor_LOD01, MyModelsEnum.p231a11_armor_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a12_armor", MyModelsEnum.p231a12_armor, MyModelsEnum.p231a12_armor_LOD01, MyModelsEnum.p231a12_armor_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a13_armor", MyModelsEnum.p231a13_armor, MyModelsEnum.p231a13_armor_LOD01, MyModelsEnum.p231a13_armor_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a14_armor", MyModelsEnum.p231a14_armor, MyModelsEnum.p231a14_armor_LOD01, MyModelsEnum.p231a14_armor_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a15_armor", MyModelsEnum.p231a15_armor, MyModelsEnum.p231a15_armor_LOD01, MyModelsEnum.p231a15_armor_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a16_armor", MyModelsEnum.p231a16_armor, MyModelsEnum.p231a16_armor_LOD01, MyModelsEnum.p231a16_armor_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a17_armor", MyModelsEnum.p231a17_armor, MyModelsEnum.p231a17_armor_LOD01, MyModelsEnum.p231a17_armor_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a18_armor", MyModelsEnum.p231a18_armor, MyModelsEnum.p231a18_armor_LOD01, MyModelsEnum.p231a18_armor_COL); - - AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\01\\p221a01_chamber_v1", MyModelsEnum.p221a01_chamber_v1, MyModelsEnum.p221a01_chamber_v1_LOD1, MyModelsEnum.p221a01_chamber_v1_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\02\\p221b01_chamber_v1", MyModelsEnum.p221b01_chamber_v1, MyModelsEnum.p221b01_chamber_v1_LOD1, MyModelsEnum.p221b01_chamber_v1_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\03\\p221c01_chamber_v1", MyModelsEnum.p221c01_chamber_v1, MyModelsEnum.p221c01_chamber_v1_LOD1, MyModelsEnum.p221c01_chamber_v1_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\04\\p221d01_chamber_v1", MyModelsEnum.p221d01_chamber_v1, MyModelsEnum.p221d01_chamber_v1_LOD1, MyModelsEnum.p221d01_chamber_v1_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\05\\p221e01_chamber_v1", MyModelsEnum.p221e01_chamber_v1, MyModelsEnum.p221e01_chamber_v1_LOD1, MyModelsEnum.p221e01_chamber_v1_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\06\\p221f01_chamber_v1", MyModelsEnum.p221f01_chamber_v1, MyModelsEnum.p221f01_chamber_v1_LOD1, MyModelsEnum.p221f01_chamber_v1_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\07\\p221g01_chamber_v1", MyModelsEnum.p221g01_chamber_v1, MyModelsEnum.p221g01_chamber_v1_LOD1, MyModelsEnum.p221g01_chamber_v1_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\08\\p221h01_chamber_v1", MyModelsEnum.p221h01_chamber_v1, MyModelsEnum.p221h01_chamber_v1_LOD1, MyModelsEnum.p221h01_chamber_v1_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\09\\p221j01_chamber_v1", MyModelsEnum.p221j01_chamber_v1, MyModelsEnum.p221j01_chamber_v1_LOD1, MyModelsEnum.p221j01_chamber_v1_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\10\\p221k01_chamber_v1", MyModelsEnum.p221k01_chamber_v1, MyModelsEnum.p221k01_chamber_v1_LOD1, null); - - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08\\p211h01_panel_535mx130m", MyModelsEnum.p211h01_panel_535mx130m, MyModelsEnum.p211h01_panel_535mx130m_LOD1, MyModelsEnum.p211h01_panel_535mx130m_COL); - - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\07\\p211g01_panel_120mx60m", MyModelsEnum.p211g01_panel_120mx60m, MyModelsEnum.p211g01_panel_120mx60m_LOD1, MyModelsEnum.p211g01_panel_120mx60m_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\07\\p211g02_panel_60mx60m", MyModelsEnum.p211g02_panel_60mx60m, MyModelsEnum.p211g02_panel_60mx60m_LOD1, MyModelsEnum.p211g02_panel_60mx60m_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\07\\p211g03_panel_60mx30m", MyModelsEnum.p211g03_panel_60mx30m, MyModelsEnum.p211g03_panel_60mx30m_LOD1, MyModelsEnum.p211g03_panel_60mx30m_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\06\\p211f01_panel_120mx60m", MyModelsEnum.p211f01_panel_120mx60m, MyModelsEnum.p211f01_panel_120mx60m_LOD1, MyModelsEnum.p211f01_panel_120mx60m_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\06\\p211f02_panel_60mx60m", MyModelsEnum.p211f02_panel_60mx60m, MyModelsEnum.p211f02_panel_60mx60m_LOD1, MyModelsEnum.p211f02_panel_60mx60m_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\06\\p211f03_panel_60mx30m", MyModelsEnum.p211f03_panel_60mx30m, null, MyModelsEnum.p211f03_panel_60mx30m_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\05\\p211e01_panel_120mx60m", MyModelsEnum.p211e01_panel_120mx60m, MyModelsEnum.p211e01_panel_120mx60m_LOD1, MyModelsEnum.p211e01_panel_120mx60m_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\05\\p211e02_panel_60mx60m", MyModelsEnum.p211e02_panel_60mx60m, MyModelsEnum.p211e02_panel_60mx60m_LOD1, MyModelsEnum.p211e02_panel_60mx60m_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\05\\p211e03_panel_60mx30m", MyModelsEnum.p211e03_panel_60mx30m, MyModelsEnum.p211e03_panel_60mx30m_LOD1, MyModelsEnum.p211e03_panel_60mx30m_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\04\\p211d01_panel_120mx60m", MyModelsEnum.p211d01_panel_120mx60m, MyModelsEnum.p211d01_panel_120mx60m_LOD1, MyModelsEnum.p211d01_panel_120mx60m_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\04\\p211d02_panel_60mx60m", MyModelsEnum.p211d02_panel_60mx60m, MyModelsEnum.p211d02_panel_60mx60m_LOD1, MyModelsEnum.p211d02_panel_60mx60m_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\04\\p211d03_panel_60mx30m", MyModelsEnum.p211d03_panel_60mx30m, MyModelsEnum.p211d03_panel_60mx30m_LOD1, MyModelsEnum.p211d03_panel_60mx30m_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\03\\p211c01_panel_120mx60m", MyModelsEnum.p211c01_panel_120mx60m, MyModelsEnum.p211c01_panel_120mx60m_LOD1, null); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\03\\p211c02_panel_60mx60m", MyModelsEnum.p211c02_panel_60mx60m, MyModelsEnum.p211c02_panel_60mx60m_LOD1, MyModelsEnum.p211c02_panel_60mx60m_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\03\\p211c03_panel_60mx30m", MyModelsEnum.p211c03_panel_60mx30m, MyModelsEnum.p211c03_panel_60mx30m_LOD1, null); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\02\\p211b01_panel_120mx60m", MyModelsEnum.p211b01_panel_120mx60m, MyModelsEnum.p211b01_panel_120mx60m_LOD1, MyModelsEnum.p211b01_panel_120mx60m_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\02\\p211b02_panel_60mx60m", MyModelsEnum.p211b02_panel_60mx60m, MyModelsEnum.p211b02_panel_60mx60m_LOD1, MyModelsEnum.p211b02_panel_60mx60m_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\02\\p211b03_panel_60mx30m", MyModelsEnum.p211b03_panel_60mx30m, MyModelsEnum.p211b03_panel_60mx30m_LOD1, MyModelsEnum.p211b03_panel_60mx30m_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\01\\p211a01_panel_120mx60m", MyModelsEnum.p211a01_panel_120mx60m, MyModelsEnum.p211a01_panel_120mx60m_LOD1, MyModelsEnum.p211a01_panel_120mx60m_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\01\\p211a02_panel_60mx60m", MyModelsEnum.p211a02_panel_60mx60m, MyModelsEnum.p211a02_panel_60mx60m_LOD1, MyModelsEnum.p211a02_panel_60mx60m_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\01\\p211a03_panel_60mx30m", MyModelsEnum.p211a03_panel_60mx30m, MyModelsEnum.p211a03_panel_60mx30m_LOD1, MyModelsEnum.p211a03_panel_60mx30m_COL); - AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\04_Frame\\02_Cage\\02\\p142b01_cage_empty", MyMeshDrawTechnique.MESH, MyModelsEnum.p142b01_cage_empty)); - AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\04_Frame\\02_Cage\\02\\p142b02_cage_halfcut", MyMeshDrawTechnique.MESH, MyModelsEnum.p142b02_cage_halfcut)); - AddEntityModels("Models2\\Prefabs\\01_Beams\\04_Frame\\02_Cage\\02\\p142b03_cage_with_corners", MyModelsEnum.p142b03_cage_with_corners, MyModelsEnum.p142b03_cage_with_corners_LOD1, MyModelsEnum.p142b03_cage_with_corners_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\04_Frame\\02_Cage\\02\\p142b11_cage_pillar", MyModelsEnum.p142b11_cage_pillar, null, MyModelsEnum.p142b11_cage_pillar_COL); - AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\04_Frame\\02_Cage\\02\\p142b12_cage_edge", MyMeshDrawTechnique.MESH, MyModelsEnum.p142b12_cage_edge)); - AddEntityModels("Models2\\Prefabs\\01_Beams\\04_Frame\\02_Cage\\01\\p142a01_cage_empty", MyModelsEnum.p142a01_cage_empty, null, MyModelsEnum.p142a01_cage_empty_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\04_Frame\\02_Cage\\01\\p142a02_cage_halfcut", MyModelsEnum.p142a02_cage_halfcut, null, MyModelsEnum.p142a02_cage_halfcut_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\04_Frame\\02_Cage\\01\\p142a03_cage_with_corners", MyModelsEnum.p142a03_cage_with_corners, null, MyModelsEnum.p142a03_cage_with_corners_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\04_Frame\\02_Cage\\01\\p142a11_cage_pillar", MyModelsEnum.p142a11_cage_pillar, MyModelsEnum.p142a11_cage_pillar_LOD1, MyModelsEnum.p142a11_cage_pillar_COL); - AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\04_Frame\\02_Cage\\01\\p142a12_cage_edge", MyMeshDrawTechnique.MESH, MyModelsEnum.p142a12_cage_edge)); - AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\04_Frame\\01_Frame\\02\\p141b01_thick_frame_straight_10m", MyMeshDrawTechnique.MESH, MyModelsEnum.p141b01_thick_frame_straight_10m)); - AddEntityModels("Models2\\Prefabs\\01_Beams\\04_Frame\\01_Frame\\02\\p141b02_thick_frame_straight_60m", MyModelsEnum.p141b02_thick_frame_straight_60m, null, MyModelsEnum.p141b02_thick_frame_straight_60m_COL); - AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\04_Frame\\01_Frame\\02\\p141b11_thick_frame_edge", MyMeshDrawTechnique.MESH, MyModelsEnum.p141b11_thick_frame_edge)); - AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\04_Frame\\01_Frame\\02\\p141b12_thick_frame_corner", MyMeshDrawTechnique.MESH, MyModelsEnum.p141b12_thick_frame_corner)); - AddEntityModels("Models2\\Prefabs\\01_Beams\\04_Frame\\01_Frame\\02\\p141b31_thick_frame_joint", MyModelsEnum.p141b31_thick_frame_joint, null, MyModelsEnum.p141b31_thick_frame_joint_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\04_Frame\\01_Frame\\01\\p141a01_thick_frame_straight_10m", MyModelsEnum.p141a01_thick_frame_straight_10m, null, MyModelsEnum.p141a01_thick_frame_straight_10m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\04_Frame\\01_Frame\\01\\p141a02_thick_frame_straight_60m", MyModelsEnum.p141a02_thick_frame_straight_60m, null, MyModelsEnum.p141a02_thick_frame_straight_60m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\04_Frame\\01_Frame\\01\\p141a11_thick_frame_edge", MyModelsEnum.p141a11_thick_frame_edge, null, MyModelsEnum.p141a11_thick_frame_edge_COL); - AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\04_Frame\\01_Frame\\01\\p141a12_thick_frame_corner", MyMeshDrawTechnique.MESH, MyModelsEnum.p141a12_thick_frame_corner)); - AddEntityModels("Models2\\Prefabs\\01_Beams\\04_Frame\\01_Frame\\01\\p141a31_thick_frame_joint", MyModelsEnum.p141a31_thick_frame_joint, null, MyModelsEnum.p141a31_thick_frame_joint_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\10\\p130j01_j_straight_30m", MyModelsEnum.p130j01_j_straight_30m, null, MyModelsEnum.p130j01_j_straight_30m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\10\\p130j02_j_straight_10m", MyModelsEnum.p130j02_j_straight_10m, null, MyModelsEnum.p130j02_j_straight_10m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\09\\p130i01_i_straight_30m", MyModelsEnum.p130i01_i_straight_30m, null, null); - AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\09\\p130i02_i_straight_10m", MyModelsEnum.p130i02_i_straight_10m, null, MyModelsEnum.p130i02_i_straight_10m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\08\\p130h01_h_straight_30m", MyModelsEnum.p130h01_h_straight_30m, null, MyModelsEnum.p130h01_h_straight_30m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\08\\p130h02_h_straight_10m", MyModelsEnum.p130h02_h_straight_10m, null, MyModelsEnum.p130h02_h_straight_10m_COL); - //AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\03_Small\\07\\p130g01_g_straight_30m", MyMeshDrawTechnique.MESH, MyModelsEnum.p130g01_g_straight_30m)); - //AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\03_Small\\07\\p130g02_g_straight_10m", MyMeshDrawTechnique.MESH, MyModelsEnum.p130g02_g_straight_10m)); - //AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\03_Small\\06\\p130f01_f_straight_30m", MyMeshDrawTechnique.MESH, MyModelsEnum.p130f01_f_straight_30m)); - //AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\03_Small\\06\\p130f02_f_straight_10m", MyMeshDrawTechnique.MESH, MyModelsEnum.p130f02_f_straight_10m)); - //AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\03_Small\\05\\p130e01_e_straight_30m", MyMeshDrawTechnique.MESH, MyModelsEnum.p130e01_e_straight_30m)); - //AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\03_Small\\05\\p130e02_e_straight_10m", MyMeshDrawTechnique.MESH, MyModelsEnum.p130e02_e_straight_10m)); - //AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\03_Small\\04\\p130d01_d_straight_30m", MyMeshDrawTechnique.MESH, MyModelsEnum.p130d01_d_straight_30m)); - //AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\03_Small\\04\\p130d02_d_straight_10m", MyMeshDrawTechnique.MESH, MyModelsEnum.p130d02_d_straight_10m)); - //AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\03_Small\\03\\p130c01_c_straight_30m", MyMeshDrawTechnique.MESH, MyModelsEnum.p130c01_c_straight_30m)); - //AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\03_Small\\03\\p130c02_c_straight_10m", MyMeshDrawTechnique.MESH, MyModelsEnum.p130c02_c_straight_10m)); - //AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\03_Small\\02\\p130b01_b_straight_30m", MyMeshDrawTechnique.MESH, MyModelsEnum.p130b01_b_straight_30m)); - //AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\03_Small\\02\\p130b02_b_straight_10m", MyMeshDrawTechnique.MESH, MyModelsEnum.p130b02_b_straight_10m)); - //AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\03_Small\\01\\p130a01_a_straight_30m", MyMeshDrawTechnique.MESH, MyModelsEnum.p130a01_a_straight_30m)); - //AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\03_Small\\01\\p130a02_a_straight_10m", MyMeshDrawTechnique.MESH, MyModelsEnum.p130a02_a_straight_10m)); - AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\04\\p120d01_d_straight_10m", MyModelsEnum.p120d01_d_straight_10m, null, MyModelsEnum.p120d01_d_straight_10m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\04\\p120d02_d_straight_40m", MyModelsEnum.p120d02_d_straight_40m, null, MyModelsEnum.p120d02_d_straight_40m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\03\\p120c01_c_straight_10m", MyModelsEnum.p120c01_c_straight_10m, null, MyModelsEnum.p120c01_c_straight_10m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\03\\p120c02_c_straight_40m", MyModelsEnum.p120c02_c_straight_40m, null, MyModelsEnum.p120c02_c_straight_40m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\02\\p120b01_b_straight_10m", MyModelsEnum.p120b01_b_straight_10m, null, MyModelsEnum.p120b01_b_straight_10m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\02\\p120b02_b_straight_40m", MyModelsEnum.p120b02_b_straight_40m, null, MyModelsEnum.p120b02_b_straight_40m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\01\\p120a01_strong_lattice_straight_10m", MyModelsEnum.p120a01_strong_lattice_straight_10m, null, MyModelsEnum.p120a01_strong_lattice_straight_10m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\01\\p120a02_strong_lattice_straight_60m", MyModelsEnum.p120a02_strong_lattice_straight_60m, MyModelsEnum.p120a02_strong_lattice_straight_60m_LOD1, MyModelsEnum.p120a02_strong_lattice_straight_60m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\01\\p120a03_strong_lattice_straight_120m", MyModelsEnum.p120a03_strong_lattice_straight_120m, MyModelsEnum.p120a03_strong_lattice_straight_120m_LOD1, MyModelsEnum.p120a03_strong_lattice_straight_120m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\01\\p120a21_strong_lattice_junction_t_strong", MyModelsEnum.p120a21_strong_lattice_junction_t_strong, null, MyModelsEnum.p120a21_strong_lattice_junction_t_strong_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\01\\p120a22_strong_lattice_junction_t_weak", MyModelsEnum.p120a22_strong_lattice_junction_t_weak, MyModelsEnum.p120a22_strong_lattice_junction_t_weak_LOD1, MyModelsEnum.p120a22_strong_lattice_junction_t_weak_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\01\\p120a23_strong_lattice_junction_t_rotated", MyModelsEnum.p120a23_strong_lattice_junction_t_rotated, null, MyModelsEnum.p120a23_strong_lattice_junction_t_rotated_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\01\\p120a51_strong_to_weak_lattice_2to1", MyModelsEnum.p120a51_strong_to_weak_lattice_2to1, null, MyModelsEnum.p120a51_strong_to_weak_lattice_2to1_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\01\\p120a52_strong_to_weak_lattice_1to2", MyModelsEnum.p120a52_strong_to_weak_lattice_1to2, null, null); - AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\01\\p120a61_weak_lattice_junction_t_rotated", MyModelsEnum.p120a61_weak_lattice_junction_t_rotated, null, MyModelsEnum.p120a61_weak_lattice_junction_t_rotated_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\02\\p110b01_lattice_beam_straight_10m", MyModelsEnum.p110b01_lattice_beam_straight_10m, MyModelsEnum.p110b01_lattice_beam_straight_10m_LOD1, MyModelsEnum.p110b01_lattice_beam_straight_10m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\02\\p110b02_lattice_beam_straight_30m", MyModelsEnum.p110b02_lattice_beam_straight_30m, null, MyModelsEnum.p110b02_lattice_beam_straight_30m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\02\\p110b03_lattice_beam_straight_60m", MyModelsEnum.p110b03_lattice_beam_straight_60m, MyModelsEnum.p110b03_lattice_beam_straight_60m_LOD1, MyModelsEnum.p110b03_lattice_beam_straight_60m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\02\\p110b04_lattice_beam_straight_60m_with_panels", MyModelsEnum.p110b04_lattice_beam_straight_60m_with_panels, MyModelsEnum.p110b04_lattice_beam_straight_60m_with_panels_LOD1, MyModelsEnum.p110b04_lattice_beam_straight_60m_with_panels_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\02\\p110b21_lattice_beam_junction_t_strong", MyModelsEnum.p110b21_lattice_beam_junction_t_strong, MyModelsEnum.p110b21_lattice_beam_junction_t_strong_LOD1, MyModelsEnum.p110b21_lattice_beam_junction_t_strong_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\02\\p110b22_lattice_beam_junction_t_weak", MyModelsEnum.p110b22_lattice_beam_junction_t_weak, MyModelsEnum.p110b22_lattice_beam_junction_t_weak_LOD1, MyModelsEnum.p110b22_lattice_beam_junction_t_weak_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\02\\p110b31_lattice_beam_joint_horizontal", MyModelsEnum.p110b31_lattice_beam_joint_horizontal, null, MyModelsEnum.p110b31_lattice_beam_joint_horizontal_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\02\\p110b32_lattice_beam_joint_vertical", MyModelsEnum.p110b32_lattice_beam_joint_vertical, null, MyModelsEnum.p110b32_lattice_beam_joint_vertical_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a01_solid_beam_straight_10m", MyModelsEnum.p110a01_solid_beam_straight_10m, null, MyModelsEnum.p110a01_solid_beam_straight_10m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a02_solid_beam_straight_20m", MyModelsEnum.p110a02_solid_beam_straight_20m, null, MyModelsEnum.p110a02_solid_beam_straight_20m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a03_solid_beam_straight_40m_with_hole", MyModelsEnum.p110a03_solid_beam_straight_40m_with_hole, null, MyModelsEnum.p110a03_solid_beam_straight_40m_with_hole_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a04_solid_beam_straight_40m_lattice", MyModelsEnum.p110a04_solid_beam_straight_40m_lattice, MyModelsEnum.p110a04_solid_beam_straight_40m_lattice_LOD1, MyModelsEnum.p110a04_solid_beam_straight_40m_lattice_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a05_solid_beam_straight_80m", MyModelsEnum.p110a05_solid_beam_straight_80m, MyModelsEnum.p110a05_solid_beam_straight_80m_LOD1, MyModelsEnum.p110a05_solid_beam_straight_80m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a11_solid_beam_junction_x_strong", MyModelsEnum.p110a11_solid_beam_junction_x_strong, MyModelsEnum.p110a11_solid_beam_junction_x_strong_LOD1, MyModelsEnum.p110a11_solid_beam_junction_x_strong_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a12_solid_beam_junction_x_weak", MyModelsEnum.p110a12_solid_beam_junction_x_weak, MyModelsEnum.p110a12_solid_beam_junction_x_weak_LOD1, MyModelsEnum.p110a12_solid_beam_junction_x_weak_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a13_solid_beam_junction_x_rotated", MyModelsEnum.p110a13_solid_beam_junction_x_rotated, MyModelsEnum.p110a13_solid_beam_junction_x_rotated_LOD1, MyModelsEnum.p110a13_solid_beam_junction_x_rotated_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a21_solid_beam_junction_t_strong", MyModelsEnum.p110a21_solid_beam_junction_t_strong, null, MyModelsEnum.p110a21_solid_beam_junction_t_strong_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a22_solid_beam_junction_t_weak", MyModelsEnum.p110a22_solid_beam_junction_t_weak, MyModelsEnum.p110a22_solid_beam_junction_t_weak_LOD1, MyModelsEnum.p110a22_solid_beam_junction_t_weak_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a23_solid_beam_junction_t_rotated", MyModelsEnum.p110a23_solid_beam_junction_t_rotated, null, MyModelsEnum.p110a23_solid_beam_junction_t_rotated_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a31_solid_beam_joint_horizontal", MyModelsEnum.p110a31_solid_beam_joint_horizontal, null, MyModelsEnum.p110a31_solid_beam_joint_horizontal_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a32_solid_beam_joint_vertical", MyModelsEnum.p110a32_solid_beam_joint_vertical, null, MyModelsEnum.p110a32_solid_beam_joint_vertical_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a33_solid_beam_joint_longitudinal", MyModelsEnum.p110a33_solid_beam_joint_longitudinal, null, MyModelsEnum.p110a33_solid_beam_joint_longitudinal_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a41_solid_beam_superjoint", MyModelsEnum.p110a41_solid_beam_superjoint, null, MyModelsEnum.p110a41_solid_beam_superjoint_COL); - - ////////////////////////////////////////////////////////////////////////// - AddModel(new MyModel("Models2\\Weapons\\WeaponsSmall\\WeaponSmall_Autocannon_barrel", MyMeshDrawTechnique.MESH, MyModelsEnum.Autocannon_Barrel, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\Weapons\\WeaponsSmall\\WeaponSmall_Autocannon_base", MyMeshDrawTechnique.MESH, MyModelsEnum.Autocannon_Base, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\Weapons\\WeaponsSmall\\WeaponSmall_Rifle", MyMeshDrawTechnique.MESH, MyModelsEnum.Rifle, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\Weapons\\WeaponsSmall\\WeaponSmall_Shotgun", MyMeshDrawTechnique.MESH, MyModelsEnum.Shotgun, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\Weapons\\WeaponsSmall\\WeaponSmall_Sniper", MyMeshDrawTechnique.MESH, MyModelsEnum.Sniper, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\Weapons\\WeaponsSmall\\WeaponSmall_UniversalLauncher", MyMeshDrawTechnique.MESH, MyModelsEnum.UniversalLauncher, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\Weapons\\WeaponsSmall\\WeaponSmall_MissileLauncher", MyMeshDrawTechnique.MESH, MyModelsEnum.MissileLauncher, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\Weapons\\WeaponsSmall\\WeaponSmall_MachineGun", MyMeshDrawTechnique.MESH, MyModelsEnum.MachineGun, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - - AddModel(new MyModel("Models2\\Weapons\\WeaponsLarge\\WeaponLarge_MachineGun_barrel", MyMeshDrawTechnique.MESH, MyModelsEnum.LargeShipMachineGunBarrel, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddEntityModels("Models2\\Weapons\\WeaponsLarge\\WeaponLarge_MachineGun_base", MyModelsEnum.LargeShipMachineGunBase, null, MyModelsEnum.LargeShipMachineGunBase_COL, true); - AddModel(new MyModel("Models2\\Weapons\\WeaponsLarge\\WeaponLarge_MissileLauncher_9_barrel", MyMeshDrawTechnique.MESH, MyModelsEnum.LargeShipMissileLauncher9Barrel, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddEntityModels("Models2\\Weapons\\WeaponsLarge\\WeaponLarge_MissileLauncher_9_base", MyModelsEnum.LargeShipMissileLauncher9Base, null, MyModelsEnum.LargeShipMissileLauncher9Base_COL, true); - AddModel(new MyModel("Models2\\Weapons\\WeaponsLarge\\WeaponLarge_MissileLauncher_4_barrel", MyMeshDrawTechnique.MESH, MyModelsEnum.LargeShipMissileLauncher4Barrel, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddEntityModels("Models2\\Weapons\\WeaponsLarge\\WeaponLarge_MissileLauncher_4_base", MyModelsEnum.LargeShipMissileLauncher4Base, null, MyModelsEnum.LargeShipMissileLauncher4Base_COL, true); - AddModel(new MyModel("Models2\\Weapons\\WeaponsLarge\\WeaponLarge_MissileLauncher_6_barrel", MyMeshDrawTechnique.MESH, MyModelsEnum.LargeShipMissileLauncher6Barrel, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddEntityModels("Models2\\Weapons\\WeaponsLarge\\WeaponLarge_MissileLauncher_6_base", MyModelsEnum.LargeShipMissileLauncher6Base, null, MyModelsEnum.LargeShipMissileLauncher6Base_COL, true); - AddModel(new MyModel("Models2\\Weapons\\WeaponsLarge\\WeaponLarge_Ciws_barrel", MyMeshDrawTechnique.MESH, MyModelsEnum.LargeShipCiwsBarrel, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddEntityModels("Models2\\Weapons\\WeaponsLarge\\WeaponLarge_Ciws_base", MyModelsEnum.LargeShipCiwsBase, null, MyModelsEnum.LargeShipCiwsBase_COL, true); - AddModel(new MyModel("Models2\\Weapons\\WeaponsLarge\\WeaponLarge_Autocannon_barrel", MyMeshDrawTechnique.MESH, MyModelsEnum.LargeShipAutocannonBarrel, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddEntityModels("Models2\\Weapons\\WeaponsLarge\\WeaponLarge_Autocannon_base", MyModelsEnum.LargeShipAutocannonBase, null, MyModelsEnum.LargeShipAutocannonBase_COL, true); - - AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Projectile_AsteroidKiller", MyMeshDrawTechnique.MESH, MyModelsEnum.AsteroidKiller, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Projectile_DecoyFlare", MyMeshDrawTechnique.MESH, MyModelsEnum.DecoyFlare, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Projectile_DirectionalExplosive", MyMeshDrawTechnique.MESH, MyModelsEnum.DirectionalExplosive, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Projectile_FlashBomb", MyMeshDrawTechnique.MESH, MyModelsEnum.FlashBomb, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Projectile_GravityBomb", MyMeshDrawTechnique.MESH, MyModelsEnum.GravityBomb, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Projectile_Hologram", MyMeshDrawTechnique.MESH, MyModelsEnum.Hologram, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Projectile_IlluminatingShell", MyMeshDrawTechnique.MESH, MyModelsEnum.IlluminatingShell, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Mine", MyMeshDrawTechnique.MESH, MyModelsEnum.MineBasic, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Mine_Homing", MyMeshDrawTechnique.MESH, MyModelsEnum.MineSmart, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Projectile_Missile01", MyMeshDrawTechnique.MESH, MyModelsEnum.Missile, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Projectile_RemoteBomb", MyMeshDrawTechnique.MESH, MyModelsEnum.RemoteBomb, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Projectile_RemoteCamera", MyMeshDrawTechnique.MESH, MyModelsEnum.RemoteCamera, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Projectile_SmokeBomb", MyMeshDrawTechnique.MESH, MyModelsEnum.SmokeBomb, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Projectile_SphereExplosive", MyMeshDrawTechnique.MESH, MyModelsEnum.SphereExplosive, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Projectile_TimeBomb", MyMeshDrawTechnique.MESH, MyModelsEnum.TimeBomb, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\Weapons\\Equipment\\DrillCrusher_base", MyMeshDrawTechnique.MESH, MyModelsEnum.Drill_Base, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\Weapons\\Equipment\\DrillCrusher_gear1", MyMeshDrawTechnique.MESH, MyModelsEnum.Drill_Gear1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\Weapons\\Equipment\\DrillCrusher_gear2", MyMeshDrawTechnique.MESH, MyModelsEnum.Drill_Gear2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\Weapons\\Equipment\\DrillCrusher_gear3", MyMeshDrawTechnique.MESH, MyModelsEnum.Drill_Gear3, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\Weapons\\Equipment\\DrillLaser", MyMeshDrawTechnique.MESH, MyModelsEnum.LaserDrill)); - AddModel(new MyModel("Models2\\Weapons\\Equipment\\DrillNuclear", MyMeshDrawTechnique.MESH, MyModelsEnum.NuclearDrill)); - AddModel(new MyModel("Models2\\Weapons\\Equipment\\DrillNuclearHead", MyMeshDrawTechnique.MESH, MyModelsEnum.NuclearDrillHead)); - AddModel(new MyModel("Models2\\Weapons\\Equipment\\DrillPressure", MyMeshDrawTechnique.MESH, MyModelsEnum.PressureDrill)); - AddModel(new MyModel("Models2\\Weapons\\Equipment\\DrillSaw", MyMeshDrawTechnique.MESH, MyModelsEnum.SawDrill)); - AddModel(new MyModel("Models2\\Weapons\\Equipment\\DrillThermal", MyMeshDrawTechnique.MESH, MyModelsEnum.ThermalDrill)); - AddModel(new MyModel("Models2\\Weapons\\Equipment\\DrillThermalHead", MyMeshDrawTechnique.MESH, MyModelsEnum.ThermalDrillHead)); - AddModel(new MyModel("Models2\\Weapons\\Equipment\\HarvestingDevice_nozzle", MyMeshDrawTechnique.MESH, MyModelsEnum.HarvestingHead, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\Weapons\\Equipment\\HarvestingDevice_tube", MyMeshDrawTechnique.MESH, MyModelsEnum.HarvestingTube, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Jacknife", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Jacknife)); - //AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Jacknife_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Jacknife_LOD1)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Doon", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Doon)); - //AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Doon_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Doon_LOD1)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Hammer", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Hammer)); - //AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Hammer_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Hammer_LOD1)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_ORG", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_ORG)); - //AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_ORG_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_ORG_LOD1)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_ORG_NoPaint", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_ORG_NoPaint)); - //AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_ORG_NoPaint_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_ORG_NoPaint_LOD1)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_YG_Closed", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_YG_Closed)); - //AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_YG_Closed_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_YG_Closed_LOD1)); - - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip02", MyMeshDrawTechnique.MESH, MyModelsEnum.Enforcer)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip03", MyMeshDrawTechnique.MESH, MyModelsEnum.Kammler)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip04", MyMeshDrawTechnique.MESH, MyModelsEnum.Gettysburg)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip10", MyMeshDrawTechnique.MESH, MyModelsEnum.Tracer)); - AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_Default", MyMeshDrawTechnique.MESH, MyModelsEnum.MinerShip_Generic_CockpitInterior)); - AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_Default_glass", MyMeshDrawTechnique.MESH, MyModelsEnum.MinerShip_Generic_CockpitGlass)); - AddModel(new MyModel("Models2\\ObjectsStatic\\Debris\\DebrisField01", MyMeshDrawTechnique.MESH, MyModelsEnum.DebrisField)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Container01a_Red", MyMeshDrawTechnique.MESH, MyModelsEnum.Standard_Container_1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Container01b_Blue", MyMeshDrawTechnique.MESH, MyModelsEnum.Standard_Container_2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Container01c_Grey", MyMeshDrawTechnique.MESH, MyModelsEnum.Standard_Container_3, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Container01d_White", MyMeshDrawTechnique.MESH, MyModelsEnum.Standard_Container_4, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\RockDebris01", MyMeshDrawTechnique.MESH, MyModelsEnum.ExplosionDebrisVoxel, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Tank01", MyMeshDrawTechnique.MESH, MyModelsEnum.cistern, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\TubeBundle01", MyMeshDrawTechnique.MESH, MyModelsEnum.pipe_bundle, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\UtilityVehicle01", MyMeshDrawTechnique.MESH, MyModelsEnum.UtilityVehicle_1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris01", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris02", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris03", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris3, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris04", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris4, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris05", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris5, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris06", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris6, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris07", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris7, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris08", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris8, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris09", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris9, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris10", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris10, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris11", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris11, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris12", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris12, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris13", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris13, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris14", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris14, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris15", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris15, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris16", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris16, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris17", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris17, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris18", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris18, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris19", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris19, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris20", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris20, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris21", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris21, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris22", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris22, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris23", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris23, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris24", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris24, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris25", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris25, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris26", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris26, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris27", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris27, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris28", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris28, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris29", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris29, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris30", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris30, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris31", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris31, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris32_Pilot", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris32_pilot, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\Editor\\EditorGizmo_Rotation", MyMeshDrawTechnique.MESH, MyModelsEnum.GizmoRotation, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - AddModel(new MyModel("Models2\\Editor\\EditorGizmo_Translation", MyMeshDrawTechnique.MESH, MyModelsEnum.GizmoTranslation, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); - - AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_EAC_02", MyMeshDrawTechnique.MESH, MyModelsEnum.EAC02_Cockpit)); - AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_EAC_02_glass", MyMeshDrawTechnique.MESH, MyModelsEnum.EAC02_Cockpit_glass)); - AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_EAC_03", MyMeshDrawTechnique.MESH, MyModelsEnum.EAC03_Cockpit)); - AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_EAC_03_glass", MyMeshDrawTechnique.MESH, MyModelsEnum.EAC03_Cockpit_glass)); - AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_EAC_04", MyMeshDrawTechnique.MESH, MyModelsEnum.EAC04_Cockpit)); - AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_EAC_04_glass", MyMeshDrawTechnique.MESH, MyModelsEnum.EAC04_Cockpit_glass)); - AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_EAC_05", MyMeshDrawTechnique.MESH, MyModelsEnum.EAC05_Cockpit)); - AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_EAC_05_glass", MyMeshDrawTechnique.MESH, MyModelsEnum.EAC05_Cockpit_glass)); - - AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_OmniCorp_01", MyMeshDrawTechnique.MESH, MyModelsEnum.OmniCorp01_Cockpit)); - AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_OmniCorp_01_glass", MyMeshDrawTechnique.MESH, MyModelsEnum.OmniCorp01_Cockpit_glass)); - AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_OmniCorp_03", MyMeshDrawTechnique.MESH, MyModelsEnum.OmniCorp03_Cockpit)); - AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_OmniCorp_03_glass", MyMeshDrawTechnique.MESH, MyModelsEnum.OmniCorp03_Cockpit_glass)); - AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_OmniCorp_04", MyMeshDrawTechnique.MESH, MyModelsEnum.OmniCorp04_Cockpit)); - AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_OmniCorp_04_glass", MyMeshDrawTechnique.MESH, MyModelsEnum.OmniCorp04_Cockpit_glass)); - AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_OmniCorp_EAC_01", MyMeshDrawTechnique.MESH, MyModelsEnum.OmniCorp_EAC01_Cockpit)); - AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_OmniCorp_EAC_glass_01", MyMeshDrawTechnique.MESH, MyModelsEnum.OmniCorp_EAC01_Cockpit_glass)); - - AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_CN_03", MyMeshDrawTechnique.MESH, MyModelsEnum.Cockpit_CN_03)); - AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_CN_03_glass", MyMeshDrawTechnique.MESH, MyModelsEnum.Cockpit_CN_03_glass)); - - AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_SS_04", MyMeshDrawTechnique.MESH, MyModelsEnum.Cockpit_SS_04)); - AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_SS_04_glass", MyMeshDrawTechnique.MESH, MyModelsEnum.Cockpit_SS_04_glass)); - AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_Razorclaw", MyMeshDrawTechnique.MESH, MyModelsEnum.Cockpit_Razorclaw)); - AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_Razorclaw_glass", MyMeshDrawTechnique.MESH, MyModelsEnum.Cockpit_Razorclaw_glass)); - - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip01", MyMeshDrawTechnique.MESH, MyModelsEnum.Liberator)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip05", MyMeshDrawTechnique.MESH, MyModelsEnum.Virginia)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip06", MyMeshDrawTechnique.MESH, MyModelsEnum.Baer)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip07", MyMeshDrawTechnique.MESH, MyModelsEnum.Hewer)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip08", MyMeshDrawTechnique.MESH, MyModelsEnum.Razorclaw)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip09", MyMeshDrawTechnique.MESH, MyModelsEnum.Greiser)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Hawk", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Hawk)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Phoenix", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Phoenix)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Leviathan", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Leviathan)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Rockheater", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Rockheater)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_SteelHead", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_SteelHead)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Talon", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Talon)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Stanislav", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Stanislav)); - - //Debug models - AddModel(new MyModel("Models2\\Debug\\plane_10_50", MyMeshDrawTechnique.MESH, MyModelsEnum.plane_10_50)); - AddModel(new MyModel("Models2\\Debug\\plane_50_20", MyMeshDrawTechnique.MESH, MyModelsEnum.plane_50_20)); - AddModel(new MyModel("Models2\\Debug\\plane_100_10", MyMeshDrawTechnique.MESH, MyModelsEnum.plane_100_10)); - AddModel(new MyModel("Models2\\Debug\\plane_128_70", MyMeshDrawTechnique.MESH, MyModelsEnum.plane_128_70)); - AddModel(new MyModel("Models2\\Debug\\plane_100_50", MyMeshDrawTechnique.MESH, MyModelsEnum.plane_100_50)); - AddModel(new MyModel("Models2\\Debug\\plane_150_50", MyMeshDrawTechnique.MESH, MyModelsEnum.plane_150_50)); - AddModel(new MyModel("Models2\\Debug\\plane_255_70", MyMeshDrawTechnique.MESH, MyModelsEnum.plane_255_70)); - AddModel(new MyModel("Models2\\Debug\\plane_300_70", MyMeshDrawTechnique.MESH, MyModelsEnum.plane_300_70)); - AddModel(new MyModel("Models2\\Debug\\plane_800_10", MyMeshDrawTechnique.MESH, MyModelsEnum.plane_800_10)); - AddModel(new MyModel("Models2\\Debug\\plane_800_70", MyMeshDrawTechnique.MESH, MyModelsEnum.plane_800_70)); - AddModel(new MyModel("Models2\\Debug\\Sphere_smooth", MyMeshDrawTechnique.MESH, MyModelsEnum.sphere_smooth)); - - AddModel(new MyModel("Models2\\Debug\\BoxHiRes", MyMeshDrawTechnique.MESH, MyModelsEnum.BoxHiRes)); - AddModel(new MyModel("Models2\\Debug\\BoxLowRes", MyMeshDrawTechnique.MESH, MyModelsEnum.BoxLowRes)); - AddModel(new MyModel("Models2\\Debug\\Sphere", MyMeshDrawTechnique.MESH, MyModelsEnum.Sphere)); - AddModel(new MyModel("Models2\\Debug\\Sphere_low", MyMeshDrawTechnique.MESH, MyModelsEnum.Sphere_low)); - AddModel(new MyModel("Models2\\Debug\\Cone", MyMeshDrawTechnique.MESH, MyModelsEnum.Cone)); - AddModel(new MyModel("Models2\\Debug\\Hemisphere", MyMeshDrawTechnique.MESH, MyModelsEnum.Hemisphere)); - AddModel(new MyModel("Models2\\Debug\\Hemisphere_low", MyMeshDrawTechnique.MESH, MyModelsEnum.Hemisphere_low)); - AddModel(new MyModel("Models2\\Debug\\Capsule", MyMeshDrawTechnique.MESH, MyModelsEnum.Capsule)); - - - AddEntityModels("Models2\\Prefabs\\05_Details\\02_Lights\\default_light_0", MyModelsEnum.default_light_0, null, MyModelsEnum.default_light_0_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\02_Lights\\p521_a01_light1", MyModelsEnum.p521_a01_light1, null, MyModelsEnum.p521_a01_light1_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\02_Lights\\p521_a02_light2", MyModelsEnum.p521_a02_light2, null, MyModelsEnum.p521_a02_light2_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\02_Lights\\p521_a03_light3", MyModelsEnum.p521_a03_light3, null, MyModelsEnum.p521_a03_light3_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\02_Lights\\p521_a04_light4", MyModelsEnum.p521_a04_light4, null, MyModelsEnum.p521_a04_light4_COL); - - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\05_Particles\\default_particles_0", MyMeshDrawTechnique.MESH, MyModelsEnum.default_particlesprefab_0)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\05_Particles\\p551_a01_particles", MyMeshDrawTechnique.MESH, MyModelsEnum.p551_a01_particles)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\05_Particles\\p551_b01_particles", MyMeshDrawTechnique.MESH, MyModelsEnum.p551_b01_particles)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\05_Particles\\p551_c01_particles", MyMeshDrawTechnique.MESH, MyModelsEnum.p551_c01_particles)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\05_Particles\\p551_d01_particles", MyMeshDrawTechnique.MESH, MyModelsEnum.p551_d01_particles)); - - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\06_Sounds\\default_sound_0", MyMeshDrawTechnique.MESH, MyModelsEnum.default_soundprefab_0)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\06_Sounds\\p561_a01_sound", MyMeshDrawTechnique.MESH, MyModelsEnum.p561_a01_sound)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\06_Sounds\\p561_b01_sound", MyMeshDrawTechnique.MESH, MyModelsEnum.p561_b01_sound)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\06_Sounds\\p561_c01_sound", MyMeshDrawTechnique.MESH, MyModelsEnum.p561_c01_sound)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\06_Sounds\\p561_d01_sound", MyMeshDrawTechnique.MESH, MyModelsEnum.p561_d01_sound)); - - AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a01_billboard", MyModelsEnum.p511_a01_billboard, MyModelsEnum.p511_a01_billboard_LOD1, MyModelsEnum.p511_a01_billboard_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a02_billboard", MyModelsEnum.p511_a02_billboard, MyModelsEnum.p511_a02_billboard_LOD1, MyModelsEnum.p511_a02_billboard_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a03_billboard", MyModelsEnum.p511_a03_billboard, MyModelsEnum.p511_a03_billboard_LOD1, MyModelsEnum.p511_a03_billboard_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a04_billboard", MyModelsEnum.p511_a04_billboard, MyModelsEnum.p511_a04_billboard_LOD1, MyModelsEnum.p511_a04_billboard_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a05_billboard", MyModelsEnum.p511_a05_billboard, MyModelsEnum.p511_a05_billboard_LOD1, MyModelsEnum.p511_a05_billboard_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a06_billboard", MyModelsEnum.p511_a06_billboard, MyModelsEnum.p511_a06_billboard_LOD1, MyModelsEnum.p511_a06_billboard_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a07_billboard", MyModelsEnum.p511_a07_billboard, MyModelsEnum.p511_a07_billboard_LOD1, MyModelsEnum.p511_a07_billboard_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a08_billboard", MyModelsEnum.p511_a08_billboard, MyModelsEnum.p511_a08_billboard_LOD1, MyModelsEnum.p511_a08_billboard_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a09_billboard", MyModelsEnum.p511_a09_billboard, MyModelsEnum.p511_a09_billboard_LOD1, MyModelsEnum.p511_a09_billboard_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a10_billboard", MyModelsEnum.p511_a10_billboard, MyModelsEnum.p511_a10_billboard_LOD1, MyModelsEnum.p511_a10_billboard_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a11_billboard", MyModelsEnum.p511_a11_billboard, MyModelsEnum.p511_a11_billboard_LOD1, MyModelsEnum.p511_a11_billboard_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a12_billboard", MyModelsEnum.p511_a12_billboard, MyModelsEnum.p511_a12_billboard_LOD1, MyModelsEnum.p511_a12_billboard_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a14_billboard", MyModelsEnum.p511_a14_billboard, MyModelsEnum.p511_a14_billboard_LOD1, MyModelsEnum.p511_a14_billboard_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a15_billboard", MyModelsEnum.p511_a15_billboard, MyModelsEnum.p511_a15_billboard_LOD1, MyModelsEnum.p511_a15_billboard_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a16_billboard", MyModelsEnum.p511_a16_billboard, MyModelsEnum.p511_a16_billboard_LOD1, MyModelsEnum.p511_a16_billboard_COL); - - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_a01_sign1", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_a01_sign1)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_a02_sign2", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_a02_sign2)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_a03_sign3", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_a03_sign3)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_a04_sign4", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_a04_sign4)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_a05_sign5", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_a05_sign5)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_a06_sign6", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_a06_sign6)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_a07_sign7", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_a07_sign7)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_a08_sign8", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_a08_sign8)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_a09_sign9", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_a09_sign9)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_a10_sign10", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_a10_sign10)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_a11_sign11", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_a11_sign11)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_a12_sign12", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_a12_sign12)); - - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_administrative_area", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_administrative_area)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_armory", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_armory)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_arrow_L", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_arrow_L)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_arrow_R", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_arrow_R)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_arrow_str", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_arrow_str)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_cargo_bay", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_cargo_bay)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_command_center", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_command_center)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_commercial_area", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_commercial_area)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_communications", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_communications)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_defenses", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_defenses)); - AddEntityModels("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_docks", MyModelsEnum.p531_c_docks, null, MyModelsEnum.p531_c_docks_COL); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_emergency_exit", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_emergency_exit)); - AddEntityModels("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_engineering_area", MyModelsEnum.p531_c_engineering_area, null, MyModelsEnum.p531_c_engineering_area_COL); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_exit", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_exit)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_experimental_labs", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_experimental_labs)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_foundry", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_foundry)); - AddEntityModels("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_habitats", MyModelsEnum.p531_c_habitats, null, MyModelsEnum.p531_c_habitats_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_hangars", MyModelsEnum.p531_c_hangars, null, MyModelsEnum.p531_c_hangars_COL); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_industrial_area", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_industrial_area)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_landing_bay", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_landing_bay)); - AddEntityModels("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_maintenance", MyModelsEnum.p531_c_maintenance, null, MyModelsEnum.p531_c_maintenance_COL); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_military_area", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_military_area)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_mines", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_mines)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_ore_processing", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_ore_processing)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_outer_area", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_outer_area)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_prison", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_prison)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_public_area", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_public_area)); - AddEntityModels("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_reactor", MyModelsEnum.p531_c_reactor, null, MyModelsEnum.p531_c_reactor_COL); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_research", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_research)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_restricted_area", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_restricted_area)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_security", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_security)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_sign", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_sign)); - AddEntityModels("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_storage", MyModelsEnum.p531_c_storage, null, MyModelsEnum.p531_c_storage_COL); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_technical_area", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_technical_area)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_trade_port", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_trade_port)); - - - //AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\01\\p221a02_chamber_v2", MyMeshDrawTechnique.MESH, MyModelsEnum.p221a02_chamber_v2)); - AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\01\\p221a02_chamber_v2", MyModelsEnum.p221a02_chamber_v2, null, MyModelsEnum.p221a02_chamber_v2_COL); - AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\02\\p221b02_chamber_v2", MyMeshDrawTechnique.MESH, MyModelsEnum.p221b02_chamber_v2)); - AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\02\\p221b02_chamber_v2_COL", MyMeshDrawTechnique.MESH, MyModelsEnum.p221b02_chamber_v2_COL)); - - //Used col model from Arena prefab because of bad collision model of this one - //AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\03\\p221c02_chamber_v2", MyModelsEnum.p221c02_chamber_v2, MyModelsEnum.p221c02_chamber_v2_LOD1, MyModelsEnum.p221c01_chamber_v1_COL); - AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\03\\p221c02_chamber_v2", MyMeshDrawTechnique.MESH, MyModelsEnum.p221c02_chamber_v2)); - AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\03\\p221c02_chamber_v2_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p221c02_chamber_v2_LOD1)); - m_models[(int)MyModelsEnum.p221c02_chamber_v2_COL] = m_models[(int)MyModelsEnum.p221c01_chamber_v1_COL]; - - AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\04\\p221d02_chamber_v2", MyModelsEnum.p221d02_chamber_v2, MyModelsEnum.p221d02_chamber_v2_LOD1, MyModelsEnum.p221d02_chamber_v2_COL); - AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\05\\p221e02_chamber_v2", MyMeshDrawTechnique.MESH, MyModelsEnum.p221e02_chamber_v2)); - AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\05\\p221e02_chamber_v2_COL", MyMeshDrawTechnique.MESH, MyModelsEnum.p221e02_chamber_v2_COL)); - - //AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\01\\p221a01_chamber_v1_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p221a01_chamber_v1_LOD1)); - //AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\02\\p221b01_chamber_v1_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p221b01_chamber_v1_LOD1)); - //AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\03\\p221c01_chamber_v1_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p221c01_chamber_v1_LOD1)); - //AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\04\\p221d01_chamber_v1_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p221d01_chamber_v1_LOD1)); - //AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\05\\p221e01_chamber_v1_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p221e01_chamber_v1_LOD1)); - - AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\01\\p221a02_chamber_v2_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p221a02_chamber_v2_LOD1)); - AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\02\\p221b02_chamber_v2_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p221b02_chamber_v2_LOD1)); - //AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\03\\p221c02_chamber_v2_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p221c02_chamber_v2_LOD1)); - //AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\04\\p221d02_chamber_v2_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p221d02_chamber_v2_LOD1)); - AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\05\\p221e02_chamber_v2_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p221e02_chamber_v2_LOD1)); - - AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\01\\p130a01_a_straight_10m", MyModelsEnum.p130a01_a_straight_10m, null, MyModelsEnum.p130a01_a_straight_10m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\01\\p130a02_a_straight_30m", MyModelsEnum.p130a02_a_straight_30m, MyModelsEnum.p130a02_a_straight_30m_LOD1, MyModelsEnum.p130a02_a_straight_30m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\02\\p130b01_b_straight_10m", MyModelsEnum.p130b01_b_straight_10m, null, MyModelsEnum.p130b01_b_straight_10m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\02\\p130b02_b_straight_30m", MyModelsEnum.p130b02_b_straight_30m, MyModelsEnum.p130b02_b_straight_30m_LOD1, MyModelsEnum.p130b02_b_straight_30m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\03\\p130c01_c_straight_10m", MyModelsEnum.p130c01_c_straight_10m, null, MyModelsEnum.p130c01_c_straight_10m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\03\\p130c02_c_straight_30m", MyModelsEnum.p130c02_c_straight_30m, MyModelsEnum.p130c02_c_straight_30m_LOD1, MyModelsEnum.p130c02_c_straight_30m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\04\\p130d01_d_straight_10m", MyModelsEnum.p130d01_d_straight_10m, null, MyModelsEnum.p130d01_d_straight_10m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\04\\p130d02_d_straight_30m", MyModelsEnum.p130d02_d_straight_30m, MyModelsEnum.p130d02_d_straight_30m_LOD1, MyModelsEnum.p130d02_d_straight_30m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\05\\p130e01_e_straight_10m", MyModelsEnum.p130e01_e_straight_10m, null, MyModelsEnum.p130e01_e_straight_10m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\05\\p130e02_e_straight_30m", MyModelsEnum.p130e02_e_straight_30m, MyModelsEnum.p130e02_e_straight_30m_LOD1, MyModelsEnum.p130e02_e_straight_30m_COL); - - AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\04\\p321d01_big_solar_panel", MyModelsEnum.p321d01_big_solar_panel, MyModelsEnum.p321d01_big_solar_panel_LOD1, MyModelsEnum.p321d01_big_solar_panel_COL); - //AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\04\\p321d01_big_solar_panel", MyMeshDrawTechnique.MESH, MyModelsEnum.p321d01_big_solar_panel)); - - AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\01\\p321b01_solar_panel", MyModelsEnum.p321b01_solar_panel, MyModelsEnum.p321b01_solar_panel_LOD1, MyModelsEnum.p321b01_solar_panel_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\01\\p321c01_solar_panel", MyModelsEnum.p321c01_solar_panel, MyModelsEnum.p321c01_solar_panel_LOD1, MyModelsEnum.p321c01_solar_panel_COL); - - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\04\\05_Junction\\p413_d02_junction_t_vertical", MyModelsEnum.p413_d02_junction_t_vertical, MyModelsEnum.p413_d02_junction_t_vertical_LOD1, MyModelsEnum.p413_d02_junction_t_vertical_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\04\\05_Junction\\p413_d04_junction_x_vertical", MyModelsEnum.p413_d04_junction_x_vertical, MyModelsEnum.p413_d04_junction_x_vertical_LOD1, MyModelsEnum.p413_d04_junction_x_vertical_COL); - - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\02_Turn90\\01_230m\\p412_f11_turn_90_up_230m", MyModelsEnum.p412_f11_turn_90_up_230m, MyModelsEnum.p412_f11_turn_90_up_230m_LOD1, MyModelsEnum.p412_f11_turn_90_up_230m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\02_Turn90\\01_230m\\p412_f12_turn_90_left_230m", MyModelsEnum.p412_f12_turn_90_left_230m, MyModelsEnum.p412_f12_turn_90_left_230m_LOD1, MyModelsEnum.p412_f12_turn_90_left_230m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\02_Turn90\\01_230m\\p412_f13_turn_90_right_230m", MyModelsEnum.p412_f13_turn_90_right_230m, MyModelsEnum.p412_f13_turn_90_right_230m_LOD1, MyModelsEnum.p412_f13_turn_90_right_230m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\02_Turn90\\01_230m\\p412_f14_turn_90_down_230m", MyModelsEnum.p412_f14_turn_90_down_230m, MyModelsEnum.p412_f14_turn_90_down_230m_LOD1, MyModelsEnum.p412_f14_turn_90_down_230m_COL); - - //AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\01_Straight\\p411_f04_straight_4", MyMeshDrawTechnique.MESH, MyModelsEnum.p411_f04_straight_4)); - //AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\01_Straight\\p411_f05_straight_5", MyMeshDrawTechnique.MESH, MyModelsEnum.p411_f05_straight_5)); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\01_Straight\\p411_f04_straight_4", MyModelsEnum.p411_f04_straight_4, null, MyModelsEnum.p411_f04_straight_4_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\01_Straight\\p411_f05_straight_5", MyModelsEnum.p411_f05_straight_5, null, MyModelsEnum.p411_f05_straight_5_COL); - - //AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\07\\01_Straight\\p411_g05_straight_5", MyMeshDrawTechnique.MESH, MyModelsEnum.p411_g05_straight_5)); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\07\\01_Straight\\p411_g05_straight_5", MyModelsEnum.p411_g05_straight_5, MyModelsEnum.p411_g05_straight_5_LOD1, MyModelsEnum.p411_g05_straight_5_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\04_Entrance\\p414_f01_entrance_60m", MyModelsEnum.p414_f01_entrance_60m, MyModelsEnum.p414_f01_entrance_60m_LOD1, MyModelsEnum.p414_f01_entrance_60m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\07\\04_Entrance\\p414_g01_entrance_60m", MyModelsEnum.p414_g01_entrance_60m, MyModelsEnum.p414_g01_entrance_60m_LOD1, MyModelsEnum.p414_g01_entrance_60m_COL); - - AddEntityModels("Models2\\Prefabs\\05_Details\\07_traffic_signs\\p571_a01_traffic_sign", MyModelsEnum.p571_a01_traffic_sign, null, MyModelsEnum.p571_a01_traffic_sign_COL); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\07_traffic_signs\\p571_b01_traffic_sign", MyMeshDrawTechnique.MESH, MyModelsEnum.p571_b01_traffic_sign)); - AddEntityModels("Models2\\Prefabs\\05_Details\\07_traffic_signs\\p571_box01_traffic_sign", MyModelsEnum.p571_box01_traffic_sign, null, MyModelsEnum.p571_box01_traffic_sign_COL); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\07_traffic_signs\\p571_box02_traffic_sign", MyMeshDrawTechnique.MESH, MyModelsEnum.p571_box02_traffic_sign)); - AddEntityModels("Models2\\Prefabs\\05_Details\\07_traffic_signs\\p571_c01_traffic_sign", MyModelsEnum.p571_c01_traffic_sign, null, MyModelsEnum.p571_c01_traffic_sign_COL); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\07_traffic_signs\\p571_d01_traffic_sign", MyMeshDrawTechnique.MESH, MyModelsEnum.p571_d01_traffic_sign)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\07_traffic_signs\\p571_e01_traffic_sign", MyMeshDrawTechnique.MESH, MyModelsEnum.p571_e01_traffic_sign)); - AddEntityModels("Models2\\Prefabs\\05_Details\\07_traffic_signs\\p571_f01_traffic_sign", MyModelsEnum.p571_f01_traffic_sign, null, MyModelsEnum.p571_f01_traffic_sign_COL); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\07_traffic_signs\\p571_g01_traffic_sign", MyMeshDrawTechnique.MESH, MyModelsEnum.p571_g01_traffic_sign)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\07_traffic_signs\\p571_h01_traffic_sign", MyMeshDrawTechnique.MESH, MyModelsEnum.p571_h01_traffic_sign)); - AddEntityModels("Models2\\Prefabs\\05_Details\\07_traffic_signs\\p571_i01_traffic_sign", MyModelsEnum.p571_i01_traffic_sign, null, MyModelsEnum.p571_i01_traffic_sign_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\07_traffic_signs\\p571_j01_traffic_sign", MyModelsEnum.p571_j01_traffic_sign, null, MyModelsEnum.p571_j01_traffic_sign_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\07_traffic_signs\\p571_k01_traffic_sign", MyModelsEnum.p571_k01_traffic_sign, null, MyModelsEnum.p571_k01_traffic_sign_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\07_traffic_signs\\p571_l01_traffic_sign", MyModelsEnum.p571_l01_traffic_sign, null, MyModelsEnum.p571_l01_traffic_sign_COL); - - AddEntityModels("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\05_Temple\\01\\p385_a01_temple_900m", MyModelsEnum.p385_a01_temple_900m, MyModelsEnum.p385_a01_temple_900m_LOD1, MyModelsEnum.p385_a01_temple_900m_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\03_Church\\01\\p383_a01_church", MyModelsEnum.p383_a01_church, MyModelsEnum.p383_a01_church_LOD1, MyModelsEnum.p383_a01_church_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\03_LifeSupport\\04_FoodGrowing\\01\\p334_a01_food_grow", MyModelsEnum.p334_a01_food_grow, MyModelsEnum.p334_a01_food_grow_LOD01, MyModelsEnum.p334_a01_food_grow_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\06_BioExperiment\\01\\p345_a01_bio_exp", MyModelsEnum.p345_a01_bio_exp, MyModelsEnum.p345_a01_bio_exp_LOD1, MyModelsEnum.p345_a01_bio_exp_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\06_BioExperiment\\01\\p345_a01_bio_exp_center", MyModelsEnum.p345_a01_bio_exp_center, MyModelsEnum.p345_a01_bio_exp_center_LOD1, MyModelsEnum.p345_a01_bio_exp_center_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\06_BioExperiment\\01\\p345_a01_bio_exp_tanks", MyModelsEnum.p345_a01_bio_exp_tanks, MyModelsEnum.p345_a01_bio_exp_tanks_LOD1, MyModelsEnum.p345_a01_bio_exp_tanks_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\07_BioMachine\\01\\p345_a01_bio_mach_exp", MyModelsEnum.p345_a01_bio_mach_exp, MyModelsEnum.p345_a01_bio_mach_exp_LOD1, MyModelsEnum.p345_a01_bio_mach_exp_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\08_Recycle\\01\\p345_a01_recycle", MyModelsEnum.p345_a01_recycle, MyModelsEnum.p345_a01_recycle_LOD1, MyModelsEnum.p345_a01_recycle_COL); - - //AddModel(new MyModel("Models2\\Prefabs\\05_Details\\04_Other\\541_escape_pod", MyMeshDrawTechnique.MESH, MyModelsEnum.p541_escape_pod)); - AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\541_escape_pod", MyModelsEnum.p541_escape_pod, MyModelsEnum.p541_escape_pod_LOD1, MyModelsEnum.p541_escape_pod_COL); - - AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\541_escape_pod_base", MyModelsEnum.p541_escape_pod_base, MyModelsEnum.p541_escape_pod_base_LOD1, MyModelsEnum.p541_escape_pod_base_COL); - - - //AddModel(new MyModel("Models2\\Prefabs\\05_Details\\04_Other\\541_ventilator_body", MyMeshDrawTechnique.MESH, MyModelsEnum.p541_ventilator_body)); - AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\541_ventilator_body", MyModelsEnum.p541_ventilator_body, MyModelsEnum.p541_ventilator_body_LOD1, MyModelsEnum.p541_ventilator_body_COL); - - AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\541_ventilator_propeller", MyModelsEnum.p541_ventilator_propeller, null, MyModelsEnum.p541_ventilator_propeller_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\541_ventilator_propeller_big", MyModelsEnum.p541_ventilator_propeller_big, MyModelsEnum.p541_ventilator_propeller_big_LOD1, MyModelsEnum.p541_ventilator_propeller_big_COL); - - AddModel(new MyModel("Models2\\Prefabs\\06_Custom\\SimpleObject", MyMeshDrawTechnique.MESH, MyModelsEnum.SimpleObject)); - //AddModel(new MyModel("Models2\\Prefabs\\06_Custom\\asteroid_test", MyMeshDrawTechnique.MESH, MyModelsEnum.AsteroidPrefabTest)); - AddEntityModels("Models2\\Prefabs\\FoundationFactory", MyModelsEnum.FoundationFactory, null, MyModelsEnum.FoundationFactory_COL); - - AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\09_Tower\\p349_a_tower", MyModelsEnum.p349_a_tower, MyModelsEnum.p349_a_tower_LOD1, MyModelsEnum.p349_a_tower_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\09_Tower\\p349_b_tower", MyModelsEnum.p349_b_tower, MyModelsEnum.p349_b_tower_LOD1, MyModelsEnum.p349_b_tower_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\09_Tower\\p349_c_tower", MyModelsEnum.p349_c_tower, MyModelsEnum.p349_c_tower_LOD1, MyModelsEnum.p349_c_tower_COL); - - //AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\07_Hangars\\01_Small\\01\\p361_a02_hangar_panel", MyMeshDrawTechnique.MESH, MyModelsEnum.p361_a02_hangar_panel)); - - AddEntityModels("Models2\\Prefabs\\05_Details\\03_Signs\\p531_b_faction", MyModelsEnum.p531_b_faction, null, MyModelsEnum.p531_b_faction_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\03_Signs\\p531_b_faction_holo", MyModelsEnum.p531_b_faction_holo, null, MyModelsEnum.p531_b_faction_holo_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\armor_hull", MyModelsEnum.armor_hull, MyModelsEnum.armor_hull_LOD1, MyModelsEnum.armor_hull_COL); - - AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\Fourth_Reich_mothership", MyMeshDrawTechnique.MESH, MyModelsEnum.FourthReichMothership)); - AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\Fourth_Reich_mothership_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.FourthReichMothership_LOD1)); - AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\Fourth_Reich_mothership_B", MyModelsEnum.FourthReichMothership_B, MyModelsEnum.FourthReichMothership_B_LOD1, MyModelsEnum.FourthReichMothership_B_COL); - - AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\Rus_mothership", MyModelsEnum.RusMothership, MyModelsEnum.RusMothership_LOD1, MyModelsEnum.RusMothership_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\Rus_Mothership_Russian_Hummer", MyModelsEnum.Russian_Mothership_Hummer, MyModelsEnum.Russian_Mothership_Hummer_LOD1, MyModelsEnum.Russian_Mothership_Hummer_COL); - - - AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\01_Flight\\01_LongTermThruster\\01\\p311a01_long_term_thruster_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p311a01_long_term_thruster_LOD1)); - - AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\02\\p321b01_nuclear_reactor_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p321b01_nuclear_reactor_LOD1)); - AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\04_Industry\\02_LoadingBay\\01\\p342_a01_loading_bay_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p342_a01_loading_bay_LOD1)); - AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\04_Industry\\03_OreStorage\\01\\p343_a01_ore_storage_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p343_a01_ore_storage_LOD1)); - - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Doon_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Doon_LOD1)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Jacknife_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Jacknife_LOD1)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Hammer_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Hammer_LOD1)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_ORG_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_ORG_LOD1)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_ORG_NoPaint_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_ORG_NoPaint_LOD1)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_YG_Closed_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_YG_Closed_LOD1)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Hawk_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Hawk_LOD1)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Phoenix_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Phoenix_LOD1)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Leviathan_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Leviathan_LOD1)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Rockheater_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Rockheater_LOD1)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_SteelHead_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_SteelHead_LOD1)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Talon_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Talon_LOD1)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Stanislav_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Stanislav_LOD1)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip01_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.Liberator_LOD1)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip02_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.Enforcer_LOD1)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip03_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.Kammler_LOD1)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip04_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.Gettysburg_LOD1)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip05_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.Virginia_LOD1)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip06_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.Baer_LOD1)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip07_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.Hewer_LOD1)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip08_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.Razorclaw_LOD1)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip09_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.Greiser_LOD1)); - AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip10_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.Tracer_LOD1)); - - // Drones - AddModel(new MyModel("Models2\\Ships\\Drones\\drone_CN", MyMeshDrawTechnique.MESH, MyModelsEnum.DroneCN)); - AddModel(new MyModel("Models2\\Ships\\Drones\\drone_SS", MyMeshDrawTechnique.MESH, MyModelsEnum.DroneSS)); - AddModel(new MyModel("Models2\\Ships\\Drones\\drone_US", MyMeshDrawTechnique.MESH, MyModelsEnum.DroneUS)); - - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212a01_panel_large", MyModelsEnum.p212a01_panel_large, MyModelsEnum.p212a01_panel_large_LOD1, MyModelsEnum.p212a01_panel_large_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212a01_panel_medium", MyModelsEnum.p212a01_panel_medium, MyModelsEnum.p212a01_panel_medium_LOD1, MyModelsEnum.p212a01_panel_medium_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212b02_panel_medium", MyModelsEnum.p212b02_panel_medium, MyModelsEnum.p212b02_panel_medium_LOD1, MyModelsEnum.p212b02_panel_medium_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212c03_panel_medium", MyModelsEnum.p212c03_panel_medium, MyModelsEnum.p212c03_panel_medium_LOD1, MyModelsEnum.p212c03_panel_medium_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212d04_panel_medium", MyModelsEnum.p212d04_panel_medium, null, MyModelsEnum.p212d04_panel_medium_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212e05_panel_medium", MyModelsEnum.p212e05_panel_medium, null, MyModelsEnum.p212e05_panel_medium_COL); - - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212a01_panel_small", MyModelsEnum.p212a01_panel_small, null, MyModelsEnum.p212a01_panel_small_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212b02_panel_small", MyModelsEnum.p212b02_panel_small, null, MyModelsEnum.p212b02_panel_small_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212c03_panel_small", MyModelsEnum.p212c03_panel_small, null, MyModelsEnum.p212c03_panel_small_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212d04_panel_small", MyModelsEnum.p212d04_panel_small, null, MyModelsEnum.p212d04_panel_small_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212e05_panel_small", MyModelsEnum.p212e05_panel_small, null, MyModelsEnum.p212e05_panel_small_COL); - - AddModel(new MyModel("Models2\\ObjectsFloating\\Box_matt_5m", MyMeshDrawTechnique.MESH, MyModelsEnum.MysteriousBox_matt_5m)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Box_spec_5m", MyMeshDrawTechnique.MESH, MyModelsEnum.MysteriousBox_spec_5m)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Box_mid_5m", MyMeshDrawTechnique.MESH, MyModelsEnum.MysteriousBox_mid_5m)); - - - AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\01_Docks\\03\\p341_c01_closed_dock_v1", MyModelsEnum.p341_c01_closed_dock_v1, MyModelsEnum.p341_c01_closed_dock_v1_LOD1, MyModelsEnum.p341_c01_closed_dock_v1_COL); - - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212b02_panel_large", MyModelsEnum.p212b02_panel_large, MyModelsEnum.p212b02_panel_large_LOD1, MyModelsEnum.p212b02_panel_large_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212c03_panel_large", MyModelsEnum.p212c03_panel_large, MyModelsEnum.p212c03_panel_large_LOD1, MyModelsEnum.p212c03_panel_large_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212d04_panel_large", MyModelsEnum.p212d04_panel_large, MyModelsEnum.p212d04_panel_large_LOD1, MyModelsEnum.p212d04_panel_large_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212e05_panel_large", MyModelsEnum.p212e05_panel_large, MyModelsEnum.p212e05_panel_large_LOD1, MyModelsEnum.p212e05_panel_large_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212f01_panel_large", MyModelsEnum.p212f01_panel_large, null, MyModelsEnum.p212f01_panel_large_COL); - - AddEntityModels("Models2\\Prefabs\\03_Modules\\09_Alien\\01_Alien_Gate\\p391_Alien_Gate", MyModelsEnum.Alien_gate, MyModelsEnum.Alien_gate_LOD1, null); - - AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\mship\\mship_body", MyModelsEnum.mship_body, MyModelsEnum.mship_body_LOD1, null); - AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\mship\\mship_engine", MyModelsEnum.mship_engine, MyModelsEnum.mship_engine_LOD1, null); - AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\mship\\mship_shield_back_large_left", MyModelsEnum.mship_shield_back_large_left, MyModelsEnum.mship_shield_back_large_left_LOD1, null); - AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\mship\\mship_shield_back_large_right", MyModelsEnum.mship_shield_back_large_right, MyModelsEnum.mship_shield_back_large_right_LOD1, null); - AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\mship\\mship_shield_back_small_left", MyModelsEnum.mship_shield_back_small_left, MyModelsEnum.mship_shield_back_small_left_LOD1, null); - AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\mship\\mship_shield_back_small_right", MyModelsEnum.mship_shield_back_small_right, MyModelsEnum.mship_shield_back_small_right_LOD1, null); - AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\mship\\mship_shield_front_large_left", MyModelsEnum.mship_shield_front_large_left, MyModelsEnum.mship_shield_front_large_left_LOD1, null); - AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\mship\\mship_shield_front_large_right", MyModelsEnum.mship_shield_front_large_right, MyModelsEnum.mship_shield_front_large_right_LOD1, null); - AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\mship\\mship_shield_front_small_left", MyModelsEnum.mship_shield_front_small_left, MyModelsEnum.mship_shield_front_small_left_LOD1, null); - AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\mship\\mship_shield_front_small_right", MyModelsEnum.mship_shield_front_small_right, MyModelsEnum.mship_shield_front_small_right_LOD1, null); - AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\mship\\mship_shield_front_small02_left", MyModelsEnum.mship_shield_front_small02_left, MyModelsEnum.mship_shield_front_small02_left_LOD1, null); - AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\mship\\mship_shield_front_small02_right", MyModelsEnum.mship_shield_front_small02_right, MyModelsEnum.mship_shield_front_small02_right_LOD1, null); - - AddEntityModels("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\01_LivingQuarters\\04\\p381_d03_hospital", MyModelsEnum.p381_d03_hospital, MyModelsEnum.p381_d03_hospital_LOD1, MyModelsEnum.p381_d03_hospital_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\01_LivingQuarters\\04\\p381_d05_food_grow", MyModelsEnum.p381_d05_food_grow, MyModelsEnum.p381_d05_food_grow_LOD1, null); - - AddEntityModels("Models2\\Prefabs\\04_Connections\\04_Cables\\Cable_corner_25m", MyModelsEnum.Cable_corner_25m, null, MyModelsEnum.Cable_corner_25m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\04_Cables\\Cable_S_45m", MyModelsEnum.Cable_S_45m, null, MyModelsEnum.Cable_S_45m_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\04_Cables\\Cable_straight_180", MyModelsEnum.Cable_straight_180, null, MyModelsEnum.Cable_straight_180_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\04_Cables\\Cable_straight_45", MyModelsEnum.Cable_straight_45, null, MyModelsEnum.Cable_straight_45_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\04_Cables\\Cable_straight_90", MyModelsEnum.Cable_straight_90, null, MyModelsEnum.Cable_straight_90_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\04_Cables\\Connection_box", MyModelsEnum.Connection_box, null, MyModelsEnum.Connection_box_COL); - - AddModel(new MyModel("Models2\\ObjectsFloating\\cargo_box", MyMeshDrawTechnique.MESH, MyModelsEnum.cargo_box_1)); - AddModel(new MyModel("Models2\\ObjectsFloating\\cargo_box_2", MyMeshDrawTechnique.MESH, MyModelsEnum.cargo_box_2)); - AddModel(new MyModel("Models2\\ObjectsFloating\\cargo_box_3", MyMeshDrawTechnique.MESH, MyModelsEnum.cargo_box_3)); - AddModel(new MyModel("Models2\\ObjectsFloating\\cargo_box_4", MyMeshDrawTechnique.MESH, MyModelsEnum.cargo_box_4)); - AddModel(new MyModel("Models2\\ObjectsFloating\\cargo_box_5", MyMeshDrawTechnique.MESH, MyModelsEnum.cargo_box_5)); - AddModel(new MyModel("Models2\\ObjectsFloating\\cargo_box_6", MyMeshDrawTechnique.MESH, MyModelsEnum.cargo_box_6)); - AddModel(new MyModel("Models2\\ObjectsFloating\\cargo_box_7", MyMeshDrawTechnique.MESH, MyModelsEnum.cargo_box_7)); - AddModel(new MyModel("Models2\\ObjectsFloating\\cargo_box_8", MyMeshDrawTechnique.MESH, MyModelsEnum.cargo_box_8)); - AddModel(new MyModel("Models2\\ObjectsFloating\\cargo_box_9", MyMeshDrawTechnique.MESH, MyModelsEnum.cargo_box_9)); - AddModel(new MyModel("Models2\\ObjectsFloating\\cargo_box_10", MyMeshDrawTechnique.MESH, MyModelsEnum.cargo_box_10)); - AddModel(new MyModel("Models2\\ObjectsFloating\\cargo_box_small", MyMeshDrawTechnique.MESH, MyModelsEnum.cargo_box_small)); - AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\541_security_hub", MyModelsEnum.p541_security_hub, MyModelsEnum.p541_security_hub_LOD1, MyModelsEnum.p541_security_hub_COL); - AddModel(new MyModel("Models2\\ObjectsFloating\\Alarm", MyMeshDrawTechnique.MESH, MyModelsEnum.Alarm)); - AddModel(new MyModel("Models2\\ObjectsFloating\\Alarm_off", MyMeshDrawTechnique.MESH, MyModelsEnum.Alarm_off)); - AddEntityModels("Models2\\ObjectsFloating\\Bank_node", MyModelsEnum.Bank_node, null, MyModelsEnum.Bank_node_COL); - //AddEntityModels("Models2\\ObjectsFloating\\Bank_node", MyModelsEnum.Bank_node, null, null); - AddModel(new MyModel("Models2\\ObjectsFloating\\Cam", MyMeshDrawTechnique.MESH, MyModelsEnum.Cam)); - - AddEntityModels("Models2\\Prefabs\\03_Modules\\06_Communications\\01_LongDistanceAntenna\\01\\p361_b01_long_distance_antenna_big", MyModelsEnum.p361_b01_long_distance_antenna_big, MyModelsEnum.p361_b01_long_distance_antenna_big_LOD1, MyModelsEnum.p361_b01_long_distance_antenna_big_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\06_Communications\\01_LongDistanceAntenna\\01\\p361_b01_long_distance_antenna_dish", MyModelsEnum.p361_b01_long_distance_antenna_dish, MyModelsEnum.p361_b01_long_distance_antenna_dish_LOD1, MyModelsEnum.p361_b01_long_distance_antenna_dish_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\4th_reich_wreck", MyModelsEnum.fourth_reich_wreck, MyModelsEnum.fourth_reich_wreck_LOD1, MyModelsEnum.fourth_reich_wreck_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\04_CargoStorage\\01\\p344_a03_container", MyModelsEnum.p344_a03_container, MyModelsEnum.p344_a03_container_LOD1, MyModelsEnum.p344_a03_container_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231b01_armor", MyModelsEnum.p231b01_armor, MyModelsEnum.p231b01_armor_LOD1, MyModelsEnum.p231b01_armor_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231b01_armor_corner", MyModelsEnum.p231b01_armor_corner, MyModelsEnum.p231b01_armor_corner_LOD1, MyModelsEnum.p231b01_armor_corner_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231b01_armor_edge", MyModelsEnum.p231b01_armor_edge, MyModelsEnum.p231b01_armor_edge_LOD1, MyModelsEnum.p231b01_armor_edge_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231b01_armor_hole", MyModelsEnum.p231b01_armor_hole, MyModelsEnum.p231b01_armor_hole_LOD1, MyModelsEnum.p231b01_armor_hole_COL); - - AddEntityModels("Models2\\Prefabs\\01_Beams\\05_Shelf\\p150a03_shelf_1", MyModelsEnum.p150a03_shelf_1, MyModelsEnum.p150a03_shelf_1_LOD1, MyModelsEnum.p150a03_shelf_1_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\05_Shelf\\p150a02_shelf_1X2", MyModelsEnum.p150a02_shelf_1X2, MyModelsEnum.p150a02_shelf_1X2_LOD1, MyModelsEnum.p150a02_shelf_1X2_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\05_Shelf\\p150a01_shelf_1X3", MyModelsEnum.p150a01_shelf_1X3, MyModelsEnum.p150a01_shelf_1X3_LOD1, MyModelsEnum.p150a01_shelf_1X3_COL); - - AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\04\\p130d02_d_straight_300m", MyModelsEnum.p130d02_d_straight_300m, MyModelsEnum.p130d02_d_straight_300m_LOD1, MyModelsEnum.p130d02_d_straight_300m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\10\\p130j01_j_straight_300m", MyModelsEnum.p130j01_j_straight_300m, MyModelsEnum.p130j01_j_straight_300m_LOD1, MyModelsEnum.p130j01_j_straight_300m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\03\\p120c02_c_straight_400m", MyModelsEnum.p120c02_c_straight_400m, MyModelsEnum.p120c02_c_straight_400m_LOD1, MyModelsEnum.p120c02_c_straight_400m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\02\\p110b03_lattice_beam_straight_420m", MyModelsEnum.p110b03_lattice_beam_straight_420m, MyModelsEnum.p110b03_lattice_beam_straight_420m_LOD1, MyModelsEnum.p110b03_lattice_beam_straight_420m_COL); - AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\02\\p110b04_lattice_beam_straight_420m_with_panels", MyModelsEnum.p110b04_lattice_beam_straight_420m_with_panels, MyModelsEnum.p110b04_lattice_beam_straight_420m_with_panels_LOD1, MyModelsEnum.p110b04_lattice_beam_straight_420m_with_panels_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\06_Communications\\03_BigAntenna\\p363_a01_big_antenna_300m", MyModelsEnum.p363_a01_big_antenna_300m, MyModelsEnum.p363_a01_big_antenna_300m_LOD1, MyModelsEnum.p363_a01_big_antenna_300m_COL); - AddEntityModels("Models2\\Prefabs\\06_Custom\\01_Asteroid_Prefabs\\p611_asteroid_part_A", MyModelsEnum.p611_asteroid_part_A, MyModelsEnum.p611_asteroid_part_A_LOD1, null); - AddEntityModels("Models2\\Prefabs\\06_Custom\\01_Asteroid_Prefabs\\p611_asteroid_part_B", MyModelsEnum.p611_asteroid_part_B, MyModelsEnum.p611_asteroid_part_B_LOD1, null); - - //AddModel(new MyModel("Models2\\Prefabs\\05_Details\\04_Other\\541_ventilator_body_standalone", MyMeshDrawTechnique.MESH, MyModelsEnum.p541_ventilator_body_standalone)); - AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\541_ventilator_body_standalone", MyModelsEnum.p541_ventilator_body_standalone, MyModelsEnum.p541_ventilator_body_standalone_LOD1, MyModelsEnum.p541_ventilator_body_standalone_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\541_ventilator_propeller_standalone", MyModelsEnum.p541_ventilator_propeller_standalone, MyModelsEnum.p541_ventilator_propeller_standalone_LOD1, MyModelsEnum.p541_ventilator_propeller_standalone_COL); - - AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c03_centrifuge", MyModelsEnum.p321c03_centrifuge, MyModelsEnum.p321c03_centrifuge_LOD1, MyModelsEnum.p321c03_centrifuge_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c04_box_generator", MyModelsEnum.p321c04_box_generator, MyModelsEnum.p321c04_box_generator_LOD1, MyModelsEnum.p321c04_box_generator_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c05_centrifuge_big", MyModelsEnum.p321c05_centrifuge_big, MyModelsEnum.p321c05_centrifuge_big_LOD1, MyModelsEnum.p321c05_centrifuge_big_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\06_Communications\\03_BigAntenna\\p363_a01_big_antenna_1500m", MyModelsEnum.p363_a01_big_antenna_1500m, MyModelsEnum.p363_a01_big_antenna_1500m_LOD1, MyModelsEnum.p363_a01_big_antenna_1500m_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\\\p321c02_generator_wall_big", MyModelsEnum.p321c02_generator_wall_big, MyModelsEnum.p321c02_generator_wall_big_LOD1, MyModelsEnum.p321c02_generator_wall_big_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c02_inertia_generator_center_big", MyModelsEnum.p321c02_inertia_generator_center_big, MyModelsEnum.p321c02_inertia_generator_center_big_LOD1, MyModelsEnum.p321c02_inertia_generator_center_big_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c02_inertia_generator_center_vert", MyModelsEnum.p321c02_inertia_generator_center_vert, MyModelsEnum.p321c02_inertia_generator_center_vert_LOD1, null); - AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c03_centrifuge_centre", MyModelsEnum.p321c03_centrifuge_centre, MyModelsEnum.p321c03_centrifuge_centre_LOD1, MyModelsEnum.p321c03_centrifuge_centre_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c04_two_big_inertia", MyModelsEnum.p321c04_two_big_inertia, MyModelsEnum.p321c04_two_big_inertia_LOD1, null); - AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c05_centrifuge_centre_big", MyModelsEnum.p321c05_centrifuge_centre_big, MyModelsEnum.p321c05_centrifuge_centre_big_LOD1, null); - - AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c06_inertia_B_centre", MyModelsEnum.p321c06_inertia_B_centre, MyModelsEnum.p321c06_inertia_B_centre_LOD1, MyModelsEnum.p321c06_inertia_B_centre_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c06_inertia_generator_B", MyModelsEnum.p321c06_inertia_generator_B, MyModelsEnum.p321c06_inertia_generator_B_LOD1, MyModelsEnum.p321c06_inertia_generator_B_COL); - AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\02_Pipe\\02\\01_Cooling_Device_Wall\\p4221_a01_cooling_device_ventilator_1", MyMeshDrawTechnique.MESH, MyModelsEnum.p4221_a01_cooling_device_ventilator_1)); - AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\02_Pipe\\02\\01_Cooling_Device_Wall\\p4221_a01_cooling_device_ventilator_2", MyMeshDrawTechnique.MESH, MyModelsEnum.p4221_a01_cooling_device_ventilator_2)); - AddEntityModels("Models2\\Prefabs\\04_Connections\\02_Pipe\\02\\01_Cooling_Device_Wall\\p4221_a01_cooling_device_wall_340x400", MyModelsEnum.p4221_a01_cooling_device_wall_340x400, MyModelsEnum.p4221_a01_cooling_device_wall_340x400_LOD1, MyModelsEnum.p4221_a01_cooling_device_wall_340x400_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\02_Pipe\\02\\02_Pipes_Connector\\p4222_a01_pipes_connector_center", MyModelsEnum.p4222_a01_pipes_connector_center, MyModelsEnum.p4222_a01_pipes_connector_center_LOD1, null); - AddEntityModels("Models2\\Prefabs\\04_Connections\\02_Pipe\\02\\02_Pipes_Connector\\p4222_a01_pipes_connector", MyModelsEnum.p4222_a01_pipes_connector, MyModelsEnum.p4222_a01_pipes_connector_LOD1, MyModelsEnum.p4222_a01_pipes_connector_COL); - AddEntityModels("Models2\\Prefabs\\04_Connections\\02_Pipe\\02\\03_Open_Pipe\\p4223_a01_open_pipe", MyModelsEnum.p4223_a01_open_pipe, MyModelsEnum.p4223_a01_open_pipe_LOD1, MyModelsEnum.p4223_a01_open_pipe_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\01_Flight\\01_LongTermThruster\\01\\p311b01_long_term_thruster", MyModelsEnum.p311b01_long_term_thruster, MyModelsEnum.p311b01_long_term_thruster_LOD1, null); - AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c07_generator_center", MyModelsEnum.p321c07_generator_center, MyModelsEnum.p321c07_generator_center_LOD1, null); - AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c07_generator_propeller_1", MyModelsEnum.p321c07_generator_propeller_1, null, MyModelsEnum.p321c07_generator_propeller_1_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c07_generator_propeller_2", MyModelsEnum.p321c07_generator_propeller_2, null, MyModelsEnum.p321c07_generator_propeller_2_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c07_generator", MyModelsEnum.p321c07_generator, MyModelsEnum.p321c07_generator_LOD1, MyModelsEnum.p321c07_generator_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\10\\p221k01_chamber_v2", MyModelsEnum.p221k01_chamber_v2, MyModelsEnum.p221k01_chamber_v2_LOD1, null); - - - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\08_Barrels\\p581_a01_barrel_biohazard", MyMeshDrawTechnique.MESH, MyModelsEnum.p581_a01_barrel_biohazard)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\08_Barrels\\p581_a01_barrel_biohazard_2", MyMeshDrawTechnique.MESH, MyModelsEnum.p581_a01_barrel_biohazard_2)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\08_Barrels\\p581_a01_nuke_barrel", MyMeshDrawTechnique.MESH, MyModelsEnum.p581_a01_nuke_barrel)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\08_Barrels\\p581_a01_red_barrel", MyMeshDrawTechnique.MESH, MyModelsEnum.p581_a01_red_barrel)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\08_Barrels\\p581_a01_simple_barrel", MyMeshDrawTechnique.MESH, MyModelsEnum.p581_a01_simple_barrel)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\08_Barrels\\p581_a01_simple_barrel_2", MyMeshDrawTechnique.MESH, MyModelsEnum.p581_a01_simple_barrel_2)); - AddModel(new MyModel("Models2\\ObjectsFloating\\cargo_box_11", MyMeshDrawTechnique.MESH, MyModelsEnum.cargo_box_11)); - AddModel(new MyModel("Models2\\ObjectsFloating\\cargo_box_12", MyMeshDrawTechnique.MESH, MyModelsEnum.cargo_box_12)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\08_Barrels\\Barrel_prop_A", MyMeshDrawTechnique.MESH, MyModelsEnum.Barrel_prop_A)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\08_Barrels\\Barrel_prop_B", MyMeshDrawTechnique.MESH, MyModelsEnum.Barrel_prop_B)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\08_Barrels\\Barrel_prop_C", MyMeshDrawTechnique.MESH, MyModelsEnum.Barrel_prop_C)); - //AddModel(new MyModel("Models2\\Prefabs\\05_Details\\08_Barrels\\Barrel_prop_D", MyMeshDrawTechnique.MESH, MyModelsEnum.Barrel_prop_D)); - //AddModel(new MyModel("Models2\\Prefabs\\05_Details\\08_Barrels\\Barrel_prop_E", MyMeshDrawTechnique.MESH, MyModelsEnum.Barrel_prop_E)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\08_Barrels\\p581_a01_universal_barrel_COL", MyMeshDrawTechnique.MESH, MyModelsEnum.p581_a01_universal_barrel_COL)); - AddModel(new MyModel("Models2\\ObjectsFloating\\CargoBox_prop_A", MyMeshDrawTechnique.MESH, MyModelsEnum.CargoBox_prop_A)); - AddModel(new MyModel("Models2\\ObjectsFloating\\CargoBox_prop_B", MyMeshDrawTechnique.MESH, MyModelsEnum.CargoBox_prop_B)); - AddModel(new MyModel("Models2\\ObjectsFloating\\CargoBox_prop_C", MyMeshDrawTechnique.MESH, MyModelsEnum.CargoBox_prop_C)); - AddEntityModels("Models2\\Prefabs\\05_Details\\09_Ammo\\CannonBall_Capsule_1", MyModelsEnum.CannonBall_Capsule_1, null, MyModelsEnum.CannonBall_Capsule_1_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\09_Ammo\\Gattling_ammo_belt", MyModelsEnum.gattling_ammo_belt, null, MyModelsEnum.gattling_ammo_belt_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\09_Ammo\\Missile_pack01", MyModelsEnum.Missile_pack01, null, MyModelsEnum.Missile_pack01_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\09_Ammo\\Missile_pack02", MyModelsEnum.Missile_pack02, null, MyModelsEnum.Missile_pack02_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\09_Ammo\\Missile_plazma01", MyModelsEnum.Missile_plazma01, null, MyModelsEnum.Missile_plazma01_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\09_Ammo\\Missile_stack_biochem01", MyModelsEnum.Missile_stack_biochem01, null, MyModelsEnum.Missile_stack_biochem01_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\08_Barrels\\p581_a01_o2_barrel", MyModelsEnum.p581_a01_o2_barrel, null, MyModelsEnum.p581_a01_o2_barrel_COL); - - //AddModel(new MyModel("Models2\\Prefabs\\05_Details\\09_Ammo\\Nuclear_Warhead_closed", MyMeshDrawTechnique.MESH, MyModelsEnum.Nuclear_Warhead_closed)); - AddEntityModels("Models2\\Prefabs\\05_Details\\09_Ammo\\Nuclear_Warhead_closed", MyModelsEnum.Nuclear_Warhead_closed, MyModelsEnum.Nuclear_Warhead_closed_LOD1, MyModelsEnum.Nuclear_Warhead_closed_COL); - //AddModel(new MyModel("Models2\\Prefabs\\05_Details\\09_Ammo\\Nuclear_Warhead_open", MyMeshDrawTechnique.MESH, MyModelsEnum.Nuclear_Warhead_open)); - AddEntityModels("Models2\\Prefabs\\05_Details\\09_Ammo\\Nuclear_Warhead_open", MyModelsEnum.Nuclear_Warhead_open, MyModelsEnum.Nuclear_Warhead_open_LOD1, MyModelsEnum.Nuclear_Warhead_open_COL); - AddModel(new MyModel("Models2\\ObjectsFloating\\CargoBox_prop_D", MyMeshDrawTechnique.MESH, MyModelsEnum.CargoBox_prop_D)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\08_Barrels\\p581_a01_nuke_barrel_1", MyMeshDrawTechnique.MESH, MyModelsEnum.p581_a01_nuke_barrel_1)); - AddModel(new MyModel("Models2\\Prefabs\\05_Details\\08_Barrels\\p581_a01_simple_barrel_3", MyMeshDrawTechnique.MESH, MyModelsEnum.p581_a01_simple_barrel_3)); - AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\11\\p221L01_chamber_v1", MyModelsEnum.p221L01_chamber_v1, MyModelsEnum.p221L01_chamber_v1_LOD1, MyModelsEnum.p221L01_chamber_v1_COL); - - AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\12\\p221M01_chamber_bottom_v1", MyModelsEnum.p221m01_chamber_bottom_v1, MyModelsEnum.p221m01_chamber_bottom_v1_LOD1, MyModelsEnum.p221m01_chamber_bottom_v1_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\12\\p221M01_chamber_center_v1", MyModelsEnum.p221m01_chamber_center_v1, MyModelsEnum.p221m01_chamber_center_v1_LOD1, MyModelsEnum.p221m01_chamber_center_v1_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\12\\p221M01_chamber_top_v1", MyModelsEnum.p221m01_chamber_top_v1, MyModelsEnum.p221m01_chamber_top_v1_LOD1, MyModelsEnum.p221m01_chamber_top_v1_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\04\\p321e01_solar_panel", MyModelsEnum.p321e01_solar_panel, MyModelsEnum.p321e01_solar_panel_LOD1, MyModelsEnum.p321e01_solar_panel_COL); - AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a06_solid_beam_straight_420m", MyMeshDrawTechnique.MESH, MyModelsEnum.p110a06_solid_beam_straight_420m)); - - AddEntityModels("Models2\\Prefabs\\03_Modules\\01_Flight\\01_LongTermThruster\\02\\p311b01_cut_thruster", MyModelsEnum.p311b01_cut_thruster, MyModelsEnum.p311b01_cut_thruster_LOD1, MyModelsEnum.p311b01_cut_thruster_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\01_Flight\\02_ShortTermThruster\\02\\p312b01_cut_thruster_lateral", MyModelsEnum.p312b01_cut_thruster_lateral, MyModelsEnum.p312b01_cut_thruster_lateral_LOD1, MyModelsEnum.p312b01_cut_thruster_lateral_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\01_Flight\\02_ShortTermThruster\\02\\p312b02_cut_thruster_latitude", MyModelsEnum.p312b02_cut_thruster_latitude, MyModelsEnum.p312b02_cut_thruster_latitude_LOD1, MyModelsEnum.p312b02_cut_thruster_latitude_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\alien_detector_unit", MyModelsEnum.alien_detector_unit, null, MyModelsEnum.alien_detector_unit_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\01_LivingQuarters\\03\\p381_c01_building5", MyModelsEnum.p381_c01_building5, MyModelsEnum.p381_c01_building5_LOD1, MyModelsEnum.p381_c01_building5_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\01_LivingQuarters\\03\\p381_c01_building6", MyModelsEnum.p381_c01_building6, MyModelsEnum.p381_c01_building6_LOD1, MyModelsEnum.p381_c01_building6_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\01_LivingQuarters\\03\\p381_c01_building7", MyModelsEnum.p381_c01_building7, MyModelsEnum.p381_c01_building7_LOD1, MyModelsEnum.p381_c01_building7_COL); - AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\13\\p221n01_chamber_v1", MyModelsEnum.p221n01_chamber_v1, MyModelsEnum.p221n01_chamber_v1_LOD1, MyModelsEnum.p221n01_chamber_v1_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\03_Signs\\531_d_medic_cross", MyModelsEnum.p531_d_medic_cross, null, MyModelsEnum.p531_d_medic_cross_COL); - - AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\541_screen_A", MyModelsEnum.p541_screen_A, MyModelsEnum.p541_screen_A_LOD1, MyModelsEnum.p541_screen_A_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\541_screen_B", MyModelsEnum.p541_screen_B, MyModelsEnum.p541_screen_B_LOD1, MyModelsEnum.p541_screen_B_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\541_terminal_A", MyModelsEnum.p541_terminal_A, MyModelsEnum.p541_terminal_A_LOD1, MyModelsEnum.p541_terminal_A_COL); - - AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\alien_artefact", MyModelsEnum.alien_artefact, null, MyModelsEnum.alien_artefact_COL); - - AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\bomb", MyModelsEnum.bomb, null, MyModelsEnum.bomb_COL); - - AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\14\\rail_gun", MyModelsEnum.rail_gun, MyModelsEnum.rail_gun_LOD1, MyModelsEnum.rail_gun_COL); - AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\08_Recycle\\01\\p345_a01_recycle_sphere", MyModelsEnum.p345_a01_recycle_sphere, MyModelsEnum.p345_a01_recycle_sphere_LOD1, MyModelsEnum.p345_a01_recycle_sphere_COL); - - AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\15\\prison", MyModelsEnum.prison, null, MyModelsEnum.prison_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\vendor", MyModelsEnum.vendor, null, MyModelsEnum.vendor_COL); - - AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\hangar_screen", MyModelsEnum.hangar_screen, null, MyModelsEnum.hangar_screen_COL); - - AddEntityModels("Models2\\Prefabs\\ScannerPlane", MyModelsEnum.ScannerPlane, null, null); - AddEntityModels("Models2\\Prefabs\\ScannerRays", MyModelsEnum.ScannerRays, null, null); - - AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a17_billboard_portrait_1", MyModelsEnum.p511_a17_billboard_portrait_1, null, MyModelsEnum.p511_a17_billboard_portrait_1_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a17_billboard_portrait_2", MyModelsEnum.p511_a17_billboard_portrait_2, null, null); - - AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a18_billboard", MyModelsEnum.p511_a18_billboard, MyModelsEnum.p511_a18_billboard_LOD1, MyModelsEnum.p511_a18_billboard_COL); - AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a19_billboard", MyModelsEnum.p511_a19_billboard, MyModelsEnum.p511_a19_billboard_LOD1, MyModelsEnum.p511_a19_billboard_COL); - - - // Check if we didn't forget to load some model - foreach (int i in Enum.GetValues(typeof(MyModelsEnum))) - { - MyModel myModel = m_models[i]; - MyModelsEnum modelEnum = (MyModelsEnum)i; - MyMwcLog.WriteLine("Checking model enum id [" + i + "] " + modelEnum, LoggingOptions.ENUM_CHECKING); // Here we show model enum as a string. It won't work after obfuscation, but we need it only in debug (before obfuscation), so it's OK. - MyCommonDebugUtils.AssertRelease(myModel != null); - } - - //FindMissingAndUnusedModels(); - - MyMwcLog.DecreaseIndent(); - MyMwcLog.WriteLine("MyModels.InitModels - END"); - } - - /// - /// Used to find models that does not have LOD1 or COL set, and models that can have those models set - /// - private static void FindMissingAndUnusedModels() - { - string contentDirectory = @"C:\KeenSWH\MinerWars\Sources\MinerWars\Content"; - - using (StreamWriter missing = new StreamWriter(File.OpenWrite("models-missing.csv")), notused = new StreamWriter(File.OpenWrite("models-notused.csv"))) - { - missing.WriteLine("Model,Triangles,Volume,Missing"); - notused.WriteLine("Model,NotUsed"); - foreach (int i in Enum.GetValues(typeof(MyModelsEnum))) - { - MyModel myModel = m_models[i]; - string firstAssetName = NormalizeAssetName(myModel.AssetName); - - if (!firstAssetName.EndsWith("LOD0", StringComparison.InvariantCultureIgnoreCase)) - continue; - - bool hasLod1 = false; - bool hasCol = false; - foreach (int j in Enum.GetValues(typeof(MyModelsEnum))) - { - if (i == j) - continue; - - MyModel secondModel = m_models[j]; - string assetName = NormalizeAssetName(secondModel.AssetName); - - if (RemoveModifier(firstAssetName) != RemoveModifier(assetName)) - { - continue; - } - - if (secondModel.AssetName.EndsWith("COL", StringComparison.InvariantCultureIgnoreCase)) - hasCol = true; - if (secondModel.AssetName.EndsWith("LOD1", StringComparison.InvariantCultureIgnoreCase)) - hasLod1 = true; - - if (hasCol && hasLod1) - break; - } - - if (!hasLod1) - { - bool lod1Exists = File.Exists(Path.Combine(contentDirectory, RemoveModifier(myModel.AssetName) + "_LOD1.fbx")); - if (lod1Exists) - { - notused.WriteLine("{0},LOD1", myModel.AssetName); - } - myModel.LoadData(); - missing.WriteLine("{0},{1},{2},LOD1", myModel.AssetName, myModel.GetTrianglesCount(), myModel.BoundingBox.Volume()); - myModel.UnloadData(); - } - if (!hasCol) - { - bool colExists = File.Exists(Path.Combine(contentDirectory, RemoveModifier(myModel.AssetName) + "_COL.fbx")); - if (colExists) - { - notused.WriteLine("{0},COL", myModel.AssetName); - } - myModel.LoadData(); - missing.WriteLine("{0},{1},{2},COL", myModel.AssetName, myModel.GetTrianglesCount(), myModel.BoundingBox.Volume()); - myModel.UnloadData(); - } - } - missing.Flush(); - missing.Close(); - notused.Flush(); - notused.Close(); - } - } - - private static string NormalizeAssetName(string assetName) - { - if (!assetName.EndsWith("LOD1", StringComparison.InvariantCultureIgnoreCase) && !assetName.EndsWith("COL", StringComparison.InvariantCultureIgnoreCase)) - { - if (!assetName.EndsWith("LOD0", StringComparison.InvariantCultureIgnoreCase)) - { - assetName = assetName + "_LOD0"; - } - } - return assetName; - } - - private static string RemoveModifier(string assetName) - { - return assetName.Replace("_LOD0", "").Replace("_LOD1", "").Replace("_COL", ""); - } - - - static void AddModel(MyModel model) - { - // If we already have an object in the array with this model id, then it means we are trying to load it twice (duplicity) - // The idea is: every model is instantiated only once, and is also only once in m_models. No duplicities. - MyCommonDebugUtils.AssertRelease(m_models[(int)model.ModelEnum] == null); - - m_models[(int)model.ModelEnum] = model; - m_modelsByAssertName.Add(model.AssetName, model); - } - - static void AddEntityModels(string assetName, MyModelsEnum lod0, MyModelsEnum? lod1, MyModelsEnum? collision, bool keepInMemory = false) - { - AddModel(new MyModel(assetName, MyMeshDrawTechnique.MESH, lod0, keepInMemory)); - - if (lod1.HasValue) - AddModel(new MyModel(assetName + "_LOD1", MyMeshDrawTechnique.MESH, lod1.Value, keepInMemory)); - if (collision.HasValue) - AddModel(new MyModel(assetName + "_COL", MyMeshDrawTechnique.MESH, collision.Value, keepInMemory)); - } - } -} +using System; +using MinerWarsMath.Graphics; +using MinerWars.CommonLIB.AppCode.Networking; +using MinerWars.CommonLIB.AppCode.Utils; +using SysUtils.Utils; + +using SysUtils; +using KeenSoftwareHouse.Library.Extensions; +using System.Collections.Generic; +using System.IO; +using MinerWars.AppCode.Game.Utils; +using MinerWars.CommonLIB.AppCode.Import; + +namespace MinerWars.AppCode.Game.Models +{ + public enum MyModelsEnum : int + { + MissileLauncher, + Autocannon_Barrel, + Autocannon_Base, + Liberator, + Enforcer, + Kammler, + Gettysburg, + Virginia, + Baer, + Hewer, + Razorclaw, + Greiser, + Tracer, + EAC02_Cockpit, + EAC02_Cockpit_glass, + EAC03_Cockpit, + EAC03_Cockpit_glass, + EAC04_Cockpit, + EAC04_Cockpit_glass, + EAC05_Cockpit, + EAC05_Cockpit_glass, + OmniCorp01_Cockpit, + OmniCorp01_Cockpit_glass, + OmniCorp03_Cockpit, + OmniCorp03_Cockpit_glass, + OmniCorp04_Cockpit, + OmniCorp04_Cockpit_glass, + OmniCorp_EAC01_Cockpit, + OmniCorp_EAC01_Cockpit_glass, + Cockpit_CN_03, + Cockpit_CN_03_glass, + Cockpit_SS_04, + Cockpit_SS_04_glass, + Cockpit_Razorclaw, + Cockpit_Razorclaw_glass, + //AnnaV, + Kai, + Kai_COL, + Kai_LOD1, + Missile, + ExplosionDebrisVoxel, + HarvestingTube, + Debris1, //Steel scrap + Debris2, //Cylindrical tripod + Debris3, //Wing scrap + Debris4, //steel gun scrap + Debris5, //ship wing ventilation scrap + Debris6, //wired parts + Debris7, //steel solid part + Debris8, //fat wires part + Debris9, //box cover + Debris10,//square steel plate + Debris11,//small tripod + Debris12,//exploded barrel + Debris13,//exploded tube + Debris14,//steel turbine or what + Debris15,//steel ribs + Debris16,//satelitte + Debris17,//chamfer cover box + Debris18,//Exploded pile + Debris19,//reflector or what + Debris20,//steel arm + Debris21,//old box + Debris22,//box with cables + Debris23,//lw debris + Debris24,//steel corner part + Debris25,//exploded dose + Debris26,//exploded tube + Debris27,//wired connected parts + Debris28,//rocket abandoned + Debris29,//circular tripod + Debris30,//christmas tree tripod + Debris31,//hook part + Debris32_pilot, + cistern, + pipe_bundle, + Standard_Container_1, + Standard_Container_2, + Standard_Container_3, + Standard_Container_4, + UtilityVehicle_1, + DebrisField, + HarvestingHead, + Drill_Base, + Drill_Gear1, + Drill_Gear2, + Drill_Gear3, + LaserDrill, + NuclearDrill, + NuclearDrillHead, + PressureDrill, + SawDrill, + ThermalDrill, + ThermalDrillHead, + MotherShipSaya, + MotherShipSaya_COL, + MotherShipSaya_LOD1, + + //Small ships + SmallShip_Doon, + SmallShip_Doon_LOD1, + SmallShip_Jacknife, + SmallShip_Jacknife_LOD1, + SmallShip_Hammer, + SmallShip_Hammer_LOD1, + SmallShip_ORG, + SmallShip_ORG_LOD1, + SmallShip_ORG_NoPaint, + SmallShip_ORG_NoPaint_LOD1, + SmallShip_YG_Closed, + SmallShip_YG_Closed_LOD1, + SmallShip_Hawk, + SmallShip_Hawk_LOD1, + SmallShip_Phoenix, + SmallShip_Phoenix_LOD1, + SmallShip_Leviathan, + SmallShip_Leviathan_LOD1, + SmallShip_Rockheater, + SmallShip_Rockheater_LOD1, + SmallShip_SteelHead, + SmallShip_SteelHead_LOD1, + SmallShip_Talon, + SmallShip_Talon_LOD1, + SmallShip_Stanislav, + SmallShip_Stanislav_LOD1, + Liberator_LOD1, + Enforcer_LOD1, + Kammler_LOD1, + Gettysburg_LOD1, + Virginia_LOD1, + Baer_LOD1, + Hewer_LOD1, + Razorclaw_LOD1, + Greiser_LOD1, + Tracer_LOD1, + + // Drones + DroneCN, + DroneSS, + DroneUS, + + // Largeship weapons + LargeShipMachineGunBarrel, + LargeShipMachineGunBase, + LargeShipMachineGunBase_COL, + LargeShipMissileLauncher9Barrel, + LargeShipMissileLauncher9Base, + LargeShipMissileLauncher9Base_COL, + LargeShipMissileLauncher4Barrel, + LargeShipMissileLauncher4Base, + LargeShipMissileLauncher4Base_COL, + LargeShipMissileLauncher6Barrel, + LargeShipMissileLauncher6Base, + LargeShipMissileLauncher6Base_COL, + LargeShipCiwsBarrel, + LargeShipCiwsBase, + LargeShipCiwsBase_COL, + LargeShipAutocannonBarrel, + LargeShipAutocannonBase, + LargeShipAutocannonBase_COL, + + StaticAsteroid10m_A_LOD0, + StaticAsteroid10m_A_LOD1, + StaticAsteroid10m_A_LOD2, + StaticAsteroid20m_A_LOD0, + StaticAsteroid20m_A_LOD1, + StaticAsteroid20m_A_LOD2, + StaticAsteroid30m_A_LOD0, + StaticAsteroid30m_A_LOD1, + StaticAsteroid30m_A_LOD2, + StaticAsteroid50m_A_LOD0, + StaticAsteroid50m_A_LOD1, + StaticAsteroid50m_A_LOD2, + StaticAsteroid100m_A_LOD0, + StaticAsteroid100m_A_LOD1, + StaticAsteroid100m_A_LOD2, + StaticAsteroid300m_A_LOD0, + StaticAsteroid300m_A_LOD1, + StaticAsteroid300m_A_LOD2, + StaticAsteroid500m_A_LOD0, + StaticAsteroid500m_A_LOD1, + StaticAsteroid500m_A_LOD2, + StaticAsteroid1000m_A_LOD0, + StaticAsteroid1000m_A_LOD1, + StaticAsteroid1000m_A_LOD2, + StaticAsteroid2000m_A_LOD0, + StaticAsteroid2000m_A_LOD1, + StaticAsteroid2000m_A_LOD2, + StaticAsteroid5000m_A_LOD0, + StaticAsteroid5000m_A_LOD1, + StaticAsteroid5000m_A_LOD2, + StaticAsteroid10000m_A_LOD0, + StaticAsteroid10000m_A_LOD1, + StaticAsteroid10000m_A_LOD2, + /* Removed + StaticAsteroid40000m_A_LOD0, + StaticAsteroid40000m_A_LOD1, + StaticAsteroid40000m_A_LOD2, + */ + StaticAsteroid10m_B_LOD0, + StaticAsteroid10m_B_LOD1, + StaticAsteroid10m_B_LOD2, + StaticAsteroid20m_B_LOD0, + StaticAsteroid20m_B_LOD1, + StaticAsteroid20m_B_LOD2, + StaticAsteroid30m_B_LOD0, + StaticAsteroid30m_B_LOD1, + StaticAsteroid30m_B_LOD2, + StaticAsteroid50m_B_LOD0, + StaticAsteroid50m_B_LOD1, + StaticAsteroid50m_B_LOD2, + StaticAsteroid100m_B_LOD0, + StaticAsteroid100m_B_LOD1, + StaticAsteroid100m_B_LOD2, + StaticAsteroid300m_B_LOD0, + StaticAsteroid300m_B_LOD1, + StaticAsteroid300m_B_LOD2, + StaticAsteroid500m_B_LOD0, + StaticAsteroid500m_B_LOD1, + StaticAsteroid500m_B_LOD2, + StaticAsteroid1000m_B_LOD0, + StaticAsteroid1000m_B_LOD1, + StaticAsteroid1000m_B_LOD2, + StaticAsteroid2000m_B_LOD0, + StaticAsteroid2000m_B_LOD1, + StaticAsteroid2000m_B_LOD2, + StaticAsteroid5000m_B_LOD0, + StaticAsteroid5000m_B_LOD1, + StaticAsteroid5000m_B_LOD2, + StaticAsteroid10000m_B_LOD0, + StaticAsteroid10000m_B_LOD1, + StaticAsteroid10000m_B_LOD2, + /* Removed + StaticAsteroid10m_C_LOD0, + StaticAsteroid10m_C_LOD1, + StaticAsteroid20m_C_LOD0, + StaticAsteroid20m_C_LOD1, + StaticAsteroid30m_C_LOD0, + StaticAsteroid30m_C_LOD1, + StaticAsteroid50m_C_LOD0, + StaticAsteroid50m_C_LOD1, + StaticAsteroid100m_C_LOD0, + StaticAsteroid100m_C_LOD1, + StaticAsteroid300m_C_LOD0, + StaticAsteroid300m_C_LOD1, + StaticAsteroid500m_C_LOD0, + StaticAsteroid500m_C_LOD1, + StaticAsteroid1000m_C_LOD0, + StaticAsteroid1000m_C_LOD1, + StaticAsteroid2000m_C_LOD0, + StaticAsteroid2000m_C_LOD1, + StaticAsteroid5000m_C_LOD0, + StaticAsteroid5000m_C_LOD1, + StaticAsteroid10000m_C_LOD0, + StaticAsteroid10000m_C_LOD1, + + StaticAsteroid10m_D_LOD0, + StaticAsteroid10m_D_LOD1, + StaticAsteroid20m_D_LOD0, + StaticAsteroid20m_D_LOD1, + StaticAsteroid30m_D_LOD0, + StaticAsteroid30m_D_LOD1, + StaticAsteroid50m_D_LOD0, + StaticAsteroid50m_D_LOD1, + StaticAsteroid100m_D_LOD0, + StaticAsteroid100m_D_LOD1, + StaticAsteroid300m_D_LOD0, + StaticAsteroid300m_D_LOD1, + StaticAsteroid500m_D_LOD0, + StaticAsteroid500m_D_LOD1, + StaticAsteroid1000m_D_LOD0, + StaticAsteroid1000m_D_LOD1, + StaticAsteroid2000m_D_LOD0, + StaticAsteroid2000m_D_LOD1, + StaticAsteroid5000m_D_LOD0, + StaticAsteroid5000m_D_LOD1, + StaticAsteroid10000m_D_LOD0, + StaticAsteroid10000m_D_LOD1, + + StaticAsteroid10m_E_LOD0, + StaticAsteroid10m_E_LOD1, + StaticAsteroid20m_E_LOD0, + StaticAsteroid20m_E_LOD1, + StaticAsteroid30m_E_LOD0, + StaticAsteroid30m_E_LOD1, + StaticAsteroid50m_E_LOD0, + StaticAsteroid50m_E_LOD1, + StaticAsteroid100m_E_LOD0, + StaticAsteroid100m_E_LOD1, + StaticAsteroid300m_E_LOD0, + StaticAsteroid300m_E_LOD1, + StaticAsteroid500m_E_LOD0, + StaticAsteroid500m_E_LOD1, + StaticAsteroid1000m_E_LOD0, + StaticAsteroid1000m_E_LOD1, + StaticAsteroid2000m_E_LOD0, + StaticAsteroid2000m_E_LOD1, + StaticAsteroid5000m_E_LOD0, + StaticAsteroid5000m_E_LOD1, + StaticAsteroid10000m_E_LOD0, + StaticAsteroid10000m_E_LOD1, + */ + UniversalLauncher, + MineBasic, + MineSmart, + FlashBomb, + IlluminatingShell, + DecoyFlare, + SphereExplosive, + SmokeBomb, + AsteroidKiller, + DirectionalExplosive, + TimeBomb, + RemoteBomb, + GravityBomb, + Hologram, + RemoteCamera, + Rifle, + Sniper, + MachineGun, + Shotgun, + MinerShip_Generic_CockpitInterior, + MinerShip_Generic_CockpitGlass, + Ardant, + Ardant_COL, + Ardant_LOD1, + //PREFAB MODULES + GizmoTranslation, + GizmoRotation, + p430_a01_passage_10m, + p430_a01_passage_10m_LOD1, + p430_a01_passage_10m_COL, + p430_a02_passage_40m, + p430_a02_passage_40m_LOD1, + p430_a02_passage_40m_COL, + p424_a01_pipe_base, + p424_a01_pipe_base_COL, + p423_a01_pipe_junction, + p422_a01_pipe_turn_90, + p421_a01_pipe_straight_80m, + p421_a02_pipe_straight_40m, + p421_a03_pipe_straight_10m, + p413_g01_junction_6axes, + p413_g01_junction_6axes_COL, + p414_g02_entrance_60m, + p414_g02_entrance_60m_LOD1, + p414_g02_entrance_60m_COL, + p410_g01_turn_90_right_0m, + p410_g01_turn_90_right_0m_LOD1, + p410_g01_turn_90_right_0m_COL, + p411_g01_straight_1, + p411_g02_straight_2, + p411_g03_straight_3, + p411_g04_straight_4, + //p414_f02_entrance_60m, + p412_f21_turn_s_up, + p412_f21_turn_s_up_COL, + p412_f22_turn_s_left, + p412_f22_turn_s_left_COL, + p412_f23_turn_s_right, + p412_f23_turn_s_right_COL, + p412_f24_turn_s_down, + p412_f24_turn_s_down_COL, + p412_f01_turn_90_up_230m, + p412_f02_turn_90_left_230m, + p412_f02_turn_90_left_230m_COL, + p412_f02_turn_90_left_230m_LOD1, + p412_f03_turn_90_right_230m, + p412_f03_turn_90_right_230m_LOD1, + p412_f03_turn_90_right_230m_COL, + p412_f04_turn_90_down_230m, + p412_f04_turn_90_down_230m_COL, + p411_f01_straight_1, + p411_f02_straight_2, + p411_f03_straight_3, + p414_e01_entrance_60m, + p414_e01_entrance_60m_LOD1, + p414_e01_entrance_60m_COL, + p411_e01_straight_1, + p411_e02_straight_2, + p411_e03_straight_3, + p411_e04_straight_4, + p411_e05_straight_5, + p411_e01_straight_1_COL, + p411_e02_straight_2_COL, + p411_e03_straight_3_COL, + p411_e04_straight_4_COL, + p411_e05_straight_5_COL, + p415_d01_doorcase, + p415_d01_doorcase_COL, + p415_d02_door1, + p415_d03_door2_a, + p415_d03_door2_a_COL, + p415_d03_door2_b, + p415_d03_door2_b_COL, + p413_d01_junction_t_horizontal, + p413_d03_junction_x_horizontal, + p413_d03_junction_x_horizontal_COL, + p414_d01_entrance_60m, + p414_d01_entrance_60m_COL, + p411_d01_straight_10m, + p411_d01_straight_10m_LOD1, + p411_d01_straight_10m_COL, + p411_d02_straight_40m_with_hole, + p411_d03_straight_60m, + p411_d04_straight_120m, + p411_d05_straight_180m, + p415_c01_doorcase, + p415_c02_door1_right, + p415_c02_door1_right_COL, + p415_c02_door1_left, + p415_c02_door1_left_COL, + p415_c03_door2_a_left, + p415_c03_door2_a_right, + p415_c03_door2_b_left, + p415_c03_door2_b_right, + p415_c02_door1, + p415_c03_door2_a, + p415_c03_door2_b, + p415_c04_door3, + p413_c01_junction_t_horizontal, + p413_c01_junction_t_horizontal_LOD1, + p413_c01_junction_x_horizontal, + p413_c01_junction_x_horizontal_COL, + p413_c01_junction_x_horizontal_LOD1, + p414_c01_entrance_60m, + p414_c01_entrance_60m_COL, + p411_c01_straight_10m, + p411_c01_straight_10m_COL, + p411_c02_straight_40m_with_hole, + p411_c02_straight_40m_with_hole_COL, + p411_c02_straight_40m_with_hole_LOD1, + p411_c03_straight_60m, + p411_c03_straight_60m_LOD1, + p411_c03_straight_60m_COL, + p411_c04_straight_120m, + p411_c04_straight_120m_LOD1, + p411_c04_straight_120m_COL, + p411_c05_straight_180m, + p415_b01_doorcase, + p415_b01_doorcase_LOD1, + p415_b01_doorcase_COL, + //p415_b02_door, + p413_b01_junction_t_horizontal, + p413_b01_junction_t_horizontal_LOD1, + p413_b01_junction_t_horizontal_COL, + p413_b02_junction_t_vertical, + p413_b02_junction_t_vertical_LOD1, + p413_b02_junction_t_vertical_COL, + p414_b02_entrance_60m, + p412_b21_turn_s_up, + p412_b21_turn_s_up_COL, + p412_b22_turn_s_left, + p412_b23_turn_s_right, + p412_b23_turn_s_right_COL, + p412_b24_turn_s_down, + p412_b11_turn_90_up_160m, + p412_b12_turn_90_left_160m, + p412_b13_turn_90_right_160m, + p412_b13_turn_90_right_160m_COL, + p412_b14_turn_90_down_160m, + p412_b14_turn_90_down_160m_COL, + p412_b01_turn_90_up_80m, + p412_b01_turn_90_up_80m_COL, + p412_b02_turn_90_left_80m, + p412_b02_turn_90_left_80m_COL, + p412_b03_turn_90_right_80m, + p412_b03_turn_90_right_80m_COL, + p412_b04_turn_90_down_80m, + p412_b04_turn_90_down_80m_COL, + p411_b01_straight_10m, + p411_b01_straight_10m_LOD1, + p411_b01_straight_10m_COL, + p411_b02_straight_30m_yellow, + p411_b02_straight_30m_yellow_LOD1, + p411_b02_straight_30m_yellow_COL, + p411_b03_straight_320m, + p411_b03_straight_320m_LOD1, + p411_b03_straight_320m_COL, + p411_b04_straight_80m_with_side_grates, + p411_b04_straight_80m_with_side_grates_LOD1, + p411_b04_straight_80m_with_side_grates_COL, + p411_b05_straight_80m_with_side_open, + p411_b05_straight_80m_with_side_open_LOD1, + p411_b05_straight_80m_with_side_open_COL, + p411_b06_straight_180m_concrete, + p411_b06_straight_180m_concrete_LOD1, + p411_b06_straight_180m_concrete_COL, + p411_b06_straight_200m, + p411_b06_straight_200m_LOD1, + p411_b06_straight_200m_COL, + p411_b07_straight_180m_blue, + p411_b07_straight_180m_blue_LOD1, + p411_b07_straight_180m_blue_COL, + p411_b09_straight_30m_gray, + p411_b09_straight_30m_gray_LOD1, + p411_b09_straight_30m_gray_COL, + p411_b11_straight_220m, + p411_b11_straight_220m_LOD1, + p411_b11_straight_220m_COL, + p411_b12_straight_160m_dark_metal, + p411_b12_straight_160m_dark_metal_LOD1, + p411_b12_straight_160m_dark_metal_COL, + p411_b13_straight_100m_tube_inside, + p411_b13_straight_100m_tube_inside_LOD1, + p411_b13_straight_100m_tube_inside_COL, + p415_a01_doorcase, + p415_a01_doorcase_LOD1, + p415_a01_doorcase_COL, + p415_a02_door, + p415_a02_door_left, + p415_a02_door_left_COL, + p415_a02_door_right, + p415_a02_door_right_COL, + p413_a01_junction_t_horizontal, + p413_a01_junction_t_horizontal_LOD1, + p413_a01_junction_t_horizontal_COL, + p413_a02_junction_t_vertical, + p413_a02_junction_t_vertical_LOD1, + p413_a02_junction_t_vertical_COL, + //p414_a01_entrance_30m, + p414_a02_entrance_60m, + p414_a02_entrance_60m_LOD1, + p414_a02_entrance_60m_COL, + p412_a21_turn_s_up, + p412_a21_turn_s_up_LOD1, + p412_a21_turn_s_up_COL, + p412_a22_turn_s_left, + p412_a22_turn_s_left_LOD1, + p412_a22_turn_s_left_COL, + p412_a23_turn_s_right, + p412_a23_turn_s_right_LOD1, + p412_a23_turn_s_right_COL, + p412_a24_turn_s_down, + p412_a24_turn_s_down_LOD1, + p412_a24_turn_s_down_COL, + p412_a11_turn_90_up_160m, + p412_a11_turn_90_up_160m_LOD1, + p412_a11_turn_90_up_160m_COL, + p412_a12_turn_90_left_160m, + p412_a12_turn_90_left_160m_LOD1, + p412_a12_turn_90_left_160m_COL, + p412_a13_turn_90_right_160m, + p412_a13_turn_90_right_160m_LOD1, + p412_a13_turn_90_right_160m_COL, + p412_a14_turn_90_down_160m, + p412_a14_turn_90_down_160m_LOD1, + p412_a14_turn_90_down_160m_COL, + p412_a01_turn_90_up_80m, + p412_a01_turn_90_up_80m_LOD1, + p412_a01_turn_90_up_80m_COL, + p412_a02_turn_90_left_80m, + p412_a02_turn_90_left_80m_LOD1, + p412_a02_turn_90_left_80m_COL, + p412_a03_turn_90_right_80m, + p412_a03_turn_90_right_80m_LOD1, + p412_a03_turn_90_right_80m_COL, + p412_a04_turn_90_down_80m, + p412_a04_turn_90_down_80m_LOD1, + p412_a04_turn_90_down_80m_COL, + p411_a01_straight_10m, + p411_a01_straight_10m_LOD1, + p411_a01_straight_10m_COL, + p411_a02_straight_60m_with_hole, + p411_a02_straight_60m_with_hole_LOD1, + p411_a02_straight_60m_with_hole_COL, + p411_a03_straight_120m, + p411_a03_straight_120m_LOD1, + p411_a03_straight_120m_COL, + p411_a04_straight_80m, + p411_a04_straight_80m_LOD1, + p411_a04_straight_80m_COL, + p411_a05_straight_80m_with_extension, + p411_a05_straight_80m_with_extension_LOD1, + p411_a05_straight_80m_with_extension_COL, + p382_e01_bridge5, + p382_e01_bridge5_LOD1, + p382_d01_bridge4, + p382_d01_bridge4_COL, + p382_c01_bridge3, + p382_c01_bridge3_COL, + p382_b01_bridge2, + p382_a01_bridge1, + p382_a01_bridge1_COL, + p382_a01_bridge1_LOD1, + p381_c01_building3, + p381_c01_building3_COL, + p381_b01_building2, + p381_b01_building2_COL, + p381_a01_building1, + p381_a01_building1_COL, + //p361_a01_small_hangar, + //p361_a01_small_hangar_COL, + p362_a01_short_distance_antenna, + p362_a01_short_distance_antenna_COL, + p361_a01_long_distance_antenna, + p361_a01_long_distance_antenna_COL, + p351_a01_weapon_mount, + p351_a01_weapon_mount_COL, + p345_a01_refinery, + p345_a01_refinery_COL, + p344_a01_container_arm_filled, + p344_a01_container_arm_filled_LOD1, + p344_a01_container_arm_filled_COL, + p344_a02_container_arm_empty, + p344_a02_container_arm_empty_COL, + p344_a02_container_arm_empty_LOD1, + p343_a01_ore_storage, + p343_a01_ore_storage_LOD1, + p343_a01_ore_storage_COL, + p342_a01_loading_bay, + p342_a01_loading_bay_LOD1, + p342_a01_loading_bay_COL, + p341_b01_open_dock_variation1, + p341_b01_open_dock_variation1_LOD1, + p341_b01_open_dock_variation1_COL, + p341_b02_open_dock_variation2, + p341_b02_open_dock_variation2_LOD1, + p341_b02_open_dock_variation2_COL, + p341_a01_open_dock_variation1, + p341_a01_open_dock_variation1_LOD1, + p341_a01_open_dock_variation1_COL, + p341_a01_open_dock_variation1_doorleft, + p341_a01_open_dock_variation1_doorright, + p341_a02_open_dock_variation2, + p341_a02_open_dock_variation2_LOD1, + p341_a02_open_dock_variation2_COL, + p333_a01_hydroponic_building, + p333_a01_hydroponic_building_COL, + p332_a01_oxygen_storage, + p332_a01_oxygen_storage_LOD1, + p332_a01_oxygen_storage_COL, + p331_a01_oxygen_generator, + p331_a01_oxygen_generator_COL, + p324b01_fuel_storage_b, + p324a01_fuel_storage_a, + p323a01_fuel_generator, + p323a01_fuel_generator_COL, + p322a01_battery, + p322a01_battery_COL, + p321c01_inertia_generator, + p321c01_inertia_generator_COL, + p321c01_inertia_generator_center, + p321c01_inertia_generator_center_COL, + p321c01_inertia_generator_center_LOD1, + p321c01_inertia_generator_LOD1, + p321b01_nuclear_reactor, + //p321a01_solar_panel, + //p321a01_solar_panel_LOD1, + //p321a01_solar_panel_COL, + p312a01_short_term_thruster_latitude, + p312a01_short_term_thruster_latitude_COL, + p312a02_short_term_thruster_lateral, + p312a02_short_term_thruster_lateral_COL, + p311a01_long_term_thruster, + p231a01_armor, + p231a02_armor, + p231a03_armor, + p231a04_armor, + p231a05_armor, + p231a06_armor, + p231a07_armor, + p231a08_armor, + p231a09_armor, + p231a10_armor, + p231a11_armor, + p231a12_armor, + p231a13_armor, + p231a14_armor, + p231a15_armor, + p231a16_armor, + p231a17_armor, + p231a18_armor, + + p221a01_chamber_v1, + p221a01_chamber_v1_LOD1, + p221a01_chamber_v1_COL, + + p221b01_chamber_v1, + p221b01_chamber_v1_LOD1, + + p221c01_chamber_v1, + p221c01_chamber_v1_LOD1, + p221c01_chamber_v1_COL, + + p221d01_chamber_v1, + p221d01_chamber_v1_LOD1, + p221d01_chamber_v1_COL, + + p221e01_chamber_v1, + p221e01_chamber_v1_LOD1, + p221e01_chamber_v1_COL, + + p221f01_chamber_v1, + p221f01_chamber_v1_LOD1, + p221f01_chamber_v1_COL, + + p221g01_chamber_v1, + p221g01_chamber_v1_LOD1, + p221g01_chamber_v1_COL, + + p221h01_chamber_v1, + p221h01_chamber_v1_LOD1, + p221h01_chamber_v1_COL, + + p221j01_chamber_v1, + p221j01_chamber_v1_LOD1, + p221j01_chamber_v1_COL, + + p221k01_chamber_v1, + p221k01_chamber_v1_LOD1, + + + + + p211h01_panel_535mx130m, + p211h01_panel_535mx130m_COL, + p211h01_panel_535mx130m_LOD1, + p211g01_panel_120mx60m, + p211g02_panel_60mx60m, + p211g03_panel_60mx30m, + p211g03_panel_60mx30m_LOD1, + p211g03_panel_60mx30m_COL, + //p211g03_panel_60mx30m_COL, + p211f01_panel_120mx60m, + p211f01_panel_120mx60m_LOD1, + p211f01_panel_120mx60m_COL, + p211f02_panel_60mx60m, + p211f02_panel_60mx60m_LOD1, + p211f02_panel_60mx60m_COL, + p211f03_panel_60mx30m, + p211f03_panel_60mx30m_COL, + p211e01_panel_120mx60m, + p211e01_panel_120mx60m_LOD1, + p211e01_panel_120mx60m_COL, + p211e02_panel_60mx60m, + p211e02_panel_60mx60m_LOD1, + p211e02_panel_60mx60m_COL, + p211e03_panel_60mx30m, + p211e03_panel_60mx30m_LOD1, + p211e03_panel_60mx30m_COL, + p211d01_panel_120mx60m, + p211d01_panel_120mx60m_LOD1, + p211d01_panel_120mx60m_COL, + p211d02_panel_60mx60m, + p211d03_panel_60mx30m, + p211d03_panel_60mx30m_LOD1, + p211d03_panel_60mx30m_COL, + p211c01_panel_120mx60m, + p211c02_panel_60mx60m, + p211c02_panel_60mx60m_COL, + p211c03_panel_60mx30m, + p211b01_panel_120mx60m, + p211b01_panel_120mx60m_COL, + p211b02_panel_60mx60m, + p211b02_panel_60mx60m_COL, + p211b03_panel_60mx30m, + p211b03_panel_60mx30m_COL, + p211a01_panel_120mx60m, + p211a01_panel_120mx60m_COL, + p211a02_panel_60mx60m, + p211a02_panel_60mx60m_COL, + p211a03_panel_60mx30m, + p211a03_panel_60mx30m_COL, + p142b01_cage_empty, + p142b02_cage_halfcut, + p142b03_cage_with_corners, + p142b03_cage_with_corners_LOD1, + p142b03_cage_with_corners_COL, + p142b11_cage_pillar, + p142b11_cage_pillar_COL, + p142b12_cage_edge, + p142a01_cage_empty, + p142a01_cage_empty_COL, + p142a02_cage_halfcut, + p142a02_cage_halfcut_COL, + p142a03_cage_with_corners, + p142a03_cage_with_corners_COL, + p142a11_cage_pillar, + p142a12_cage_edge, + p141b01_thick_frame_straight_10m, + p141b02_thick_frame_straight_60m, + p141b02_thick_frame_straight_60m_COL, + p141b11_thick_frame_edge, + p141b12_thick_frame_corner, + p141b31_thick_frame_joint, + p141b31_thick_frame_joint_COL, + p141a01_thick_frame_straight_10m, + p141a01_thick_frame_straight_10m_COL, + p141a02_thick_frame_straight_60m, + p141a02_thick_frame_straight_60m_COL, + p141a11_thick_frame_edge, + p141a11_thick_frame_edge_COL, + p141a12_thick_frame_corner, + p141a31_thick_frame_joint, + p141a31_thick_frame_joint_COL, + p130j01_j_straight_30m, + p130j01_j_straight_30m_COL, + p130j02_j_straight_10m, + p130j02_j_straight_10m_COL, + p130i01_i_straight_30m, + p130i02_i_straight_10m, + p130i02_i_straight_10m_COL, + p130h01_h_straight_30m, + p130h01_h_straight_30m_COL, + p130h02_h_straight_10m, + p130h02_h_straight_10m_COL, + //p130g01_g_straight_30m, + //p130g02_g_straight_10m, + //p130f01_f_straight_30m, + //p130f02_f_straight_10m, + //p130e01_e_straight_30m, + //p130e02_e_straight_10m, + //p130d01_d_straight_30m, + ////p130d02_d_straight_10m, + //p130c01_c_straight_30m, + //p130c02_c_straight_10m, + //p130b01_b_straight_30m, + //p130b02_b_straight_10m, + //p130a01_a_straight_30m, + //p130a02_a_straight_10m, + p120d01_d_straight_10m, + p120d01_d_straight_10m_COL, + p120d02_d_straight_40m, + p120d02_d_straight_40m_COL, + p120c01_c_straight_10m, + p120c01_c_straight_10m_COL, + p120c02_c_straight_40m, + p120c02_c_straight_40m_COL, + p120b01_b_straight_10m, + p120b01_b_straight_10m_COL, + p120b02_b_straight_40m, + p120b02_b_straight_40m_COL, + p120a01_strong_lattice_straight_10m, + p120a01_strong_lattice_straight_10m_COL, + p120a02_strong_lattice_straight_60m, + p120a03_strong_lattice_straight_120m, + p120a21_strong_lattice_junction_t_strong, + p120a21_strong_lattice_junction_t_strong_COL, + p120a22_strong_lattice_junction_t_weak, + p120a23_strong_lattice_junction_t_rotated, + p120a23_strong_lattice_junction_t_rotated_COL, + p120a51_strong_to_weak_lattice_2to1, + p120a51_strong_to_weak_lattice_2to1_COL, + p120a52_strong_to_weak_lattice_1to2, + p120a61_weak_lattice_junction_t_rotated, + p120a61_weak_lattice_junction_t_rotated_COL, + p110b01_lattice_beam_straight_10m, + p110b02_lattice_beam_straight_30m, + p110b02_lattice_beam_straight_30m_COL, + p110b03_lattice_beam_straight_60m, + p110b04_lattice_beam_straight_60m_with_panels, + p110b21_lattice_beam_junction_t_strong, + p110b22_lattice_beam_junction_t_weak, + p110b31_lattice_beam_joint_horizontal, + p110b31_lattice_beam_joint_horizontal_COL, + p110b32_lattice_beam_joint_vertical, + p110b32_lattice_beam_joint_vertical_COL, + p110a01_solid_beam_straight_10m, + p110a01_solid_beam_straight_10m_COL, + p110a02_solid_beam_straight_20m, + p110a02_solid_beam_straight_20m_COL, + p110a03_solid_beam_straight_40m_with_hole, + p110a03_solid_beam_straight_40m_with_hole_COL, + p110a04_solid_beam_straight_40m_lattice, + p110a04_solid_beam_straight_40m_lattice_LOD1, + p110a04_solid_beam_straight_40m_lattice_COL, + p110a05_solid_beam_straight_80m, + p110a11_solid_beam_junction_x_strong, + p110a11_solid_beam_junction_x_strong_LOD1, + p110a11_solid_beam_junction_x_strong_COL, + p110a12_solid_beam_junction_x_weak, + p110a13_solid_beam_junction_x_rotated, + p110a13_solid_beam_junction_x_rotated_LOD1, + p110a13_solid_beam_junction_x_rotated_COL, + p110a21_solid_beam_junction_t_strong, + p110a21_solid_beam_junction_t_strong_COL, + p110a22_solid_beam_junction_t_weak, + p110a23_solid_beam_junction_t_rotated, + p110a23_solid_beam_junction_t_rotated_COL, + p110a31_solid_beam_joint_horizontal, + p110a31_solid_beam_joint_horizontal_COL, + p110a32_solid_beam_joint_vertical, + p110a32_solid_beam_joint_vertical_COL, + p110a33_solid_beam_joint_longitudinal, + p110a33_solid_beam_joint_longitudinal_COL, + p110a41_solid_beam_superjoint, + p110a41_solid_beam_superjoint_COL, + + //Debug + plane_10_50, + plane_50_20, + plane_100_10, + plane_100_50, + plane_128_70, + plane_150_50, + plane_255_70, + plane_300_70, + plane_800_10, + plane_800_70, + sphere_smooth, + + //Simple object draw + BoxLowRes, + BoxHiRes, + Sphere, + Sphere_low, + Cone, + Hemisphere, + Hemisphere_low, + Capsule, + + //Lights + default_light_0, + default_light_0_COL, + p521_a01_light1, + p521_a01_light1_COL, + p521_a02_light2, + p521_a02_light2_COL, + p521_a03_light3, + p521_a03_light3_COL, + p521_a04_light4, + p521_a04_light4_COL, + + //particles prefab + default_particlesprefab_0, + p551_a01_particles, + p551_b01_particles, + p551_c01_particles, + p551_d01_particles, + + //sound prefab + default_soundprefab_0, + p561_a01_sound, + p561_b01_sound, + p561_c01_sound, + p561_d01_sound, + + // billboard prefab: + p511_a01_billboard, + p511_a01_billboard_COL, + p511_a01_billboard_LOD1, + p511_a02_billboard, + p511_a02_billboard_COL, + p511_a02_billboard_LOD1, + p511_a03_billboard, + p511_a03_billboard_COL, + p511_a03_billboard_LOD1, + p511_a04_billboard, + p511_a04_billboard_COL, + p511_a04_billboard_LOD1, + p511_a05_billboard, + p511_a05_billboard_COL, + p511_a05_billboard_LOD1, + p511_a06_billboard, + p511_a06_billboard_COL, + p511_a06_billboard_LOD1, + p511_a07_billboard, + p511_a07_billboard_COL, + p511_a07_billboard_LOD1, + p511_a08_billboard, + p511_a08_billboard_COL, + p511_a08_billboard_LOD1, + p511_a09_billboard, + p511_a09_billboard_COL, + p511_a09_billboard_LOD1, + p511_a10_billboard, + p511_a10_billboard_COL, + p511_a10_billboard_LOD1, + p511_a11_billboard, + p511_a11_billboard_COL, + p511_a11_billboard_LOD1, + p511_a12_billboard, + p511_a12_billboard_COL, + p511_a12_billboard_LOD1, + p511_a14_billboard, + //p511_a14_billboard_COL, + p511_a14_billboard_LOD1, + p511_a15_billboard, + p511_a15_billboard_COL, + p511_a15_billboard_LOD1, + p511_a16_billboard, + p511_a16_billboard_COL, + p511_a16_billboard_LOD1, + + // sign prefabs: + p531_a01_sign1, + p531_a02_sign2, + p531_a03_sign3, + p531_a04_sign4, + p531_a05_sign5, + p531_a06_sign6, + p531_a07_sign7, + p531_a08_sign8, + p531_a09_sign9, + p531_a10_sign10, + p531_a11_sign11, + p531_a12_sign12, + + p531_c_administrative_area, + p531_c_armory, + p531_c_arrow_L, + p531_c_arrow_R, + p531_c_arrow_str, + p531_c_cargo_bay, + p531_c_command_center, + p531_c_commercial_area, + p531_c_communications, + p531_c_defenses, + p531_c_docks, + p531_c_docks_COL, + p531_c_emergency_exit, + p531_c_engineering_area, + p531_c_engineering_area_COL, + p531_c_exit, + p531_c_experimental_labs, + p531_c_foundry, + p531_c_habitats, + p531_c_habitats_COL, + p531_c_hangars, + p531_c_hangars_COL, + p531_c_industrial_area, + p531_c_landing_bay, + p531_c_maintenance, + p531_c_maintenance_COL, + p531_c_military_area, + p531_c_mines, + p531_c_ore_processing, + p531_c_outer_area, + p531_c_prison, + p531_c_public_area, + p531_c_reactor, + p531_c_reactor_COL, + p531_c_research, + p531_c_restricted_area, + p531_c_security, + p531_c_sign, + p531_c_storage, + p531_c_storage_COL, + p531_c_technical_area, + p531_c_trade_port, + + p221a02_chamber_v2, + p221a02_chamber_v2_LOD1, + p221a02_chamber_v2_COL, + p221b02_chamber_v2, + p221c02_chamber_v2, + p221c02_chamber_v2_LOD1, + p221c02_chamber_v2_COL, + p221d02_chamber_v2, + p221d02_chamber_v2_LOD1, + p221d02_chamber_v2_COL, + p221e02_chamber_v2, + + p221b02_chamber_v2_LOD1, + p221e02_chamber_v2_LOD1, + + // Prefabs Beams small: + p130a01_a_straight_10m, + p130a01_a_straight_10m_COL, + p130a02_a_straight_30m, + p130a02_a_straight_30m_LOD1, + p130a02_a_straight_30m_COL, + p130b01_b_straight_10m, + p130b01_b_straight_10m_COL, + p130b02_b_straight_30m, + p130b02_b_straight_30m_LOD1, + p130b02_b_straight_30m_COL, + p130c01_c_straight_10m, + p130c01_c_straight_10m_COL, + p130c02_c_straight_30m, + p130c02_c_straight_30m_LOD1, + p130c02_c_straight_30m_COL, + p130d01_d_straight_10m, + p130d01_d_straight_10m_COL, + p130d02_d_straight_30m, + p130d02_d_straight_30m_LOD1, + p130d02_d_straight_30m_COL, + p130e01_e_straight_10m, + p130e01_e_straight_10m_COL, + p130e02_e_straight_30m, + p130e02_e_straight_30m_LOD1, + p130e02_e_straight_30m_COL, + + // Solar panels: + p321b01_solar_panel, + p321b01_solar_panel_LOD1, + p321b01_solar_panel_COL, + p321c01_solar_panel, + p321c01_solar_panel_COL, + p321c01_solar_panel_LOD1, + + p413_d02_junction_t_vertical, + p413_d02_junction_t_vertical_LOD1, + p413_d02_junction_t_vertical_COL, + p413_d04_junction_x_vertical, + p413_d04_junction_x_vertical_LOD1, + p413_d04_junction_x_vertical_COL, + + p412_f11_turn_90_up_230m, + p412_f11_turn_90_up_230m_COL, + p412_f11_turn_90_up_230m_LOD1, + p412_f12_turn_90_left_230m, + p412_f12_turn_90_left_230m_LOD1, + p412_f12_turn_90_left_230m_COL, + p412_f13_turn_90_right_230m, + p412_f13_turn_90_right_230m_LOD1, + p412_f13_turn_90_right_230m_COL, + p412_f14_turn_90_down_230m, + p412_f14_turn_90_down_230m_LOD1, + p412_f14_turn_90_down_230m_COL, + + p411_f04_straight_4, + p411_f05_straight_5, + p411_g05_straight_5, + p414_f01_entrance_60m, + p414_f01_entrance_60m_LOD1, + p414_f01_entrance_60m_COL, + p414_g01_entrance_60m, + p414_g01_entrance_60m_LOD1, + p414_g01_entrance_60m_COL, + + p571_a01_traffic_sign, + p571_a01_traffic_sign_COL, + p571_b01_traffic_sign, + p571_box01_traffic_sign, + p571_box01_traffic_sign_COL, + p571_box02_traffic_sign, + p571_c01_traffic_sign, + p571_c01_traffic_sign_COL, + p571_d01_traffic_sign, + p571_e01_traffic_sign, + p571_f01_traffic_sign, + p571_f01_traffic_sign_COL, + p571_g01_traffic_sign, + p571_h01_traffic_sign, + p571_i01_traffic_sign, + p571_i01_traffic_sign_COL, + p571_j01_traffic_sign, + p571_j01_traffic_sign_COL, + p571_k01_traffic_sign, + p571_k01_traffic_sign_COL, + p571_l01_traffic_sign, + p571_l01_traffic_sign_COL, + + //Simple object to be replace by custom import + SimpleObject, + //AsteroidPrefabTest, + FoundationFactory, + FoundationFactory_COL, + + // new prefabs + p385_a01_temple_900m, + p385_a01_temple_900m_COL, + p383_a01_church, + p383_a01_church_LOD1, + p383_a01_church_COL, + p334_a01_food_grow, + p334_a01_food_grow_COL, + p345_a01_bio_exp, + p345_a01_bio_mach_exp, + p345_a01_bio_mach_exp_COL, + p345_a01_recycle, + p345_a01_recycle_COL, + p345_a01_recycle_LOD1, + + p541_escape_pod, + p541_escape_pod_LOD1, + p541_escape_pod_COL, + p541_escape_pod_base, + p541_escape_pod_base_LOD1, + p541_escape_pod_base_COL, + p541_ventilator_body, + p541_ventilator_body_LOD1, + p541_ventilator_body_COL, + p541_ventilator_propeller, + p541_ventilator_propeller_COL, + + p349_a_tower, + p349_a_tower_LOD1, + p349_a_tower_COL, + p349_b_tower, + p349_b_tower_LOD1, + p349_b_tower_COL, + p349_c_tower, + p349_c_tower_LOD1, + p349_c_tower_COL, + + //p361_a02_hangar_panel, + + p531_b_faction, + p531_b_faction_COL, + p531_b_faction_holo, + p531_b_faction_holo_COL, + armor_hull, + armor_hull_LOD1, + armor_hull_COL, + + FourthReichMothership, + FourthReichMothership_B, + FourthReichMothership_B_COL, + FourthReichMothership_LOD1, + FourthReichMothership_B_LOD1, + RusMothership, + RusMothership_COL, + RusMothership_LOD1, + Russian_Mothership_Hummer, + Russian_Mothership_Hummer_LOD1, + Russian_Mothership_Hummer_COL, + + p231a01_armor_LOD01, + p231a02_armor_LOD01, + p231a03_armor_LOD01, + p231a04_armor_LOD01, + p231a05_armor_LOD01, + p231a06_armor_LOD01, + p231a07_armor_LOD01, + p231a08_armor_LOD01, + p231a09_armor_LOD01, + p231a10_armor_LOD01, + p231a11_armor_LOD01, + p231a12_armor_LOD01, + p231a13_armor_LOD01, + p231a14_armor_LOD01, + p231a15_armor_LOD01, + p231a16_armor_LOD01, + p231a17_armor_LOD01, + p231a18_armor_LOD01, + + p311a01_long_term_thruster_LOD1, + p312a01_short_term_thruster_latitude_LOD1, + p312a02_short_term_thruster_lateral_LOD1, + + p321d01_big_solar_panel, + p321d01_big_solar_panel_LOD1, + p321d01_big_solar_panel_COL, + + p321b01_nuclear_reactor_LOD1, + //p321c01_inertia_generator_LOD1, + p322a01_battery_LOD1, + p323a01_fuel_generator_LOD1, + p324a01_fuel_storage_a_LOD1, + p324a01_fuel_storage_a_COL, + //p324b01_fuel_storage_b_LOD01, + + p331_a01_oxygen_generator_LOD1, + p333_a01_hydroponic_building_LOD1, + p334_a01_food_grow_LOD01, + + //p342_a01_loading_bay_LOD1, + p345_a01_refinery_LOD1, + p345_a01_bio_exp_LOD1, + p345_a01_bio_exp_COL, + p345_a01_bio_mach_exp_LOD1, + //p349_a_tower_LOD01, + //p349_b_tower_LOD01, + //p349_c_tower_LOD01, + + p381_a01_building1_LOD1, + p381_b01_building2_LOD1, + + p385_a01_temple_900m_LOD1, + + p212a01_panel_large, + p212a01_panel_large_LOD1, + p212a01_panel_large_COL, + p212a01_panel_medium, + p212a01_panel_medium_COL, + p212a01_panel_medium_LOD1, + p212a01_panel_small, + p212a01_panel_small_COL, + p212b02_panel_medium, + p212b02_panel_medium_COL, + p212b02_panel_medium_LOD1, + p212b02_panel_small, + p212b02_panel_small_COL, + p212c03_panel_medium, + p212c03_panel_medium_LOD1, + p212c03_panel_medium_COL, + p212c03_panel_small, + p212c03_panel_small_COL, + p212d04_panel_medium, + p212d04_panel_medium_COL, + p212d04_panel_small, + p212d04_panel_small_COL, + p212e05_panel_medium, + p212e05_panel_medium_COL, + p212e05_panel_small, + p212e05_panel_small_COL, + + p341_c01_closed_dock_v1, + p341_c01_closed_dock_v1_COL, + p341_c01_closed_dock_v1_LOD1, + + MysteriousBox_matt_5m, + MysteriousBox_spec_5m, + MysteriousBox_mid_5m, + + p212b02_panel_large, + p212b02_panel_large_COL, + p212b02_panel_large_LOD1, + p212c03_panel_large, + p212c03_panel_large_LOD1, + p212c03_panel_large_COL, + p212d04_panel_large, + p212d04_panel_large_LOD1, + p212d04_panel_large_COL, + p212e05_panel_large, + p212e05_panel_large_LOD1, + p212e05_panel_large_COL, + p212f01_panel_large, + p212f01_panel_large_COL, + + Alien_gate, + Alien_gate_LOD1, + + mship_body, + mship_body_LOD1, + mship_engine, + mship_engine_LOD1, + mship_shield_back_large_left, + mship_shield_back_large_left_LOD1, + mship_shield_back_large_right, + mship_shield_back_large_right_LOD1, + mship_shield_back_small_left, + mship_shield_back_small_left_LOD1, + mship_shield_back_small_right, + mship_shield_back_small_right_LOD1, + mship_shield_front_large_left, + mship_shield_front_large_left_LOD1, + mship_shield_front_large_right, + mship_shield_front_large_right_LOD1, + mship_shield_front_small_left, + mship_shield_front_small_left_LOD1, + mship_shield_front_small_right, + mship_shield_front_small_right_LOD1, + mship_shield_front_small02_left, + mship_shield_front_small02_left_LOD1, + mship_shield_front_small02_right, + mship_shield_front_small02_right_LOD1, + + p411_d02_straight_40m_with_hole_COL, + p411_d03_straight_60m_COL, + p411_d04_straight_120m_COL, + p411_d05_straight_180m_COL, + p411_d02_straight_40m_with_hole_LOD1, + p411_d03_straight_60m_LOD1, + p411_d04_straight_120m_LOD1, + p411_d05_straight_180m_LOD1, + + p381_d03_hospital, + p381_d03_hospital_LOD1, + p381_d03_hospital_COL, + p381_d05_food_grow, + p381_d05_food_grow_LOD1, + p381_c01_building3_LOD1, + p381_c01_building4, + p381_c01_building4_COL, + p381_c01_building4_LOD1, + + Cable_corner_25m, + Cable_corner_25m_COL, + Cable_S_45m, + Cable_S_45m_COL, + Cable_straight_180, + Cable_straight_180_COL, + Cable_straight_45, + Cable_straight_45_COL, + Cable_straight_90, + Cable_straight_90_COL, + Connection_box, + Connection_box_COL, + + //p411_d02_straight_40m_with_hole_COL, + //p411_d02_straight_40m_with_hole_LOD1, + //p411_d03_straight_60m_COL, + //p411_d03_straight_60m_LOD1, + //p411_d04_straight_120m_COL, + //p411_d04_straight_120m_LOD1, + //p411_d05_straight_180m_COL, + //p411_d05_straight_180m_LOD1, + + p411_f01_straight_1_COL, + p411_f02_straight_2_COL, + p411_f03_straight_3_COL, + p411_f04_straight_4_COL, + p411_f05_straight_5_COL, + + p411_g02_straight_2_COL, + p411_g03_straight_3_COL, + p411_g04_straight_4_COL, + p411_g05_straight_5_COL, + + cargo_box_1, + cargo_box_2, + cargo_box_3, + cargo_box_4, + cargo_box_5, + cargo_box_6, + cargo_box_7, + cargo_box_8, + cargo_box_9, + cargo_box_10, + cargo_box_small, + p541_security_hub, + p541_security_hub_LOD1, + p541_security_hub_COL, + Alarm, + Bank_node, + Bank_node_COL, + Cam, + Alarm_off, + + p361_b01_long_distance_antenna_big, + p361_b01_long_distance_antenna_big_LOD1, + p361_b01_long_distance_antenna_big_COL, + p361_b01_long_distance_antenna_dish, + p361_b01_long_distance_antenna_dish_COL, + p361_b01_long_distance_antenna_dish_LOD1, + fourth_reich_wreck, + fourth_reich_wreck_LOD1, + fourth_reich_wreck_COL, + p344_a03_container, + p231b01_armor, + p231b01_armor_LOD1, + p231b01_armor_COL, + p231b01_armor_corner, + p231b01_armor_corner_LOD1, + p231b01_armor_corner_COL, + p231b01_armor_edge, + p231b01_armor_edge_COL, + p231b01_armor_edge_LOD1, + p231b01_armor_hole, + p231b01_armor_hole_LOD1, + p231b01_armor_hole_COL, + + p150a03_shelf_1, + p150a03_shelf_1_LOD1, + p150a03_shelf_1_COL, + p150a02_shelf_1X2, + p150a02_shelf_1X2_LOD1, + p150a02_shelf_1X2_COL, + p150a01_shelf_1X3, + p150a01_shelf_1X3_LOD1, + p150a01_shelf_1X3_COL, + //LargeShipMachineGunBarrel_LOD1, + //LargeShipMachineGunBase_LOD1, + p221b01_chamber_v1_COL, + p221b02_chamber_v2_COL, + p221e02_chamber_v2_COL, + p382_d01_bridge4_LOD1, + p382_c01_bridge3_LOD1, + p382_b01_bridge2_LOD1, + p362_a01_short_distance_antenna_LOD1, + p361_a01_long_distance_antenna_LOD1, + p351_a01_weapon_mount_LOD1, + p411_e01_straight_1_LOD1, + p411_e02_straight_2_LOD1, + p411_e03_straight_3_LOD1, + p411_e04_straight_4_LOD1, + p411_e05_straight_5_LOD1, + p413_d01_junction_t_horizontal_LOD1, + p413_d03_junction_x_horizontal_LOD1, + p412_b21_turn_s_up_LOD1, + p412_b22_turn_s_left_LOD1, + p412_b23_turn_s_right_LOD1, + p412_b24_turn_s_down_LOD1, + p412_b11_turn_90_up_160m_LOD1, + p412_b12_turn_90_left_160m_LOD1, + p412_b13_turn_90_right_160m_LOD1, + p412_b14_turn_90_down_160m_LOD1, + p412_b01_turn_90_up_80m_LOD1, + p412_b02_turn_90_left_80m_LOD1, + p412_b03_turn_90_right_80m_LOD1, + p412_b04_turn_90_down_80m_LOD1, + p413_c01_junction_t_horizontal_COL, + p411_c05_straight_180m_COL, + p411_c05_straight_180m_LOD1, + p414_b02_entrance_60m_LOD1, + + p611_asteroid_part_A, + p611_asteroid_part_A_LOD1, + p611_asteroid_part_B, + p611_asteroid_part_B_LOD1, + p363_a01_big_antenna_300m, + p363_a01_big_antenna_300m_LOD1, + p363_a01_big_antenna_300m_COL, + p130d02_d_straight_300m, + p130d02_d_straight_300m_COL, + p130d02_d_straight_300m_LOD1, + p130j01_j_straight_300m, + p130j01_j_straight_300m_LOD1, + p130j01_j_straight_300m_COL, + p120c02_c_straight_400m, + p120c02_c_straight_400m_LOD1, + p120c02_c_straight_400m_COL, + p110b03_lattice_beam_straight_420m, + p110b03_lattice_beam_straight_420m_COL, + p110b03_lattice_beam_straight_420m_LOD1, + p110b04_lattice_beam_straight_420m_with_panels, + p110b04_lattice_beam_straight_420m_with_panels_LOD1, + p110b04_lattice_beam_straight_420m_with_panels_COL, + p345_a01_bio_exp_center, + p345_a01_bio_exp_center_LOD1, + p345_a01_bio_exp_center_COL, + p345_a01_bio_exp_tanks, + p345_a01_bio_exp_tanks_LOD1, + p345_a01_bio_exp_tanks_COL, + p541_ventilator_body_standalone, + p541_ventilator_body_standalone_LOD1, + p541_ventilator_body_standalone_COL, + p541_ventilator_propeller_standalone, + p541_ventilator_propeller_standalone_COL, + p541_ventilator_propeller_standalone_LOD1, + + p321c03_centrifuge, + p321c03_centrifuge_centre, + p321c03_centrifuge_centre_LOD1, + p321c03_centrifuge_centre_COL, + p321c03_centrifuge_COL, + p321c03_centrifuge_LOD1, + p321c04_box_generator, + p321c04_box_generator_COL, + p321c04_box_generator_LOD1, + p321c04_two_big_inertia, + p321c04_two_big_inertia_LOD1, + p321c05_centrifuge_big, + p321c05_centrifuge_big_COL, + p321c05_centrifuge_big_LOD1, + p321c05_centrifuge_centre_big, + p321c05_centrifuge_centre_big_LOD1, + p363_a01_big_antenna_1500m, + p363_a01_big_antenna_1500m_COL, + p363_a01_big_antenna_1500m_LOD1, + p541_ventilator_propeller_big, + p541_ventilator_propeller_big_COL, + p541_ventilator_propeller_big_LOD1, + p321c02_generator_wall_big, + p321c02_generator_wall_big_COL, + p321c02_generator_wall_big_LOD1, + p321c02_inertia_generator_center_big, + p321c02_inertia_generator_center_big_LOD1, + p321c02_inertia_generator_center_big_COL, + p321c02_inertia_generator_center_vert, + p321c02_inertia_generator_center_vert_LOD1, + + p321c06_inertia_B_centre, + p321c06_inertia_B_centre_LOD1, + p321c06_inertia_B_centre_COL, + p321c06_inertia_generator_B, + p321c06_inertia_generator_B_COL, + p321c06_inertia_generator_B_LOD1, + p4221_a01_cooling_device_ventilator_1, + p4221_a01_cooling_device_ventilator_2, + p4221_a01_cooling_device_wall_340x400, + p4221_a01_cooling_device_wall_340x400_COL, + p4221_a01_cooling_device_wall_340x400_LOD1, + p4222_a01_pipes_connector, + p4222_a01_pipes_connector_center, + p4222_a01_pipes_connector_center_LOD1, + p4222_a01_pipes_connector_COL, + p4222_a01_pipes_connector_LOD1, + p4223_a01_open_pipe, + p4223_a01_open_pipe_COL, + p4223_a01_open_pipe_LOD1, + p311b01_long_term_thruster, + p311b01_long_term_thruster_LOD1, + p321c07_generator, + p321c07_generator_center, + p321c07_generator_center_LOD1, + p321c07_generator_COL, + p321c07_generator_LOD1, + p321c07_generator_propeller_1, + p321c07_generator_propeller_1_COL, + p321c07_generator_propeller_2, + p321c07_generator_propeller_2_COL, + p221k01_chamber_v2, + p221k01_chamber_v2_LOD1, + + p581_a01_barrel_biohazard, + p581_a01_barrel_biohazard_2, + p581_a01_nuke_barrel, + p581_a01_red_barrel, + p581_a01_simple_barrel, + p581_a01_simple_barrel_2, + cargo_box_11, + cargo_box_12, + Barrel_prop_A, + Barrel_prop_B, + Barrel_prop_C, + //Barrel_prop_D, + //Barrel_prop_E, + CargoBox_prop_A, + CargoBox_prop_B, + CargoBox_prop_C, + CannonBall_Capsule_1, + CannonBall_Capsule_1_COL, + Missile_pack01, + Missile_pack01_COL, + Missile_pack02, + Missile_pack02_COL, + Missile_plazma01, + Missile_plazma01_COL, + Missile_stack_biochem01, + Missile_stack_biochem01_COL, + + p231a01_armor_COL, + p231a02_armor_COL, + p231a03_armor_COL, + p231a04_armor_COL, + p231a05_armor_COL, + p231a06_armor_COL, + p231a07_armor_COL, + p231a08_armor_COL, + p231a09_armor_COL, + p231a10_armor_COL, + p231a11_armor_COL, + p231a12_armor_COL, + p231a13_armor_COL, + p231a14_armor_COL, + p231a15_armor_COL, + p231a16_armor_COL, + p231a17_armor_COL, + p231a18_armor_COL, + p110a12_solid_beam_junction_x_weak_COL, + p110a12_solid_beam_junction_x_weak_LOD1, + p110a22_solid_beam_junction_t_weak_COL, + p110a22_solid_beam_junction_t_weak_LOD1, + p110a05_solid_beam_straight_80m_COL, + p110a05_solid_beam_straight_80m_LOD1, + p110b01_lattice_beam_straight_10m_COL, + p110b01_lattice_beam_straight_10m_LOD1, + p110b04_lattice_beam_straight_60m_with_panels_COL, + p110b04_lattice_beam_straight_60m_with_panels_LOD1, + p110b21_lattice_beam_junction_t_strong_COL, + p110b21_lattice_beam_junction_t_strong_LOD1, + p110b03_lattice_beam_straight_60m_COL, + p110b03_lattice_beam_straight_60m_LOD1, + p110b22_lattice_beam_junction_t_weak_COL, + p110b22_lattice_beam_junction_t_weak_LOD1, + p142a11_cage_pillar_COL, + p142a11_cage_pillar_LOD1, + p211d02_panel_60mx60m_COL, + p211d02_panel_60mx60m_LOD1, + p211g01_panel_120mx60m_COL, + p211g01_panel_120mx60m_LOD1, + p211g02_panel_60mx60m_COL, + p211g02_panel_60mx60m_LOD1, + p344_a03_container_COL, + p344_a03_container_LOD1, + p415_c03_door2_a_left_COL, + p415_c03_door2_a_left_LOD1, + p415_c03_door2_a_right_COL, + p415_c03_door2_a_right_LOD1, + p415_c03_door2_b_right_COL, + p415_c03_door2_b_right_LOD1, + p415_c03_door2_b_left_COL, + p415_c03_door2_b_left_LOD1, + p415_c01_doorcase_COL, + p415_c01_doorcase_LOD1, + p421_a02_pipe_straight_40m_COL, + p421_a02_pipe_straight_40m_LOD1, + p421_a03_pipe_straight_10m_COL, + p421_a03_pipe_straight_10m_LOD1, + p421_a01_pipe_straight_80m_COL, + p421_a01_pipe_straight_80m_LOD1, + p423_a01_pipe_junction_COL, + p423_a01_pipe_junction_LOD1, + p422_a01_pipe_turn_90_COL, + p422_a01_pipe_turn_90_LOD1, + p120a22_strong_lattice_junction_t_weak_COL, + p120a22_strong_lattice_junction_t_weak_LOD1, + p120a02_strong_lattice_straight_60m_COL, + p120a02_strong_lattice_straight_60m_LOD1, + p120a03_strong_lattice_straight_120m_COL, + p120a03_strong_lattice_straight_120m_LOD1, + p411_g01_straight_1_COL, + p411_g01_straight_1_LOD1, + p324b01_fuel_storage_b_COL, + p324b01_fuel_storage_b_LOD1, + p581_a01_o2_barrel, + p581_a01_o2_barrel_COL, + + p211a01_panel_120mx60m_LOD1, + p211a02_panel_60mx60m_LOD1, + p211a03_panel_60mx30m_LOD1, + p211c01_panel_120mx60m_LOD1, + p211c02_panel_60mx60m_LOD1, + p211c03_panel_60mx30m_LOD1, + p211b01_panel_120mx60m_LOD1, + p211b02_panel_60mx60m_LOD1, + p211b03_panel_60mx30m_LOD1, + + Nuclear_Warhead_closed, + Nuclear_Warhead_closed_COL, + Nuclear_Warhead_open, + Nuclear_Warhead_open_COL, + CargoBox_prop_D, + p581_a01_nuke_barrel_1, + p581_a01_simple_barrel_3, + p221L01_chamber_v1, + p221L01_chamber_v1_LOD1, + p221L01_chamber_v1_COL, + + + p221m01_chamber_bottom_v1, + p221m01_chamber_bottom_v1_LOD1, + p221m01_chamber_bottom_v1_COL, + p221m01_chamber_center_v1, + p221m01_chamber_center_v1_LOD1, + p221m01_chamber_center_v1_COL, + p221m01_chamber_top_v1, + p221m01_chamber_top_v1_LOD1, + p221m01_chamber_top_v1_COL, + p321e01_solar_panel, + p321e01_solar_panel_LOD1, + p321e01_solar_panel_COL, + p110a06_solid_beam_straight_420m, + + gattling_ammo_belt, + gattling_ammo_belt_COL, + + p311b01_cut_thruster, + p311b01_cut_thruster_LOD1, + p311b01_cut_thruster_COL, + p312b01_cut_thruster_lateral, + p312b01_cut_thruster_lateral_LOD1, + p312b01_cut_thruster_lateral_COL, + p312b02_cut_thruster_latitude, + p312b02_cut_thruster_latitude_LOD1, + p312b02_cut_thruster_latitude_COL, + alien_detector_unit, + alien_detector_unit_COL, + p381_c01_building5, + p381_c01_building5_LOD1, + p381_c01_building5_COL, + p381_c01_building6, + p381_c01_building6_LOD1, + p381_c01_building6_COL, + p381_c01_building7, + p381_c01_building7_LOD1, + p381_c01_building7_COL, + p221n01_chamber_v1, + p221n01_chamber_v1_LOD1, + p221n01_chamber_v1_COL, + p531_d_medic_cross, + p531_d_medic_cross_COL, + + p541_screen_A, + p541_screen_A_LOD1, + p541_screen_A_COL, + p541_screen_B, + p541_screen_B_COL, + p541_screen_B_LOD1, + p541_terminal_A, + p541_terminal_A_COL, + p541_terminal_A_LOD1, + + alien_artefact, + alien_artefact_COL, + + bomb, + bomb_COL, + + p581_a01_universal_barrel_COL, + rail_gun, + rail_gun_COL, + rail_gun_LOD1, + p345_a01_recycle_sphere, + p345_a01_recycle_sphere_LOD1, + p345_a01_recycle_sphere_COL, + prison, + prison_COL, + vendor, + vendor_COL, + hangar_screen, + hangar_screen_COL, + + ScannerPlane, + ScannerRays, + Nuclear_Warhead_open_LOD1, + Nuclear_Warhead_closed_LOD1, + + p511_a17_billboard_portrait_1, + p511_a17_billboard_portrait_1_COL, + p412_b24_turn_s_down_COL, + p414_b02_entrance_60m_COL, + p415_d01_doorcase_LOD1, + p411_g02_straight_2_LOD1, + p411_g03_straight_3_LOD1, + p411_g04_straight_4_LOD1, + p411_g05_straight_5_LOD1, + p511_a14_billboard_COL, + p413_g01_junction_6axes_LOD1, + + p511_a18_billboard, + p511_a18_billboard_COL, + p511_a18_billboard_LOD1, + + p511_a19_billboard, + p511_a19_billboard_COL, + p511_a19_billboard_LOD1, + + p511_a17_billboard_portrait_2, + } + + public enum MyModelTexturesEnum + { + }; + + static partial class MyModels + { + static void InitModels() + { + MyMwcLog.WriteLine("MyModels.InitModels - START"); + MyMwcLog.IncreaseIndent(); + + if (m_models != null) + return; //models already inited + + m_models = new MyModel[Enum.GetValues(typeof(MyModelsEnum)).Length]; + m_modelsByAssertName = new Dictionary(); + + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Static asteroids + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Indestructible_01: 10-20m + // Indestructible_02: 30-100m + // Indestructible_03: 300-5000m + // Indestructible_04: 10000m + + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10m\\StaticAsteroid10m_A_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid10m_A_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10m\\StaticAsteroid10m_A_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid10m_A_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10m\\StaticAsteroid10m_A_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid10m_A_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\20m\\StaticAsteroid20m_A_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid20m_A_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\20m\\StaticAsteroid20m_A_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid20m_A_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\20m\\StaticAsteroid20m_A_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid20m_A_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\30m\\StaticAsteroid30m_A_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid30m_A_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\30m\\StaticAsteroid30m_A_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid30m_A_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\30m\\StaticAsteroid30m_A_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid30m_A_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\50m\\StaticAsteroid50m_A_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid50m_A_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\50m\\StaticAsteroid50m_A_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid50m_A_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\50m\\StaticAsteroid50m_A_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid50m_A_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\100m\\StaticAsteroid100m_A_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid100m_A_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\100m\\StaticAsteroid100m_A_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid100m_A_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\100m\\StaticAsteroid100m_A_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid100m_A_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\300m\\StaticAsteroid300m_A_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid300m_A_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\300m\\StaticAsteroid300m_A_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid300m_A_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\300m\\StaticAsteroid300m_A_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid300m_A_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\500m\\StaticAsteroid500m_A_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid500m_A_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\500m\\StaticAsteroid500m_A_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid500m_A_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\500m\\StaticAsteroid500m_A_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid500m_A_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\1000m\\StaticAsteroid1000m_A_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid1000m_A_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\1000m\\StaticAsteroid1000m_A_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid1000m_A_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\1000m\\StaticAsteroid1000m_A_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid1000m_A_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\2000m\\StaticAsteroid2000m_A_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid2000m_A_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\2000m\\StaticAsteroid2000m_A_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid2000m_A_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\2000m\\StaticAsteroid2000m_A_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid2000m_A_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\5000m\\StaticAsteroid5000m_A_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid5000m_A_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\5000m\\StaticAsteroid5000m_A_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid5000m_A_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\5000m\\StaticAsteroid5000m_A_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid5000m_A_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10000m\\StaticAsteroid10000m_A_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid10000m_A_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10000m\\StaticAsteroid10000m_A_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid10000m_A_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10000m\\StaticAsteroid10000m_A_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid10000m_A_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + //AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\40000m\\StaticAsteroid40000m_A_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid40000m_A_LOD0, MyFakes.UNLOAD_OPTIMIZATION_STATIC_ASTEROIDS)); + //AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\40000m\\StaticAsteroid40000m_A_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid40000m_A_LOD1, MyFakes.UNLOAD_OPTIMIZATION_STATIC_ASTEROIDS)); + //AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\40000m\\StaticAsteroid40000m_A_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid40000m_A_LOD2, MyFakes.UNLOAD_OPTIMIZATION_STATIC_ASTEROIDS)); + + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10m\\StaticAsteroid10m_B_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid10m_B_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10m\\StaticAsteroid10m_B_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid10m_B_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10m\\StaticAsteroid10m_B_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid10m_B_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\20m\\StaticAsteroid20m_B_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid20m_B_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\20m\\StaticAsteroid20m_B_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid20m_B_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\20m\\StaticAsteroid20m_B_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid20m_B_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\30m\\StaticAsteroid30m_B_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid30m_B_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\30m\\StaticAsteroid30m_B_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid30m_B_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\30m\\StaticAsteroid30m_B_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid30m_B_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\50m\\StaticAsteroid50m_B_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid50m_B_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\50m\\StaticAsteroid50m_B_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid50m_B_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\50m\\StaticAsteroid50m_B_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid50m_B_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\100m\\StaticAsteroid100m_B_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid100m_B_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\100m\\StaticAsteroid100m_B_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid100m_B_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\100m\\StaticAsteroid100m_B_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid100m_B_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\300m\\StaticAsteroid300m_B_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid300m_B_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\300m\\StaticAsteroid300m_B_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid300m_B_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\300m\\StaticAsteroid300m_B_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid300m_B_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\500m\\StaticAsteroid500m_B_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid500m_B_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\500m\\StaticAsteroid500m_B_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid500m_B_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\500m\\StaticAsteroid500m_B_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid500m_B_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\1000m\\StaticAsteroid1000m_B_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid1000m_B_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\1000m\\StaticAsteroid1000m_B_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid1000m_B_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\1000m\\StaticAsteroid1000m_B_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid1000m_B_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\2000m\\StaticAsteroid2000m_B_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid2000m_B_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\2000m\\StaticAsteroid2000m_B_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid2000m_B_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\2000m\\StaticAsteroid2000m_B_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid2000m_B_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\5000m\\StaticAsteroid5000m_B_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid5000m_B_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\5000m\\StaticAsteroid5000m_B_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid5000m_B_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\5000m\\StaticAsteroid5000m_B_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid5000m_B_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10000m\\StaticAsteroid10000m_B_LOD0", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid10000m_B_LOD0, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10000m\\StaticAsteroid10000m_B_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid10000m_B_LOD1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10000m\\StaticAsteroid10000m_B_LOD2", MyMeshDrawTechnique.MESH, MyModelsEnum.StaticAsteroid10000m_B_LOD2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_STATIC_ASTEROIDS)); + /* Removed + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10m\\StaticAsteroid10m_C_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid10m_C_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10m\\StaticAsteroid10m_C_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid10m_C_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\20m\\StaticAsteroid20m_C_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid20m_C_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\20m\\StaticAsteroid20m_C_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid20m_C_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\30m\\StaticAsteroid30m_C_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid30m_C_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\30m\\StaticAsteroid30m_C_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid30m_C_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\50m\\StaticAsteroid50m_C_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid50m_C_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\50m\\StaticAsteroid50m_C_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid50m_C_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\100m\\StaticAsteroid100m_C_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid100m_C_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\100m\\StaticAsteroid100m_C_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid100m_C_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\300m\\StaticAsteroid300m_C_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid300m_C_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\300m\\StaticAsteroid300m_C_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid300m_C_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\500m\\StaticAsteroid500m_C_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid500m_C_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\500m\\StaticAsteroid500m_C_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid500m_C_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\1000m\\StaticAsteroid1000m_C_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid1000m_C_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\1000m\\StaticAsteroid1000m_C_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid1000m_C_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\2000m\\StaticAsteroid2000m_C_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid2000m_C_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\2000m\\StaticAsteroid2000m_C_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid2000m_C_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\5000m\\StaticAsteroid5000m_C_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid5000m_C_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\5000m\\StaticAsteroid5000m_C_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid5000m_C_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10000m\\StaticAsteroid10000m_C_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid10000m_C_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10000m\\StaticAsteroid10000m_C_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid10000m_C_LOD1)); + + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10m\\StaticAsteroid10m_D_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid10m_D_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10m\\StaticAsteroid10m_D_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid10m_D_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\20m\\StaticAsteroid20m_D_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid20m_D_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\20m\\StaticAsteroid20m_D_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid20m_D_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\30m\\StaticAsteroid30m_D_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid30m_D_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\30m\\StaticAsteroid30m_D_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid30m_D_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\50m\\StaticAsteroid50m_D_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid50m_D_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\50m\\StaticAsteroid50m_D_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid50m_D_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\100m\\StaticAsteroid100m_D_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid100m_D_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\100m\\StaticAsteroid100m_D_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid100m_D_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\300m\\StaticAsteroid300m_D_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid300m_D_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\300m\\StaticAsteroid300m_D_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid300m_D_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\500m\\StaticAsteroid500m_D_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid500m_D_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\500m\\StaticAsteroid500m_D_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid500m_D_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\1000m\\StaticAsteroid1000m_D_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid1000m_D_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\1000m\\StaticAsteroid1000m_D_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid1000m_D_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\2000m\\StaticAsteroid2000m_D_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid2000m_D_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\2000m\\StaticAsteroid2000m_D_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid2000m_D_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\5000m\\StaticAsteroid5000m_D_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid5000m_D_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\5000m\\StaticAsteroid5000m_D_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid5000m_D_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10000m\\StaticAsteroid10000m_D_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid10000m_D_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10000m\\StaticAsteroid10000m_D_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid10000m_D_LOD1)); + + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10m\\StaticAsteroid10m_E_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid10m_E_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10m\\StaticAsteroid10m_E_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid10m_E_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\20m\\StaticAsteroid20m_E_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid20m_E_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\20m\\StaticAsteroid20m_E_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid20m_E_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\30m\\StaticAsteroid30m_E_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid30m_E_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\30m\\StaticAsteroid30m_E_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid30m_E_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\50m\\StaticAsteroid50m_E_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid50m_E_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\50m\\StaticAsteroid50m_E_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid50m_E_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\100m\\StaticAsteroid100m_E_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid100m_E_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\100m\\StaticAsteroid100m_E_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid100m_E_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\300m\\StaticAsteroid300m_E_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid300m_E_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\300m\\StaticAsteroid300m_E_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid300m_E_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\500m\\StaticAsteroid500m_E_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid500m_E_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\500m\\StaticAsteroid500m_E_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid500m_E_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\1000m\\StaticAsteroid1000m_E_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid1000m_E_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\1000m\\StaticAsteroid1000m_E_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid1000m_E_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\2000m\\StaticAsteroid2000m_E_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid2000m_E_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\2000m\\StaticAsteroid2000m_E_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid2000m_E_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\5000m\\StaticAsteroid5000m_E_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid5000m_E_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\5000m\\StaticAsteroid5000m_E_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid5000m_E_LOD1)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10000m\\StaticAsteroid10000m_E_LOD0", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid10000m_E_LOD0)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Asteroids\\10000m\\StaticAsteroid10000m_E_LOD1", MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID, MyModelsEnum.StaticAsteroid10000m_E_LOD1)); + */ + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Large ships + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\LargeShip_Kai", MyModelsEnum.Kai, MyModelsEnum.Kai_LOD1, MyModelsEnum.Kai_COL); + + AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\LargeShip_Saya", MyModelsEnum.MotherShipSaya, MyModelsEnum.MotherShipSaya_LOD1, MyModelsEnum.MotherShipSaya_COL); + + AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\LargeShip_Ardant", MyModelsEnum.Ardant, MyModelsEnum.Ardant_LOD1, MyModelsEnum.Ardant_COL); + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Guns for mining ships + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Large debris fields + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Editor + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + ////////////////////////////////////////////////////////////////////////// + //* + ////////////////////////////////////////////////////////////////////////// + AddEntityModels("Models2\\Prefabs\\04_Connections\\03_Passage\\01\\01_Straight\\p430_a01_passage_10m", MyModelsEnum.p430_a01_passage_10m, MyModelsEnum.p430_a01_passage_10m_LOD1, MyModelsEnum.p430_a01_passage_10m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\03_Passage\\01\\01_Straight\\p430_a02_passage_40m", MyModelsEnum.p430_a02_passage_40m, MyModelsEnum.p430_a02_passage_40m_LOD1, MyModelsEnum.p430_a02_passage_40m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\02_Pipe\\01\\04_Base\\p424_a01_pipe_base", MyModelsEnum.p424_a01_pipe_base, null, MyModelsEnum.p424_a01_pipe_base_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\02_Pipe\\01\\03_Junction\\p423_a01_pipe_junction", MyModelsEnum.p423_a01_pipe_junction, MyModelsEnum.p423_a01_pipe_junction_LOD1, MyModelsEnum.p423_a01_pipe_junction_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\02_Pipe\\01\\02_Turn\\p422_a01_pipe_turn_90", MyModelsEnum.p422_a01_pipe_turn_90, MyModelsEnum.p422_a01_pipe_turn_90_LOD1, MyModelsEnum.p422_a01_pipe_turn_90_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\02_Pipe\\01\\01_Straight\\p421_a01_pipe_straight_80m", MyModelsEnum.p421_a01_pipe_straight_80m, MyModelsEnum.p421_a01_pipe_straight_80m_LOD1, MyModelsEnum.p421_a01_pipe_straight_80m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\02_Pipe\\01\\01_Straight\\p421_a02_pipe_straight_40m", MyModelsEnum.p421_a02_pipe_straight_40m, MyModelsEnum.p421_a02_pipe_straight_40m_LOD1, MyModelsEnum.p421_a02_pipe_straight_40m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\02_Pipe\\01\\01_Straight\\p421_a03_pipe_straight_10m", MyModelsEnum.p421_a03_pipe_straight_10m, MyModelsEnum.p421_a03_pipe_straight_10m_LOD1, MyModelsEnum.p421_a03_pipe_straight_10m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\07\\05_Junction\\p413_g01_junction_6axes", MyModelsEnum.p413_g01_junction_6axes, MyModelsEnum.p413_g01_junction_6axes_LOD1, MyModelsEnum.p413_g01_junction_6axes_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\07\\04_Entrance\\p414_g02_entrance_60m", MyModelsEnum.p414_g02_entrance_60m, MyModelsEnum.p414_g02_entrance_60m_LOD1, MyModelsEnum.p414_g02_entrance_60m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\07\\02_Turn90\\00_0m\\p410_g01_turn_90_right_0m", MyModelsEnum.p410_g01_turn_90_right_0m, MyModelsEnum.p410_g01_turn_90_right_0m_LOD1, MyModelsEnum.p410_g01_turn_90_right_0m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\07\\01_Straight\\p411_g01_straight_1", MyModelsEnum.p411_g01_straight_1, MyModelsEnum.p411_g01_straight_1_LOD1, MyModelsEnum.p411_g01_straight_1_COL); + //AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\07\\01_Straight\\p411_g02_straight_2", MyMeshDrawTechnique.MESH, MyModelsEnum.p411_g02_straight_2)); + //AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\07\\01_Straight\\p411_g03_straight_3", MyMeshDrawTechnique.MESH, MyModelsEnum.p411_g03_straight_3)); + //AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\07\\01_Straight\\p411_g04_straight_4", MyMeshDrawTechnique.MESH, MyModelsEnum.p411_g04_straight_4)); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\07\\01_Straight\\p411_g02_straight_2", MyModelsEnum.p411_g02_straight_2, MyModelsEnum.p411_g02_straight_2_LOD1, MyModelsEnum.p411_g02_straight_2_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\07\\01_Straight\\p411_g03_straight_3", MyModelsEnum.p411_g03_straight_3, MyModelsEnum.p411_g03_straight_3_LOD1, MyModelsEnum.p411_g03_straight_3_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\07\\01_Straight\\p411_g04_straight_4", MyModelsEnum.p411_g04_straight_4, MyModelsEnum.p411_g04_straight_4_LOD1, MyModelsEnum.p411_g04_straight_4_COL); + //AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\04_Entrance\\p414_f02_entrance_60m", MyMeshDrawTechnique.MESH, MyModelsEnum.p414_f02_entrance_60m)); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\03_TurnS\\p412_f21_turn_s_up", MyModelsEnum.p412_f21_turn_s_up, null, MyModelsEnum.p412_f21_turn_s_up_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\03_TurnS\\p412_f22_turn_s_left", MyModelsEnum.p412_f22_turn_s_left, null, MyModelsEnum.p412_f22_turn_s_left_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\03_TurnS\\p412_f23_turn_s_right", MyModelsEnum.p412_f23_turn_s_right, null, MyModelsEnum.p412_f23_turn_s_right_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\03_TurnS\\p412_f24_turn_s_down", MyModelsEnum.p412_f24_turn_s_down, null, MyModelsEnum.p412_f24_turn_s_down_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\02_Turn90\\01_230m\\p412_f01_turn_90_up_230m", MyModelsEnum.p412_f01_turn_90_up_230m, null, null); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\02_Turn90\\01_230m\\p412_f02_turn_90_left_230m", MyModelsEnum.p412_f02_turn_90_left_230m, MyModelsEnum.p412_f02_turn_90_left_230m_LOD1, MyModelsEnum.p412_f02_turn_90_left_230m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\02_Turn90\\01_230m\\p412_f03_turn_90_right_230m", MyModelsEnum.p412_f03_turn_90_right_230m, MyModelsEnum.p412_f03_turn_90_right_230m_LOD1, MyModelsEnum.p412_f03_turn_90_right_230m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\02_Turn90\\01_230m\\p412_f04_turn_90_down_230m", MyModelsEnum.p412_f04_turn_90_down_230m, null, MyModelsEnum.p412_f04_turn_90_down_230m_COL); + //AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\01_Straight\\p411_f01_straight_1", MyMeshDrawTechnique.MESH, MyModelsEnum.p411_f01_straight_1)); + //AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\01_Straight\\p411_f02_straight_2", MyMeshDrawTechnique.MESH, MyModelsEnum.p411_f02_straight_2)); + //AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\01_Straight\\p411_f03_straight_3", MyMeshDrawTechnique.MESH, MyModelsEnum.p411_f03_straight_3)); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\01_Straight\\p411_f01_straight_1", MyModelsEnum.p411_f01_straight_1, null, MyModelsEnum.p411_f01_straight_1_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\01_Straight\\p411_f02_straight_2", MyModelsEnum.p411_f02_straight_2, null, MyModelsEnum.p411_f02_straight_2_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\01_Straight\\p411_f03_straight_3", MyModelsEnum.p411_f03_straight_3, null, MyModelsEnum.p411_f03_straight_3_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\05\\04_Entrance\\p414_e01_entrance_60m", MyModelsEnum.p414_e01_entrance_60m, MyModelsEnum.p414_e01_entrance_60m_LOD1, MyModelsEnum.p414_e01_entrance_60m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\05\\01_Straight\\p411_e01_straight_1", MyModelsEnum.p411_e01_straight_1, MyModelsEnum.p411_e01_straight_1_LOD1, MyModelsEnum.p411_e01_straight_1_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\05\\01_Straight\\p411_e02_straight_2", MyModelsEnum.p411_e02_straight_2, MyModelsEnum.p411_e02_straight_2_LOD1, MyModelsEnum.p411_e02_straight_2_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\05\\01_Straight\\p411_e03_straight_3", MyModelsEnum.p411_e03_straight_3, MyModelsEnum.p411_e03_straight_3_LOD1, MyModelsEnum.p411_e03_straight_3_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\05\\01_Straight\\p411_e04_straight_4", MyModelsEnum.p411_e04_straight_4, MyModelsEnum.p411_e04_straight_4_LOD1, MyModelsEnum.p411_e04_straight_4_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\05\\01_Straight\\p411_e05_straight_5", MyModelsEnum.p411_e05_straight_5, MyModelsEnum.p411_e05_straight_5_LOD1, MyModelsEnum.p411_e05_straight_5_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\04\\06_Other\\01_Door\\p415_d01_doorcase", MyModelsEnum.p415_d01_doorcase, MyModelsEnum.p415_d01_doorcase_LOD1, MyModelsEnum.p415_d01_doorcase_COL); + AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\04\\06_Other\\01_Door\\p415_d02_door1", MyMeshDrawTechnique.MESH, MyModelsEnum.p415_d02_door1)); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\04\\06_Other\\01_Door\\p415_d03_door2_a", MyModelsEnum.p415_d03_door2_a, null, MyModelsEnum.p415_d03_door2_a_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\04\\06_Other\\01_Door\\p415_d03_door2_b", MyModelsEnum.p415_d03_door2_b, null, MyModelsEnum.p415_d03_door2_b_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\04\\05_Junction\\p413_d01_junction_t_horizontal", MyModelsEnum.p413_d01_junction_t_horizontal, MyModelsEnum.p413_d01_junction_t_horizontal_LOD1, null); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\04\\05_Junction\\p413_d03_junction_x_horizontal", MyModelsEnum.p413_d03_junction_x_horizontal, MyModelsEnum.p413_d03_junction_x_horizontal_LOD1, MyModelsEnum.p413_d03_junction_x_horizontal_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\04\\04_Entrance\\p414_d01_entrance_60m", MyModelsEnum.p414_d01_entrance_60m, null, MyModelsEnum.p414_d01_entrance_60m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\04\\01_Straight\\p411_d01_straight_10m", MyModelsEnum.p411_d01_straight_10m, MyModelsEnum.p411_d01_straight_10m_LOD1, MyModelsEnum.p411_d01_straight_10m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\04\\01_Straight\\p411_d02_straight_40m_with_hole", MyModelsEnum.p411_d02_straight_40m_with_hole, MyModelsEnum.p411_d02_straight_40m_with_hole_LOD1, MyModelsEnum.p411_d02_straight_40m_with_hole_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\04\\01_Straight\\p411_d03_straight_60m", MyModelsEnum.p411_d03_straight_60m, MyModelsEnum.p411_d03_straight_60m_LOD1, MyModelsEnum.p411_d03_straight_60m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\04\\01_Straight\\p411_d04_straight_120m", MyModelsEnum.p411_d04_straight_120m, MyModelsEnum.p411_d04_straight_120m_LOD1, MyModelsEnum.p411_d04_straight_120m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\04\\01_Straight\\p411_d05_straight_180m", MyModelsEnum.p411_d05_straight_180m, MyModelsEnum.p411_d05_straight_180m_LOD1, MyModelsEnum.p411_d05_straight_180m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\06_Other\\01_Door\\p415_c01_doorcase", MyModelsEnum.p415_c01_doorcase, MyModelsEnum.p415_c01_doorcase_LOD1, MyModelsEnum.p415_c01_doorcase_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\06_Other\\01_Door\\p415_c02_door1_right", MyModelsEnum.p415_c02_door1_right, null, MyModelsEnum.p415_c02_door1_right_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\06_Other\\01_Door\\p415_c02_door1_left", MyModelsEnum.p415_c02_door1_left, null, MyModelsEnum.p415_c02_door1_left_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\06_Other\\01_Door\\p415_c03_door2_a_left", MyModelsEnum.p415_c03_door2_a_left, MyModelsEnum.p415_c03_door2_a_left_LOD1, MyModelsEnum.p415_c03_door2_a_left_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\06_Other\\01_Door\\p415_c03_door2_a_right", MyModelsEnum.p415_c03_door2_a_right, MyModelsEnum.p415_c03_door2_a_right_LOD1, MyModelsEnum.p415_c03_door2_a_right_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\06_Other\\01_Door\\p415_c03_door2_b_left", MyModelsEnum.p415_c03_door2_b_left, MyModelsEnum.p415_c03_door2_b_left_LOD1, MyModelsEnum.p415_c03_door2_b_left_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\06_Other\\01_Door\\p415_c03_door2_b_right", MyModelsEnum.p415_c03_door2_b_right, MyModelsEnum.p415_c03_door2_b_right_LOD1, MyModelsEnum.p415_c03_door2_b_right_COL); + AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\06_Other\\01_Door\\p415_c02_door1", MyMeshDrawTechnique.MESH, MyModelsEnum.p415_c02_door1)); + AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\06_Other\\01_Door\\p415_c03_door2_a", MyMeshDrawTechnique.MESH, MyModelsEnum.p415_c03_door2_a)); + AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\06_Other\\01_Door\\p415_c03_door2_b", MyMeshDrawTechnique.MESH, MyModelsEnum.p415_c03_door2_b)); + AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\06_Other\\01_Door\\p415_c04_door3", MyMeshDrawTechnique.MESH, MyModelsEnum.p415_c04_door3)); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\05_Junction\\p413_c01_junction_t_horizontal", MyModelsEnum.p413_c01_junction_t_horizontal, MyModelsEnum.p413_c01_junction_t_horizontal_LOD1, MyModelsEnum.p413_c01_junction_t_horizontal_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\05_Junction\\p413_c01_junction_x_horizontal", MyModelsEnum.p413_c01_junction_x_horizontal, MyModelsEnum.p413_c01_junction_x_horizontal_LOD1, MyModelsEnum.p413_c01_junction_x_horizontal_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\04_Entrance\\p414_c01_entrance_60m", MyModelsEnum.p414_c01_entrance_60m, null, MyModelsEnum.p414_c01_entrance_60m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\01_Straight\\p411_c01_straight_10m", MyModelsEnum.p411_c01_straight_10m, null, MyModelsEnum.p411_c01_straight_10m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\01_Straight\\p411_c02_straight_40m_with_hole", MyModelsEnum.p411_c02_straight_40m_with_hole, MyModelsEnum.p411_c02_straight_40m_with_hole_LOD1, MyModelsEnum.p411_c02_straight_40m_with_hole_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\01_Straight\\p411_c03_straight_60m", MyModelsEnum.p411_c03_straight_60m, MyModelsEnum.p411_c03_straight_60m_LOD1, MyModelsEnum.p411_c03_straight_60m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\01_Straight\\p411_c04_straight_120m", MyModelsEnum.p411_c04_straight_120m, MyModelsEnum.p411_c04_straight_120m_LOD1, MyModelsEnum.p411_c04_straight_120m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\03\\01_Straight\\p411_c05_straight_180m", MyModelsEnum.p411_c05_straight_180m, MyModelsEnum.p411_c05_straight_180m_LOD1, MyModelsEnum.p411_c05_straight_180m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\06_Other\\01_Door\\p415_b01_doorcase", MyModelsEnum.p415_b01_doorcase, MyModelsEnum.p415_b01_doorcase_LOD1, MyModelsEnum.p415_b01_doorcase_COL); + //AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\06_Other\\01_Door\\p415_b02_door", MyMeshDrawTechnique.MESH, MyModelsEnum.p415_b02_door)); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\05_Junction\\p413_b01_junction_t_horizontal", MyModelsEnum.p413_b01_junction_t_horizontal, MyModelsEnum.p413_b01_junction_t_horizontal_LOD1, MyModelsEnum.p413_b01_junction_t_horizontal_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\05_Junction\\p413_b02_junction_t_vertical", MyModelsEnum.p413_b02_junction_t_vertical, MyModelsEnum.p413_b02_junction_t_vertical_LOD1, MyModelsEnum.p413_b02_junction_t_vertical_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\04_Entrance\\p414_b02_entrance_60m", MyModelsEnum.p414_b02_entrance_60m, MyModelsEnum.p414_b02_entrance_60m_LOD1, MyModelsEnum.p414_b02_entrance_60m_COL); + //AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\04_Entrance\\p414_b02_entrance_60m_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p414_b02_entrance_60m_LOD1)); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\03_TurnS\\p412_b21_turn_s_up", MyModelsEnum.p412_b21_turn_s_up, MyModelsEnum.p412_b21_turn_s_up_LOD1, MyModelsEnum.p412_b21_turn_s_up_COL); + AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\03_TurnS\\p412_b22_turn_s_left", MyMeshDrawTechnique.MESH, MyModelsEnum.p412_b22_turn_s_left)); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\03_TurnS\\p412_b23_turn_s_right", MyModelsEnum.p412_b23_turn_s_right, MyModelsEnum.p412_b23_turn_s_right_LOD1, MyModelsEnum.p412_b23_turn_s_right_COL); + //AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\03_TurnS\\p412_b24_turn_s_down", MyMeshDrawTechnique.MESH, MyModelsEnum.p412_b24_turn_s_down)); + AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\03_TurnS\\p412_b22_turn_s_left_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p412_b22_turn_s_left_LOD1)); + //AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\03_TurnS\\p412_b24_turn_s_down_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p412_b24_turn_s_down_LOD1)); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\03_TurnS\\p412_b24_turn_s_down", MyModelsEnum.p412_b24_turn_s_down, MyModelsEnum.p412_b24_turn_s_down_LOD1, MyModelsEnum.p412_b24_turn_s_down_COL); + + AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\02_Turn90\\02_160m\\p412_b11_turn_90_up_160m", MyMeshDrawTechnique.MESH, MyModelsEnum.p412_b11_turn_90_up_160m)); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\02_Turn90\\02_160m\\p412_b12_turn_90_left_160m", MyModelsEnum.p412_b12_turn_90_left_160m, MyModelsEnum.p412_b12_turn_90_left_160m_LOD1, null); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\02_Turn90\\02_160m\\p412_b13_turn_90_right_160m", MyModelsEnum.p412_b13_turn_90_right_160m, MyModelsEnum.p412_b13_turn_90_right_160m_LOD1, MyModelsEnum.p412_b13_turn_90_right_160m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\02_Turn90\\02_160m\\p412_b14_turn_90_down_160m", MyModelsEnum.p412_b14_turn_90_down_160m, MyModelsEnum.p412_b14_turn_90_down_160m_LOD1, MyModelsEnum.p412_b14_turn_90_down_160m_COL); + AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\02_Turn90\\02_160m\\p412_b11_turn_90_up_160m_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p412_b11_turn_90_up_160m_LOD1)); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\02_Turn90\\01_80m\\p412_b01_turn_90_up_80m", MyModelsEnum.p412_b01_turn_90_up_80m, MyModelsEnum.p412_b01_turn_90_up_80m_LOD1, MyModelsEnum.p412_b01_turn_90_up_80m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\02_Turn90\\01_80m\\p412_b02_turn_90_left_80m", MyModelsEnum.p412_b02_turn_90_left_80m, MyModelsEnum.p412_b02_turn_90_left_80m_LOD1, MyModelsEnum.p412_b02_turn_90_left_80m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\02_Turn90\\01_80m\\p412_b03_turn_90_right_80m", MyModelsEnum.p412_b03_turn_90_right_80m, MyModelsEnum.p412_b03_turn_90_right_80m_LOD1, MyModelsEnum.p412_b03_turn_90_right_80m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\02_Turn90\\01_80m\\p412_b04_turn_90_down_80m", MyModelsEnum.p412_b04_turn_90_down_80m, MyModelsEnum.p412_b04_turn_90_down_80m_LOD1, MyModelsEnum.p412_b04_turn_90_down_80m_COL); + + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\01_Straight\\p411_b01_straight_10m", MyModelsEnum.p411_b01_straight_10m, MyModelsEnum.p411_b01_straight_10m_LOD1, MyModelsEnum.p411_b01_straight_10m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\01_Straight\\p411_b02_straight_30m_yellow", MyModelsEnum.p411_b02_straight_30m_yellow, MyModelsEnum.p411_b02_straight_30m_yellow_LOD1, MyModelsEnum.p411_b02_straight_30m_yellow_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\01_Straight\\p411_b03_straight_320m", MyModelsEnum.p411_b03_straight_320m, MyModelsEnum.p411_b03_straight_320m_LOD1, MyModelsEnum.p411_b03_straight_320m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\01_Straight\\p411_b04_straight_80m_with_side_grates", MyModelsEnum.p411_b04_straight_80m_with_side_grates, MyModelsEnum.p411_b04_straight_80m_with_side_grates_LOD1, MyModelsEnum.p411_b04_straight_80m_with_side_grates_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\01_Straight\\p411_b05_straight_80m_with_side_open", MyModelsEnum.p411_b05_straight_80m_with_side_open, MyModelsEnum.p411_b05_straight_80m_with_side_open_LOD1, MyModelsEnum.p411_b05_straight_80m_with_side_open_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\01_Straight\\p411_b06_straight_180m_concrete", MyModelsEnum.p411_b06_straight_180m_concrete, MyModelsEnum.p411_b06_straight_180m_concrete_LOD1, MyModelsEnum.p411_b06_straight_180m_concrete_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\01_Straight\\p411_b06_straight_200m", MyModelsEnum.p411_b06_straight_200m, MyModelsEnum.p411_b06_straight_200m_LOD1, MyModelsEnum.p411_b06_straight_200m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\01_Straight\\p411_b07_straight_180m_blue", MyModelsEnum.p411_b07_straight_180m_blue, MyModelsEnum.p411_b07_straight_180m_blue_LOD1, MyModelsEnum.p411_b07_straight_180m_blue_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\01_Straight\\p411_b09_straight_30m_gray", MyModelsEnum.p411_b09_straight_30m_gray, MyModelsEnum.p411_b09_straight_30m_gray_LOD1, MyModelsEnum.p411_b09_straight_30m_gray_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\01_Straight\\p411_b11_straight_220m", MyModelsEnum.p411_b11_straight_220m, MyModelsEnum.p411_b11_straight_220m_LOD1, MyModelsEnum.p411_b11_straight_220m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\01_Straight\\p411_b12_straight_160m_dark_metal", MyModelsEnum.p411_b12_straight_160m_dark_metal, MyModelsEnum.p411_b12_straight_160m_dark_metal_LOD1, MyModelsEnum.p411_b12_straight_160m_dark_metal_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\02\\01_Straight\\p411_b13_straight_100m_tube_inside", MyModelsEnum.p411_b13_straight_100m_tube_inside, MyModelsEnum.p411_b13_straight_100m_tube_inside_LOD1, MyModelsEnum.p411_b13_straight_100m_tube_inside_COL); + + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\06_Other\\01_Door\\p415_a01_doorcase", MyModelsEnum.p415_a01_doorcase, MyModelsEnum.p415_a01_doorcase_LOD1, MyModelsEnum.p415_a01_doorcase_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\06_Other\\01_Door\\p415_a02_door_left", MyModelsEnum.p415_a02_door_left, null, MyModelsEnum.p415_a02_door_left_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\06_Other\\01_Door\\p415_a02_door_right", MyModelsEnum.p415_a02_door_right, null, MyModelsEnum.p415_a02_door_right_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\06_Other\\01_Door\\p415_a02_door", MyModelsEnum.p415_a02_door, null, null); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\05_Junction\\p413_a01_junction_t_horizontal", MyModelsEnum.p413_a01_junction_t_horizontal, MyModelsEnum.p413_a01_junction_t_horizontal_LOD1, MyModelsEnum.p413_a01_junction_t_horizontal_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\05_Junction\\p413_a02_junction_t_vertical", MyModelsEnum.p413_a02_junction_t_vertical, MyModelsEnum.p413_a02_junction_t_vertical_LOD1, MyModelsEnum.p413_a02_junction_t_vertical_COL); + //AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\04_Entrance\\p414_a01_entrance_30m", MyModelsEnum.p414_a01_entrance_30m, null, null); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\04_Entrance\\p414_a02_entrance_60m", MyModelsEnum.p414_a02_entrance_60m, MyModelsEnum.p414_a02_entrance_60m_LOD1, MyModelsEnum.p414_a02_entrance_60m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\03_TurnS\\p412_a21_turn_s_up", MyModelsEnum.p412_a21_turn_s_up, MyModelsEnum.p412_a21_turn_s_up_LOD1, MyModelsEnum.p412_a21_turn_s_up_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\03_TurnS\\p412_a22_turn_s_left", MyModelsEnum.p412_a22_turn_s_left, MyModelsEnum.p412_a22_turn_s_left_LOD1, MyModelsEnum.p412_a22_turn_s_left_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\03_TurnS\\p412_a23_turn_s_right", MyModelsEnum.p412_a23_turn_s_right, MyModelsEnum.p412_a23_turn_s_right_LOD1, MyModelsEnum.p412_a23_turn_s_right_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\03_TurnS\\p412_a24_turn_s_down", MyModelsEnum.p412_a24_turn_s_down, MyModelsEnum.p412_a24_turn_s_down_LOD1, MyModelsEnum.p412_a24_turn_s_down_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\02_Turn90\\02_160m\\p412_a11_turn_90_up_160m", MyModelsEnum.p412_a11_turn_90_up_160m, MyModelsEnum.p412_a11_turn_90_up_160m_LOD1, MyModelsEnum.p412_a11_turn_90_up_160m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\02_Turn90\\02_160m\\p412_a12_turn_90_left_160m", MyModelsEnum.p412_a12_turn_90_left_160m, MyModelsEnum.p412_a12_turn_90_left_160m_LOD1, MyModelsEnum.p412_a12_turn_90_left_160m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\02_Turn90\\02_160m\\p412_a13_turn_90_right_160m", MyModelsEnum.p412_a13_turn_90_right_160m, MyModelsEnum.p412_a13_turn_90_right_160m_LOD1, MyModelsEnum.p412_a13_turn_90_right_160m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\02_Turn90\\02_160m\\p412_a14_turn_90_down_160m", MyModelsEnum.p412_a14_turn_90_down_160m, MyModelsEnum.p412_a14_turn_90_down_160m_LOD1, MyModelsEnum.p412_a14_turn_90_down_160m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\02_Turn90\\01_80m\\p412_a01_turn_90_up_80m", MyModelsEnum.p412_a01_turn_90_up_80m, MyModelsEnum.p412_a01_turn_90_up_80m_LOD1, MyModelsEnum.p412_a01_turn_90_up_80m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\02_Turn90\\01_80m\\p412_a02_turn_90_left_80m", MyModelsEnum.p412_a02_turn_90_left_80m, MyModelsEnum.p412_a02_turn_90_left_80m_LOD1, MyModelsEnum.p412_a02_turn_90_left_80m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\02_Turn90\\01_80m\\p412_a03_turn_90_right_80m", MyModelsEnum.p412_a03_turn_90_right_80m, MyModelsEnum.p412_a03_turn_90_right_80m_LOD1, MyModelsEnum.p412_a03_turn_90_right_80m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\02_Turn90\\01_80m\\p412_a04_turn_90_down_80m", MyModelsEnum.p412_a04_turn_90_down_80m, MyModelsEnum.p412_a04_turn_90_down_80m_LOD1, MyModelsEnum.p412_a04_turn_90_down_80m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\01_Straight\\p411_a01_straight_10m", MyModelsEnum.p411_a01_straight_10m, MyModelsEnum.p411_a01_straight_10m_LOD1, MyModelsEnum.p411_a01_straight_10m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\01_Straight\\p411_a02_straight_60m_with_hole", MyModelsEnum.p411_a02_straight_60m_with_hole, MyModelsEnum.p411_a02_straight_60m_with_hole_LOD1, MyModelsEnum.p411_a02_straight_60m_with_hole_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\01_Straight\\p411_a03_straight_120m", MyModelsEnum.p411_a03_straight_120m, MyModelsEnum.p411_a03_straight_120m_LOD1,MyModelsEnum.p411_a03_straight_120m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\01_Straight\\p411_a04_straight_80m", MyModelsEnum.p411_a04_straight_80m, MyModelsEnum.p411_a04_straight_80m_LOD1, MyModelsEnum.p411_a04_straight_80m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\01\\01_Straight\\p411_a05_straight_80m_with_extension", MyModelsEnum.p411_a05_straight_80m_with_extension, MyModelsEnum.p411_a05_straight_80m_with_extension_LOD1, MyModelsEnum.p411_a05_straight_80m_with_extension_COL); + + AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\02_Bridge\\05\\p382_e01_bridge5", MyMeshDrawTechnique.MESH, MyModelsEnum.p382_e01_bridge5)); + AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\02_Bridge\\05\\p382_e01_bridge5_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p382_e01_bridge5_LOD1)); + AddEntityModels("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\02_Bridge\\04\\p382_d01_bridge4", MyModelsEnum.p382_d01_bridge4, MyModelsEnum.p382_d01_bridge4_LOD1, MyModelsEnum.p382_d01_bridge4_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\02_Bridge\\03\\p382_c01_bridge3", MyModelsEnum.p382_c01_bridge3, MyModelsEnum.p382_c01_bridge3_LOD1, MyModelsEnum.p382_c01_bridge3_COL); + AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\02_Bridge\\02\\p382_b01_bridge2", MyMeshDrawTechnique.MESH, MyModelsEnum.p382_b01_bridge2)); + AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\02_Bridge\\02\\p382_b01_bridge2_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p382_b01_bridge2_LOD1)); + AddEntityModels("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\02_Bridge\\01\\p382_a01_bridge1", MyModelsEnum.p382_a01_bridge1, MyModelsEnum.p382_a01_bridge1_LOD1, MyModelsEnum.p382_a01_bridge1_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\01_LivingQuarters\\03\\p381_c01_building4", MyModelsEnum.p381_c01_building4, MyModelsEnum.p381_c01_building4_LOD1, MyModelsEnum.p381_c01_building4_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\01_LivingQuarters\\03\\p381_c01_building3", MyModelsEnum.p381_c01_building3, MyModelsEnum.p381_c01_building3_LOD1, MyModelsEnum.p381_c01_building3_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\01_LivingQuarters\\02\\p381_b01_building2", MyModelsEnum.p381_b01_building2, MyModelsEnum.p381_b01_building2_LOD1, MyModelsEnum.p381_b01_building2_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\01_LivingQuarters\\01\\p381_a01_building1", MyModelsEnum.p381_a01_building1, MyModelsEnum.p381_a01_building1_LOD1, MyModelsEnum.p381_a01_building1_COL); + //AddEntityModels("Models2\\Prefabs\\03_Modules\\07_Hangars\\01_Small\\01\\p361_a01_small_hangar", MyModelsEnum.p361_a01_small_hangar, null, MyModelsEnum.p361_a01_small_hangar_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\06_Communications\\02_ShortDistanceAntenna\\p362_a01_short_distance_antenna", MyModelsEnum.p362_a01_short_distance_antenna, MyModelsEnum.p362_a01_short_distance_antenna_LOD1, MyModelsEnum.p362_a01_short_distance_antenna_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\06_Communications\\01_LongDistanceAntenna\\01\\p361_a01_long_distance_antenna", MyModelsEnum.p361_a01_long_distance_antenna, MyModelsEnum.p361_a01_long_distance_antenna_LOD1, MyModelsEnum.p361_a01_long_distance_antenna_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\05_Weaponry\\01_WeaponMount\\01\\p351_a01_weapon_mount", MyModelsEnum.p351_a01_weapon_mount, MyModelsEnum.p351_a01_weapon_mount_LOD1, MyModelsEnum.p351_a01_weapon_mount_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\05_Refinery\\01\\p345_a01_refinery", MyModelsEnum.p345_a01_refinery, MyModelsEnum.p345_a01_refinery_LOD1, MyModelsEnum.p345_a01_refinery_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\04_CargoStorage\\01\\p344_a01_container_arm_filled", MyModelsEnum.p344_a01_container_arm_filled, MyModelsEnum.p344_a01_container_arm_filled_LOD1, MyModelsEnum.p344_a01_container_arm_filled_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\04_CargoStorage\\01\\p344_a02_container_arm_empty", MyModelsEnum.p344_a02_container_arm_empty, MyModelsEnum.p344_a02_container_arm_empty_LOD1, MyModelsEnum.p344_a02_container_arm_empty_COL); + //AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\04_Industry\\03_OreStorage\\01\\p343_a01_ore_storage", MyMeshDrawTechnique.MESH, MyModelsEnum.p343_a01_ore_storage)); + AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\03_OreStorage\\01\\p343_a01_ore_storage", MyModelsEnum.p343_a01_ore_storage, null, MyModelsEnum.p343_a01_ore_storage_COL); + //AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\04_Industry\\02_LoadingBay\\01\\p342_a01_loading_bay", MyMeshDrawTechnique.MESH, MyModelsEnum.p342_a01_loading_bay)); + AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\02_LoadingBay\\01\\p342_a01_loading_bay", MyModelsEnum.p342_a01_loading_bay, null, MyModelsEnum.p342_a01_loading_bay_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\01_Docks\\02\\p341_b01_open_dock_variation1", MyModelsEnum.p341_b01_open_dock_variation1, MyModelsEnum.p341_b01_open_dock_variation1_LOD1, MyModelsEnum.p341_b01_open_dock_variation1_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\01_Docks\\02\\p341_b02_open_dock_variation2", MyModelsEnum.p341_b02_open_dock_variation2, MyModelsEnum.p341_b02_open_dock_variation2_LOD1, MyModelsEnum.p341_b02_open_dock_variation2_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\01_Docks\\01\\p341_a01_open_dock_variation1", MyModelsEnum.p341_a01_open_dock_variation1, MyModelsEnum.p341_a01_open_dock_variation1_LOD1, MyModelsEnum.p341_a01_open_dock_variation1_COL); + AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\04_Industry\\01_Docks\\01\\p341_a01_open_dock_variation1_doorleft", MyMeshDrawTechnique.MESH, MyModelsEnum.p341_a01_open_dock_variation1_doorleft)); + AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\04_Industry\\01_Docks\\01\\p341_a01_open_dock_variation1_doorright", MyMeshDrawTechnique.MESH, MyModelsEnum.p341_a01_open_dock_variation1_doorright)); + AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\01_Docks\\01\\p341_a02_open_dock_variation2", MyModelsEnum.p341_a02_open_dock_variation2, MyModelsEnum.p341_a02_open_dock_variation2_LOD1, MyModelsEnum.p341_a02_open_dock_variation2_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\03_LifeSupport\\03_HydroponicFarm\\01\\p333_a01_hydroponic_building", MyModelsEnum.p333_a01_hydroponic_building, MyModelsEnum.p333_a01_hydroponic_building_LOD1, MyModelsEnum.p333_a01_hydroponic_building_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\03_LifeSupport\\02_OxygenStorage\\01\\p332_a01_oxygen_storage", MyModelsEnum.p332_a01_oxygen_storage, MyModelsEnum.p332_a01_oxygen_storage_LOD1, MyModelsEnum.p332_a01_oxygen_storage_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\03_LifeSupport\\01_OxygenGeneration\\01\\p331_a01_oxygen_generator", MyModelsEnum.p331_a01_oxygen_generator, MyModelsEnum.p331_a01_oxygen_generator_LOD1, MyModelsEnum.p331_a01_oxygen_generator_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\04_FuelStorage\\02\\p324b01_fuel_storage_b", MyModelsEnum.p324b01_fuel_storage_b, MyModelsEnum.p324b01_fuel_storage_b_LOD1, MyModelsEnum.p324b01_fuel_storage_b_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\04_FuelStorage\\01\\p324a01_fuel_storage_a", MyModelsEnum.p324a01_fuel_storage_a, MyModelsEnum.p324a01_fuel_storage_a_LOD1, MyModelsEnum.p324a01_fuel_storage_a_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\03_FuelGeneration\\01\\p323a01_fuel_generator", MyModelsEnum.p323a01_fuel_generator, MyModelsEnum.p323a01_fuel_generator_LOD1, MyModelsEnum.p323a01_fuel_generator_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\02_PowerStorage\\01\\p322a01_battery", MyModelsEnum.p322a01_battery, MyModelsEnum.p322a01_battery_LOD1, MyModelsEnum.p322a01_battery_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c01_inertia_generator", MyModelsEnum.p321c01_inertia_generator, MyModelsEnum.p321c01_inertia_generator_LOD1, MyModelsEnum.p321c01_inertia_generator_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c01_inertia_generator_center", MyModelsEnum.p321c01_inertia_generator_center, MyModelsEnum.p321c01_inertia_generator_center_LOD1, MyModelsEnum.p321c01_inertia_generator_center_COL); + AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\02\\p321b01_nuclear_reactor", MyMeshDrawTechnique.MESH, MyModelsEnum.p321b01_nuclear_reactor)); + //AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\01\\p321a01_solar_panel", MyModelsEnum.p321a01_solar_panel, MyModelsEnum.p321a01_solar_panel_LOD1, MyModelsEnum.p321a01_solar_panel_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\01_Flight\\02_ShortTermThruster\\01\\p312a01_short_term_thruster_latitude", MyModelsEnum.p312a01_short_term_thruster_latitude, MyModelsEnum.p312a01_short_term_thruster_latitude_LOD1, MyModelsEnum.p312a01_short_term_thruster_latitude_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\01_Flight\\02_ShortTermThruster\\01\\p312a02_short_term_thruster_lateral", MyModelsEnum.p312a02_short_term_thruster_lateral, MyModelsEnum.p312a02_short_term_thruster_lateral_LOD1, MyModelsEnum.p312a02_short_term_thruster_lateral_COL); + AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\01_Flight\\01_LongTermThruster\\01\\p311a01_long_term_thruster", MyMeshDrawTechnique.MESH, MyModelsEnum.p311a01_long_term_thruster)); + AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a01_armor", MyModelsEnum.p231a01_armor, MyModelsEnum.p231a01_armor_LOD01, MyModelsEnum.p231a01_armor_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a02_armor", MyModelsEnum.p231a02_armor, MyModelsEnum.p231a02_armor_LOD01, MyModelsEnum.p231a02_armor_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a03_armor", MyModelsEnum.p231a03_armor, MyModelsEnum.p231a03_armor_LOD01, MyModelsEnum.p231a03_armor_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a04_armor", MyModelsEnum.p231a04_armor, MyModelsEnum.p231a04_armor_LOD01, MyModelsEnum.p231a04_armor_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a05_armor", MyModelsEnum.p231a05_armor, MyModelsEnum.p231a05_armor_LOD01, MyModelsEnum.p231a05_armor_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a06_armor", MyModelsEnum.p231a06_armor, MyModelsEnum.p231a06_armor_LOD01, MyModelsEnum.p231a06_armor_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a07_armor", MyModelsEnum.p231a07_armor, MyModelsEnum.p231a07_armor_LOD01, MyModelsEnum.p231a07_armor_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a08_armor", MyModelsEnum.p231a08_armor, MyModelsEnum.p231a08_armor_LOD01, MyModelsEnum.p231a08_armor_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a09_armor", MyModelsEnum.p231a09_armor, MyModelsEnum.p231a09_armor_LOD01, MyModelsEnum.p231a09_armor_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a10_armor", MyModelsEnum.p231a10_armor, MyModelsEnum.p231a10_armor_LOD01, MyModelsEnum.p231a10_armor_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a11_armor", MyModelsEnum.p231a11_armor, MyModelsEnum.p231a11_armor_LOD01, MyModelsEnum.p231a11_armor_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a12_armor", MyModelsEnum.p231a12_armor, MyModelsEnum.p231a12_armor_LOD01, MyModelsEnum.p231a12_armor_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a13_armor", MyModelsEnum.p231a13_armor, MyModelsEnum.p231a13_armor_LOD01, MyModelsEnum.p231a13_armor_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a14_armor", MyModelsEnum.p231a14_armor, MyModelsEnum.p231a14_armor_LOD01, MyModelsEnum.p231a14_armor_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a15_armor", MyModelsEnum.p231a15_armor, MyModelsEnum.p231a15_armor_LOD01, MyModelsEnum.p231a15_armor_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a16_armor", MyModelsEnum.p231a16_armor, MyModelsEnum.p231a16_armor_LOD01, MyModelsEnum.p231a16_armor_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a17_armor", MyModelsEnum.p231a17_armor, MyModelsEnum.p231a17_armor_LOD01, MyModelsEnum.p231a17_armor_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231a18_armor", MyModelsEnum.p231a18_armor, MyModelsEnum.p231a18_armor_LOD01, MyModelsEnum.p231a18_armor_COL); + + AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\01\\p221a01_chamber_v1", MyModelsEnum.p221a01_chamber_v1, MyModelsEnum.p221a01_chamber_v1_LOD1, MyModelsEnum.p221a01_chamber_v1_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\02\\p221b01_chamber_v1", MyModelsEnum.p221b01_chamber_v1, MyModelsEnum.p221b01_chamber_v1_LOD1, MyModelsEnum.p221b01_chamber_v1_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\03\\p221c01_chamber_v1", MyModelsEnum.p221c01_chamber_v1, MyModelsEnum.p221c01_chamber_v1_LOD1, MyModelsEnum.p221c01_chamber_v1_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\04\\p221d01_chamber_v1", MyModelsEnum.p221d01_chamber_v1, MyModelsEnum.p221d01_chamber_v1_LOD1, MyModelsEnum.p221d01_chamber_v1_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\05\\p221e01_chamber_v1", MyModelsEnum.p221e01_chamber_v1, MyModelsEnum.p221e01_chamber_v1_LOD1, MyModelsEnum.p221e01_chamber_v1_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\06\\p221f01_chamber_v1", MyModelsEnum.p221f01_chamber_v1, MyModelsEnum.p221f01_chamber_v1_LOD1, MyModelsEnum.p221f01_chamber_v1_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\07\\p221g01_chamber_v1", MyModelsEnum.p221g01_chamber_v1, MyModelsEnum.p221g01_chamber_v1_LOD1, MyModelsEnum.p221g01_chamber_v1_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\08\\p221h01_chamber_v1", MyModelsEnum.p221h01_chamber_v1, MyModelsEnum.p221h01_chamber_v1_LOD1, MyModelsEnum.p221h01_chamber_v1_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\09\\p221j01_chamber_v1", MyModelsEnum.p221j01_chamber_v1, MyModelsEnum.p221j01_chamber_v1_LOD1, MyModelsEnum.p221j01_chamber_v1_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\10\\p221k01_chamber_v1", MyModelsEnum.p221k01_chamber_v1, MyModelsEnum.p221k01_chamber_v1_LOD1, null); + + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08\\p211h01_panel_535mx130m", MyModelsEnum.p211h01_panel_535mx130m, MyModelsEnum.p211h01_panel_535mx130m_LOD1, MyModelsEnum.p211h01_panel_535mx130m_COL); + + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\07\\p211g01_panel_120mx60m", MyModelsEnum.p211g01_panel_120mx60m, MyModelsEnum.p211g01_panel_120mx60m_LOD1, MyModelsEnum.p211g01_panel_120mx60m_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\07\\p211g02_panel_60mx60m", MyModelsEnum.p211g02_panel_60mx60m, MyModelsEnum.p211g02_panel_60mx60m_LOD1, MyModelsEnum.p211g02_panel_60mx60m_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\07\\p211g03_panel_60mx30m", MyModelsEnum.p211g03_panel_60mx30m, MyModelsEnum.p211g03_panel_60mx30m_LOD1, MyModelsEnum.p211g03_panel_60mx30m_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\06\\p211f01_panel_120mx60m", MyModelsEnum.p211f01_panel_120mx60m, MyModelsEnum.p211f01_panel_120mx60m_LOD1, MyModelsEnum.p211f01_panel_120mx60m_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\06\\p211f02_panel_60mx60m", MyModelsEnum.p211f02_panel_60mx60m, MyModelsEnum.p211f02_panel_60mx60m_LOD1, MyModelsEnum.p211f02_panel_60mx60m_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\06\\p211f03_panel_60mx30m", MyModelsEnum.p211f03_panel_60mx30m, null, MyModelsEnum.p211f03_panel_60mx30m_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\05\\p211e01_panel_120mx60m", MyModelsEnum.p211e01_panel_120mx60m, MyModelsEnum.p211e01_panel_120mx60m_LOD1, MyModelsEnum.p211e01_panel_120mx60m_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\05\\p211e02_panel_60mx60m", MyModelsEnum.p211e02_panel_60mx60m, MyModelsEnum.p211e02_panel_60mx60m_LOD1, MyModelsEnum.p211e02_panel_60mx60m_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\05\\p211e03_panel_60mx30m", MyModelsEnum.p211e03_panel_60mx30m, MyModelsEnum.p211e03_panel_60mx30m_LOD1, MyModelsEnum.p211e03_panel_60mx30m_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\04\\p211d01_panel_120mx60m", MyModelsEnum.p211d01_panel_120mx60m, MyModelsEnum.p211d01_panel_120mx60m_LOD1, MyModelsEnum.p211d01_panel_120mx60m_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\04\\p211d02_panel_60mx60m", MyModelsEnum.p211d02_panel_60mx60m, MyModelsEnum.p211d02_panel_60mx60m_LOD1, MyModelsEnum.p211d02_panel_60mx60m_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\04\\p211d03_panel_60mx30m", MyModelsEnum.p211d03_panel_60mx30m, MyModelsEnum.p211d03_panel_60mx30m_LOD1, MyModelsEnum.p211d03_panel_60mx30m_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\03\\p211c01_panel_120mx60m", MyModelsEnum.p211c01_panel_120mx60m, MyModelsEnum.p211c01_panel_120mx60m_LOD1, null); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\03\\p211c02_panel_60mx60m", MyModelsEnum.p211c02_panel_60mx60m, MyModelsEnum.p211c02_panel_60mx60m_LOD1, MyModelsEnum.p211c02_panel_60mx60m_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\03\\p211c03_panel_60mx30m", MyModelsEnum.p211c03_panel_60mx30m, MyModelsEnum.p211c03_panel_60mx30m_LOD1, null); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\02\\p211b01_panel_120mx60m", MyModelsEnum.p211b01_panel_120mx60m, MyModelsEnum.p211b01_panel_120mx60m_LOD1, MyModelsEnum.p211b01_panel_120mx60m_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\02\\p211b02_panel_60mx60m", MyModelsEnum.p211b02_panel_60mx60m, MyModelsEnum.p211b02_panel_60mx60m_LOD1, MyModelsEnum.p211b02_panel_60mx60m_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\02\\p211b03_panel_60mx30m", MyModelsEnum.p211b03_panel_60mx30m, MyModelsEnum.p211b03_panel_60mx30m_LOD1, MyModelsEnum.p211b03_panel_60mx30m_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\01\\p211a01_panel_120mx60m", MyModelsEnum.p211a01_panel_120mx60m, MyModelsEnum.p211a01_panel_120mx60m_LOD1, MyModelsEnum.p211a01_panel_120mx60m_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\01\\p211a02_panel_60mx60m", MyModelsEnum.p211a02_panel_60mx60m, MyModelsEnum.p211a02_panel_60mx60m_LOD1, MyModelsEnum.p211a02_panel_60mx60m_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\01\\p211a03_panel_60mx30m", MyModelsEnum.p211a03_panel_60mx30m, MyModelsEnum.p211a03_panel_60mx30m_LOD1, MyModelsEnum.p211a03_panel_60mx30m_COL); + AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\04_Frame\\02_Cage\\02\\p142b01_cage_empty", MyMeshDrawTechnique.MESH, MyModelsEnum.p142b01_cage_empty)); + AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\04_Frame\\02_Cage\\02\\p142b02_cage_halfcut", MyMeshDrawTechnique.MESH, MyModelsEnum.p142b02_cage_halfcut)); + AddEntityModels("Models2\\Prefabs\\01_Beams\\04_Frame\\02_Cage\\02\\p142b03_cage_with_corners", MyModelsEnum.p142b03_cage_with_corners, MyModelsEnum.p142b03_cage_with_corners_LOD1, MyModelsEnum.p142b03_cage_with_corners_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\04_Frame\\02_Cage\\02\\p142b11_cage_pillar", MyModelsEnum.p142b11_cage_pillar, null, MyModelsEnum.p142b11_cage_pillar_COL); + AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\04_Frame\\02_Cage\\02\\p142b12_cage_edge", MyMeshDrawTechnique.MESH, MyModelsEnum.p142b12_cage_edge)); + AddEntityModels("Models2\\Prefabs\\01_Beams\\04_Frame\\02_Cage\\01\\p142a01_cage_empty", MyModelsEnum.p142a01_cage_empty, null, MyModelsEnum.p142a01_cage_empty_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\04_Frame\\02_Cage\\01\\p142a02_cage_halfcut", MyModelsEnum.p142a02_cage_halfcut, null, MyModelsEnum.p142a02_cage_halfcut_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\04_Frame\\02_Cage\\01\\p142a03_cage_with_corners", MyModelsEnum.p142a03_cage_with_corners, null, MyModelsEnum.p142a03_cage_with_corners_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\04_Frame\\02_Cage\\01\\p142a11_cage_pillar", MyModelsEnum.p142a11_cage_pillar, MyModelsEnum.p142a11_cage_pillar_LOD1, MyModelsEnum.p142a11_cage_pillar_COL); + AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\04_Frame\\02_Cage\\01\\p142a12_cage_edge", MyMeshDrawTechnique.MESH, MyModelsEnum.p142a12_cage_edge)); + AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\04_Frame\\01_Frame\\02\\p141b01_thick_frame_straight_10m", MyMeshDrawTechnique.MESH, MyModelsEnum.p141b01_thick_frame_straight_10m)); + AddEntityModels("Models2\\Prefabs\\01_Beams\\04_Frame\\01_Frame\\02\\p141b02_thick_frame_straight_60m", MyModelsEnum.p141b02_thick_frame_straight_60m, null, MyModelsEnum.p141b02_thick_frame_straight_60m_COL); + AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\04_Frame\\01_Frame\\02\\p141b11_thick_frame_edge", MyMeshDrawTechnique.MESH, MyModelsEnum.p141b11_thick_frame_edge)); + AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\04_Frame\\01_Frame\\02\\p141b12_thick_frame_corner", MyMeshDrawTechnique.MESH, MyModelsEnum.p141b12_thick_frame_corner)); + AddEntityModels("Models2\\Prefabs\\01_Beams\\04_Frame\\01_Frame\\02\\p141b31_thick_frame_joint", MyModelsEnum.p141b31_thick_frame_joint, null, MyModelsEnum.p141b31_thick_frame_joint_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\04_Frame\\01_Frame\\01\\p141a01_thick_frame_straight_10m", MyModelsEnum.p141a01_thick_frame_straight_10m, null, MyModelsEnum.p141a01_thick_frame_straight_10m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\04_Frame\\01_Frame\\01\\p141a02_thick_frame_straight_60m", MyModelsEnum.p141a02_thick_frame_straight_60m, null, MyModelsEnum.p141a02_thick_frame_straight_60m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\04_Frame\\01_Frame\\01\\p141a11_thick_frame_edge", MyModelsEnum.p141a11_thick_frame_edge, null, MyModelsEnum.p141a11_thick_frame_edge_COL); + AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\04_Frame\\01_Frame\\01\\p141a12_thick_frame_corner", MyMeshDrawTechnique.MESH, MyModelsEnum.p141a12_thick_frame_corner)); + AddEntityModels("Models2\\Prefabs\\01_Beams\\04_Frame\\01_Frame\\01\\p141a31_thick_frame_joint", MyModelsEnum.p141a31_thick_frame_joint, null, MyModelsEnum.p141a31_thick_frame_joint_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\10\\p130j01_j_straight_30m", MyModelsEnum.p130j01_j_straight_30m, null, MyModelsEnum.p130j01_j_straight_30m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\10\\p130j02_j_straight_10m", MyModelsEnum.p130j02_j_straight_10m, null, MyModelsEnum.p130j02_j_straight_10m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\09\\p130i01_i_straight_30m", MyModelsEnum.p130i01_i_straight_30m, null, null); + AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\09\\p130i02_i_straight_10m", MyModelsEnum.p130i02_i_straight_10m, null, MyModelsEnum.p130i02_i_straight_10m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\08\\p130h01_h_straight_30m", MyModelsEnum.p130h01_h_straight_30m, null, MyModelsEnum.p130h01_h_straight_30m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\08\\p130h02_h_straight_10m", MyModelsEnum.p130h02_h_straight_10m, null, MyModelsEnum.p130h02_h_straight_10m_COL); + //AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\03_Small\\07\\p130g01_g_straight_30m", MyMeshDrawTechnique.MESH, MyModelsEnum.p130g01_g_straight_30m)); + //AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\03_Small\\07\\p130g02_g_straight_10m", MyMeshDrawTechnique.MESH, MyModelsEnum.p130g02_g_straight_10m)); + //AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\03_Small\\06\\p130f01_f_straight_30m", MyMeshDrawTechnique.MESH, MyModelsEnum.p130f01_f_straight_30m)); + //AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\03_Small\\06\\p130f02_f_straight_10m", MyMeshDrawTechnique.MESH, MyModelsEnum.p130f02_f_straight_10m)); + //AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\03_Small\\05\\p130e01_e_straight_30m", MyMeshDrawTechnique.MESH, MyModelsEnum.p130e01_e_straight_30m)); + //AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\03_Small\\05\\p130e02_e_straight_10m", MyMeshDrawTechnique.MESH, MyModelsEnum.p130e02_e_straight_10m)); + //AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\03_Small\\04\\p130d01_d_straight_30m", MyMeshDrawTechnique.MESH, MyModelsEnum.p130d01_d_straight_30m)); + //AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\03_Small\\04\\p130d02_d_straight_10m", MyMeshDrawTechnique.MESH, MyModelsEnum.p130d02_d_straight_10m)); + //AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\03_Small\\03\\p130c01_c_straight_30m", MyMeshDrawTechnique.MESH, MyModelsEnum.p130c01_c_straight_30m)); + //AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\03_Small\\03\\p130c02_c_straight_10m", MyMeshDrawTechnique.MESH, MyModelsEnum.p130c02_c_straight_10m)); + //AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\03_Small\\02\\p130b01_b_straight_30m", MyMeshDrawTechnique.MESH, MyModelsEnum.p130b01_b_straight_30m)); + //AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\03_Small\\02\\p130b02_b_straight_10m", MyMeshDrawTechnique.MESH, MyModelsEnum.p130b02_b_straight_10m)); + //AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\03_Small\\01\\p130a01_a_straight_30m", MyMeshDrawTechnique.MESH, MyModelsEnum.p130a01_a_straight_30m)); + //AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\03_Small\\01\\p130a02_a_straight_10m", MyMeshDrawTechnique.MESH, MyModelsEnum.p130a02_a_straight_10m)); + AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\04\\p120d01_d_straight_10m", MyModelsEnum.p120d01_d_straight_10m, null, MyModelsEnum.p120d01_d_straight_10m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\04\\p120d02_d_straight_40m", MyModelsEnum.p120d02_d_straight_40m, null, MyModelsEnum.p120d02_d_straight_40m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\03\\p120c01_c_straight_10m", MyModelsEnum.p120c01_c_straight_10m, null, MyModelsEnum.p120c01_c_straight_10m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\03\\p120c02_c_straight_40m", MyModelsEnum.p120c02_c_straight_40m, null, MyModelsEnum.p120c02_c_straight_40m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\02\\p120b01_b_straight_10m", MyModelsEnum.p120b01_b_straight_10m, null, MyModelsEnum.p120b01_b_straight_10m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\02\\p120b02_b_straight_40m", MyModelsEnum.p120b02_b_straight_40m, null, MyModelsEnum.p120b02_b_straight_40m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\01\\p120a01_strong_lattice_straight_10m", MyModelsEnum.p120a01_strong_lattice_straight_10m, null, MyModelsEnum.p120a01_strong_lattice_straight_10m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\01\\p120a02_strong_lattice_straight_60m", MyModelsEnum.p120a02_strong_lattice_straight_60m, MyModelsEnum.p120a02_strong_lattice_straight_60m_LOD1, MyModelsEnum.p120a02_strong_lattice_straight_60m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\01\\p120a03_strong_lattice_straight_120m", MyModelsEnum.p120a03_strong_lattice_straight_120m, MyModelsEnum.p120a03_strong_lattice_straight_120m_LOD1, MyModelsEnum.p120a03_strong_lattice_straight_120m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\01\\p120a21_strong_lattice_junction_t_strong", MyModelsEnum.p120a21_strong_lattice_junction_t_strong, null, MyModelsEnum.p120a21_strong_lattice_junction_t_strong_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\01\\p120a22_strong_lattice_junction_t_weak", MyModelsEnum.p120a22_strong_lattice_junction_t_weak, MyModelsEnum.p120a22_strong_lattice_junction_t_weak_LOD1, MyModelsEnum.p120a22_strong_lattice_junction_t_weak_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\01\\p120a23_strong_lattice_junction_t_rotated", MyModelsEnum.p120a23_strong_lattice_junction_t_rotated, null, MyModelsEnum.p120a23_strong_lattice_junction_t_rotated_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\01\\p120a51_strong_to_weak_lattice_2to1", MyModelsEnum.p120a51_strong_to_weak_lattice_2to1, null, MyModelsEnum.p120a51_strong_to_weak_lattice_2to1_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\01\\p120a52_strong_to_weak_lattice_1to2", MyModelsEnum.p120a52_strong_to_weak_lattice_1to2, null, null); + AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\01\\p120a61_weak_lattice_junction_t_rotated", MyModelsEnum.p120a61_weak_lattice_junction_t_rotated, null, MyModelsEnum.p120a61_weak_lattice_junction_t_rotated_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\02\\p110b01_lattice_beam_straight_10m", MyModelsEnum.p110b01_lattice_beam_straight_10m, MyModelsEnum.p110b01_lattice_beam_straight_10m_LOD1, MyModelsEnum.p110b01_lattice_beam_straight_10m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\02\\p110b02_lattice_beam_straight_30m", MyModelsEnum.p110b02_lattice_beam_straight_30m, null, MyModelsEnum.p110b02_lattice_beam_straight_30m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\02\\p110b03_lattice_beam_straight_60m", MyModelsEnum.p110b03_lattice_beam_straight_60m, MyModelsEnum.p110b03_lattice_beam_straight_60m_LOD1, MyModelsEnum.p110b03_lattice_beam_straight_60m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\02\\p110b04_lattice_beam_straight_60m_with_panels", MyModelsEnum.p110b04_lattice_beam_straight_60m_with_panels, MyModelsEnum.p110b04_lattice_beam_straight_60m_with_panels_LOD1, MyModelsEnum.p110b04_lattice_beam_straight_60m_with_panels_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\02\\p110b21_lattice_beam_junction_t_strong", MyModelsEnum.p110b21_lattice_beam_junction_t_strong, MyModelsEnum.p110b21_lattice_beam_junction_t_strong_LOD1, MyModelsEnum.p110b21_lattice_beam_junction_t_strong_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\02\\p110b22_lattice_beam_junction_t_weak", MyModelsEnum.p110b22_lattice_beam_junction_t_weak, MyModelsEnum.p110b22_lattice_beam_junction_t_weak_LOD1, MyModelsEnum.p110b22_lattice_beam_junction_t_weak_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\02\\p110b31_lattice_beam_joint_horizontal", MyModelsEnum.p110b31_lattice_beam_joint_horizontal, null, MyModelsEnum.p110b31_lattice_beam_joint_horizontal_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\02\\p110b32_lattice_beam_joint_vertical", MyModelsEnum.p110b32_lattice_beam_joint_vertical, null, MyModelsEnum.p110b32_lattice_beam_joint_vertical_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a01_solid_beam_straight_10m", MyModelsEnum.p110a01_solid_beam_straight_10m, null, MyModelsEnum.p110a01_solid_beam_straight_10m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a02_solid_beam_straight_20m", MyModelsEnum.p110a02_solid_beam_straight_20m, null, MyModelsEnum.p110a02_solid_beam_straight_20m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a03_solid_beam_straight_40m_with_hole", MyModelsEnum.p110a03_solid_beam_straight_40m_with_hole, null, MyModelsEnum.p110a03_solid_beam_straight_40m_with_hole_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a04_solid_beam_straight_40m_lattice", MyModelsEnum.p110a04_solid_beam_straight_40m_lattice, MyModelsEnum.p110a04_solid_beam_straight_40m_lattice_LOD1, MyModelsEnum.p110a04_solid_beam_straight_40m_lattice_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a05_solid_beam_straight_80m", MyModelsEnum.p110a05_solid_beam_straight_80m, MyModelsEnum.p110a05_solid_beam_straight_80m_LOD1, MyModelsEnum.p110a05_solid_beam_straight_80m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a11_solid_beam_junction_x_strong", MyModelsEnum.p110a11_solid_beam_junction_x_strong, MyModelsEnum.p110a11_solid_beam_junction_x_strong_LOD1, MyModelsEnum.p110a11_solid_beam_junction_x_strong_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a12_solid_beam_junction_x_weak", MyModelsEnum.p110a12_solid_beam_junction_x_weak, MyModelsEnum.p110a12_solid_beam_junction_x_weak_LOD1, MyModelsEnum.p110a12_solid_beam_junction_x_weak_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a13_solid_beam_junction_x_rotated", MyModelsEnum.p110a13_solid_beam_junction_x_rotated, MyModelsEnum.p110a13_solid_beam_junction_x_rotated_LOD1, MyModelsEnum.p110a13_solid_beam_junction_x_rotated_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a21_solid_beam_junction_t_strong", MyModelsEnum.p110a21_solid_beam_junction_t_strong, null, MyModelsEnum.p110a21_solid_beam_junction_t_strong_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a22_solid_beam_junction_t_weak", MyModelsEnum.p110a22_solid_beam_junction_t_weak, MyModelsEnum.p110a22_solid_beam_junction_t_weak_LOD1, MyModelsEnum.p110a22_solid_beam_junction_t_weak_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a23_solid_beam_junction_t_rotated", MyModelsEnum.p110a23_solid_beam_junction_t_rotated, null, MyModelsEnum.p110a23_solid_beam_junction_t_rotated_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a31_solid_beam_joint_horizontal", MyModelsEnum.p110a31_solid_beam_joint_horizontal, null, MyModelsEnum.p110a31_solid_beam_joint_horizontal_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a32_solid_beam_joint_vertical", MyModelsEnum.p110a32_solid_beam_joint_vertical, null, MyModelsEnum.p110a32_solid_beam_joint_vertical_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a33_solid_beam_joint_longitudinal", MyModelsEnum.p110a33_solid_beam_joint_longitudinal, null, MyModelsEnum.p110a33_solid_beam_joint_longitudinal_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a41_solid_beam_superjoint", MyModelsEnum.p110a41_solid_beam_superjoint, null, MyModelsEnum.p110a41_solid_beam_superjoint_COL); + + ////////////////////////////////////////////////////////////////////////// + AddModel(new MyModel("Models2\\Weapons\\WeaponsSmall\\WeaponSmall_Autocannon_barrel", MyMeshDrawTechnique.MESH, MyModelsEnum.Autocannon_Barrel, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\Weapons\\WeaponsSmall\\WeaponSmall_Autocannon_base", MyMeshDrawTechnique.MESH, MyModelsEnum.Autocannon_Base, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\Weapons\\WeaponsSmall\\WeaponSmall_Rifle", MyMeshDrawTechnique.MESH, MyModelsEnum.Rifle, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\Weapons\\WeaponsSmall\\WeaponSmall_Shotgun", MyMeshDrawTechnique.MESH, MyModelsEnum.Shotgun, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\Weapons\\WeaponsSmall\\WeaponSmall_Sniper", MyMeshDrawTechnique.MESH, MyModelsEnum.Sniper, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\Weapons\\WeaponsSmall\\WeaponSmall_UniversalLauncher", MyMeshDrawTechnique.MESH, MyModelsEnum.UniversalLauncher, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\Weapons\\WeaponsSmall\\WeaponSmall_MissileLauncher", MyMeshDrawTechnique.MESH, MyModelsEnum.MissileLauncher, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\Weapons\\WeaponsSmall\\WeaponSmall_MachineGun", MyMeshDrawTechnique.MESH, MyModelsEnum.MachineGun, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + + AddModel(new MyModel("Models2\\Weapons\\WeaponsLarge\\WeaponLarge_MachineGun_barrel", MyMeshDrawTechnique.MESH, MyModelsEnum.LargeShipMachineGunBarrel, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddEntityModels("Models2\\Weapons\\WeaponsLarge\\WeaponLarge_MachineGun_base", MyModelsEnum.LargeShipMachineGunBase, null, MyModelsEnum.LargeShipMachineGunBase_COL, true); + AddModel(new MyModel("Models2\\Weapons\\WeaponsLarge\\WeaponLarge_MissileLauncher_9_barrel", MyMeshDrawTechnique.MESH, MyModelsEnum.LargeShipMissileLauncher9Barrel, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddEntityModels("Models2\\Weapons\\WeaponsLarge\\WeaponLarge_MissileLauncher_9_base", MyModelsEnum.LargeShipMissileLauncher9Base, null, MyModelsEnum.LargeShipMissileLauncher9Base_COL, true); + AddModel(new MyModel("Models2\\Weapons\\WeaponsLarge\\WeaponLarge_MissileLauncher_4_barrel", MyMeshDrawTechnique.MESH, MyModelsEnum.LargeShipMissileLauncher4Barrel, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddEntityModels("Models2\\Weapons\\WeaponsLarge\\WeaponLarge_MissileLauncher_4_base", MyModelsEnum.LargeShipMissileLauncher4Base, null, MyModelsEnum.LargeShipMissileLauncher4Base_COL, true); + AddModel(new MyModel("Models2\\Weapons\\WeaponsLarge\\WeaponLarge_MissileLauncher_6_barrel", MyMeshDrawTechnique.MESH, MyModelsEnum.LargeShipMissileLauncher6Barrel, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddEntityModels("Models2\\Weapons\\WeaponsLarge\\WeaponLarge_MissileLauncher_6_base", MyModelsEnum.LargeShipMissileLauncher6Base, null, MyModelsEnum.LargeShipMissileLauncher6Base_COL, true); + AddModel(new MyModel("Models2\\Weapons\\WeaponsLarge\\WeaponLarge_Ciws_barrel", MyMeshDrawTechnique.MESH, MyModelsEnum.LargeShipCiwsBarrel, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddEntityModels("Models2\\Weapons\\WeaponsLarge\\WeaponLarge_Ciws_base", MyModelsEnum.LargeShipCiwsBase, null, MyModelsEnum.LargeShipCiwsBase_COL, true); + AddModel(new MyModel("Models2\\Weapons\\WeaponsLarge\\WeaponLarge_Autocannon_barrel", MyMeshDrawTechnique.MESH, MyModelsEnum.LargeShipAutocannonBarrel, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddEntityModels("Models2\\Weapons\\WeaponsLarge\\WeaponLarge_Autocannon_base", MyModelsEnum.LargeShipAutocannonBase, null, MyModelsEnum.LargeShipAutocannonBase_COL, true); + + AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Projectile_AsteroidKiller", MyMeshDrawTechnique.MESH, MyModelsEnum.AsteroidKiller, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Projectile_DecoyFlare", MyMeshDrawTechnique.MESH, MyModelsEnum.DecoyFlare, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Projectile_DirectionalExplosive", MyMeshDrawTechnique.MESH, MyModelsEnum.DirectionalExplosive, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Projectile_FlashBomb", MyMeshDrawTechnique.MESH, MyModelsEnum.FlashBomb, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Projectile_GravityBomb", MyMeshDrawTechnique.MESH, MyModelsEnum.GravityBomb, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Projectile_Hologram", MyMeshDrawTechnique.MESH, MyModelsEnum.Hologram, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Projectile_IlluminatingShell", MyMeshDrawTechnique.MESH, MyModelsEnum.IlluminatingShell, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Mine", MyMeshDrawTechnique.MESH, MyModelsEnum.MineBasic, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Mine_Homing", MyMeshDrawTechnique.MESH, MyModelsEnum.MineSmart, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Projectile_Missile01", MyMeshDrawTechnique.MESH, MyModelsEnum.Missile, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Projectile_RemoteBomb", MyMeshDrawTechnique.MESH, MyModelsEnum.RemoteBomb, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Projectile_RemoteCamera", MyMeshDrawTechnique.MESH, MyModelsEnum.RemoteCamera, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Projectile_SmokeBomb", MyMeshDrawTechnique.MESH, MyModelsEnum.SmokeBomb, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Projectile_SphereExplosive", MyMeshDrawTechnique.MESH, MyModelsEnum.SphereExplosive, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\Weapons\\Projectiles\\Projectile_TimeBomb", MyMeshDrawTechnique.MESH, MyModelsEnum.TimeBomb, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\Weapons\\Equipment\\DrillCrusher_base", MyMeshDrawTechnique.MESH, MyModelsEnum.Drill_Base, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\Weapons\\Equipment\\DrillCrusher_gear1", MyMeshDrawTechnique.MESH, MyModelsEnum.Drill_Gear1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\Weapons\\Equipment\\DrillCrusher_gear2", MyMeshDrawTechnique.MESH, MyModelsEnum.Drill_Gear2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\Weapons\\Equipment\\DrillCrusher_gear3", MyMeshDrawTechnique.MESH, MyModelsEnum.Drill_Gear3, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\Weapons\\Equipment\\DrillLaser", MyMeshDrawTechnique.MESH, MyModelsEnum.LaserDrill)); + AddModel(new MyModel("Models2\\Weapons\\Equipment\\DrillNuclear", MyMeshDrawTechnique.MESH, MyModelsEnum.NuclearDrill)); + AddModel(new MyModel("Models2\\Weapons\\Equipment\\DrillNuclearHead", MyMeshDrawTechnique.MESH, MyModelsEnum.NuclearDrillHead)); + AddModel(new MyModel("Models2\\Weapons\\Equipment\\DrillPressure", MyMeshDrawTechnique.MESH, MyModelsEnum.PressureDrill)); + AddModel(new MyModel("Models2\\Weapons\\Equipment\\DrillSaw", MyMeshDrawTechnique.MESH, MyModelsEnum.SawDrill)); + AddModel(new MyModel("Models2\\Weapons\\Equipment\\DrillThermal", MyMeshDrawTechnique.MESH, MyModelsEnum.ThermalDrill)); + AddModel(new MyModel("Models2\\Weapons\\Equipment\\DrillThermalHead", MyMeshDrawTechnique.MESH, MyModelsEnum.ThermalDrillHead)); + AddModel(new MyModel("Models2\\Weapons\\Equipment\\HarvestingDevice_nozzle", MyMeshDrawTechnique.MESH, MyModelsEnum.HarvestingHead, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\Weapons\\Equipment\\HarvestingDevice_tube", MyMeshDrawTechnique.MESH, MyModelsEnum.HarvestingTube, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Jacknife", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Jacknife)); + //AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Jacknife_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Jacknife_LOD1)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Doon", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Doon)); + //AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Doon_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Doon_LOD1)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Hammer", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Hammer)); + //AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Hammer_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Hammer_LOD1)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_ORG", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_ORG)); + //AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_ORG_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_ORG_LOD1)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_ORG_NoPaint", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_ORG_NoPaint)); + //AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_ORG_NoPaint_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_ORG_NoPaint_LOD1)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_YG_Closed", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_YG_Closed)); + //AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_YG_Closed_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_YG_Closed_LOD1)); + + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip02", MyMeshDrawTechnique.MESH, MyModelsEnum.Enforcer)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip03", MyMeshDrawTechnique.MESH, MyModelsEnum.Kammler)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip04", MyMeshDrawTechnique.MESH, MyModelsEnum.Gettysburg)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip10", MyMeshDrawTechnique.MESH, MyModelsEnum.Tracer)); + AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_Default", MyMeshDrawTechnique.MESH, MyModelsEnum.MinerShip_Generic_CockpitInterior)); + AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_Default_glass", MyMeshDrawTechnique.MESH, MyModelsEnum.MinerShip_Generic_CockpitGlass)); + AddModel(new MyModel("Models2\\ObjectsStatic\\Debris\\DebrisField01", MyMeshDrawTechnique.MESH, MyModelsEnum.DebrisField)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Container01a_Red", MyMeshDrawTechnique.MESH, MyModelsEnum.Standard_Container_1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Container01b_Blue", MyMeshDrawTechnique.MESH, MyModelsEnum.Standard_Container_2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Container01c_Grey", MyMeshDrawTechnique.MESH, MyModelsEnum.Standard_Container_3, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Container01d_White", MyMeshDrawTechnique.MESH, MyModelsEnum.Standard_Container_4, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\RockDebris01", MyMeshDrawTechnique.MESH, MyModelsEnum.ExplosionDebrisVoxel, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Tank01", MyMeshDrawTechnique.MESH, MyModelsEnum.cistern, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\TubeBundle01", MyMeshDrawTechnique.MESH, MyModelsEnum.pipe_bundle, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\UtilityVehicle01", MyMeshDrawTechnique.MESH, MyModelsEnum.UtilityVehicle_1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris01", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris1, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris02", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris2, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris03", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris3, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris04", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris4, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris05", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris5, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris06", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris6, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris07", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris7, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris08", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris8, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris09", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris9, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris10", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris10, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris11", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris11, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris12", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris12, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris13", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris13, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris14", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris14, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris15", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris15, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris16", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris16, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris17", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris17, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris18", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris18, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris19", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris19, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris20", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris20, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris21", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris21, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris22", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris22, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris23", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris23, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris24", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris24, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris25", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris25, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris26", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris26, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris27", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris27, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris28", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris28, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris29", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris29, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris30", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris30, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris31", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris31, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Debris\\Debris32_Pilot", MyMeshDrawTechnique.MESH, MyModelsEnum.Debris32_pilot, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\Editor\\EditorGizmo_Rotation", MyMeshDrawTechnique.MESH, MyModelsEnum.GizmoRotation, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + AddModel(new MyModel("Models2\\Editor\\EditorGizmo_Translation", MyMeshDrawTechnique.MESH, MyModelsEnum.GizmoTranslation, MyFakes.UNLOAD_OPTIMIZATION_KEEP_COMMON_MODELS)); + + AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_EAC_02", MyMeshDrawTechnique.MESH, MyModelsEnum.EAC02_Cockpit)); + AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_EAC_02_glass", MyMeshDrawTechnique.MESH, MyModelsEnum.EAC02_Cockpit_glass)); + AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_EAC_03", MyMeshDrawTechnique.MESH, MyModelsEnum.EAC03_Cockpit)); + AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_EAC_03_glass", MyMeshDrawTechnique.MESH, MyModelsEnum.EAC03_Cockpit_glass)); + AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_EAC_04", MyMeshDrawTechnique.MESH, MyModelsEnum.EAC04_Cockpit)); + AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_EAC_04_glass", MyMeshDrawTechnique.MESH, MyModelsEnum.EAC04_Cockpit_glass)); + AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_EAC_05", MyMeshDrawTechnique.MESH, MyModelsEnum.EAC05_Cockpit)); + AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_EAC_05_glass", MyMeshDrawTechnique.MESH, MyModelsEnum.EAC05_Cockpit_glass)); + + AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_OmniCorp_01", MyMeshDrawTechnique.MESH, MyModelsEnum.OmniCorp01_Cockpit)); + AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_OmniCorp_01_glass", MyMeshDrawTechnique.MESH, MyModelsEnum.OmniCorp01_Cockpit_glass)); + AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_OmniCorp_03", MyMeshDrawTechnique.MESH, MyModelsEnum.OmniCorp03_Cockpit)); + AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_OmniCorp_03_glass", MyMeshDrawTechnique.MESH, MyModelsEnum.OmniCorp03_Cockpit_glass)); + AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_OmniCorp_04", MyMeshDrawTechnique.MESH, MyModelsEnum.OmniCorp04_Cockpit)); + AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_OmniCorp_04_glass", MyMeshDrawTechnique.MESH, MyModelsEnum.OmniCorp04_Cockpit_glass)); + AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_OmniCorp_EAC_01", MyMeshDrawTechnique.MESH, MyModelsEnum.OmniCorp_EAC01_Cockpit)); + AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_OmniCorp_EAC_glass_01", MyMeshDrawTechnique.MESH, MyModelsEnum.OmniCorp_EAC01_Cockpit_glass)); + + AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_CN_03", MyMeshDrawTechnique.MESH, MyModelsEnum.Cockpit_CN_03)); + AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_CN_03_glass", MyMeshDrawTechnique.MESH, MyModelsEnum.Cockpit_CN_03_glass)); + + AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_SS_04", MyMeshDrawTechnique.MESH, MyModelsEnum.Cockpit_SS_04)); + AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_SS_04_glass", MyMeshDrawTechnique.MESH, MyModelsEnum.Cockpit_SS_04_glass)); + AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_Razorclaw", MyMeshDrawTechnique.MESH, MyModelsEnum.Cockpit_Razorclaw)); + AddModel(new MyModel("Models2\\Ships\\Cockpits\\Cockpit_Razorclaw_glass", MyMeshDrawTechnique.MESH, MyModelsEnum.Cockpit_Razorclaw_glass)); + + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip01", MyMeshDrawTechnique.MESH, MyModelsEnum.Liberator)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip05", MyMeshDrawTechnique.MESH, MyModelsEnum.Virginia)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip06", MyMeshDrawTechnique.MESH, MyModelsEnum.Baer)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip07", MyMeshDrawTechnique.MESH, MyModelsEnum.Hewer)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip08", MyMeshDrawTechnique.MESH, MyModelsEnum.Razorclaw)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip09", MyMeshDrawTechnique.MESH, MyModelsEnum.Greiser)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Hawk", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Hawk)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Phoenix", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Phoenix)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Leviathan", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Leviathan)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Rockheater", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Rockheater)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_SteelHead", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_SteelHead)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Talon", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Talon)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Stanislav", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Stanislav)); + + //Debug models + AddModel(new MyModel("Models2\\Debug\\plane_10_50", MyMeshDrawTechnique.MESH, MyModelsEnum.plane_10_50)); + AddModel(new MyModel("Models2\\Debug\\plane_50_20", MyMeshDrawTechnique.MESH, MyModelsEnum.plane_50_20)); + AddModel(new MyModel("Models2\\Debug\\plane_100_10", MyMeshDrawTechnique.MESH, MyModelsEnum.plane_100_10)); + AddModel(new MyModel("Models2\\Debug\\plane_128_70", MyMeshDrawTechnique.MESH, MyModelsEnum.plane_128_70)); + AddModel(new MyModel("Models2\\Debug\\plane_100_50", MyMeshDrawTechnique.MESH, MyModelsEnum.plane_100_50)); + AddModel(new MyModel("Models2\\Debug\\plane_150_50", MyMeshDrawTechnique.MESH, MyModelsEnum.plane_150_50)); + AddModel(new MyModel("Models2\\Debug\\plane_255_70", MyMeshDrawTechnique.MESH, MyModelsEnum.plane_255_70)); + AddModel(new MyModel("Models2\\Debug\\plane_300_70", MyMeshDrawTechnique.MESH, MyModelsEnum.plane_300_70)); + AddModel(new MyModel("Models2\\Debug\\plane_800_10", MyMeshDrawTechnique.MESH, MyModelsEnum.plane_800_10)); + AddModel(new MyModel("Models2\\Debug\\plane_800_70", MyMeshDrawTechnique.MESH, MyModelsEnum.plane_800_70)); + AddModel(new MyModel("Models2\\Debug\\Sphere_smooth", MyMeshDrawTechnique.MESH, MyModelsEnum.sphere_smooth)); + + AddModel(new MyModel("Models2\\Debug\\BoxHiRes", MyMeshDrawTechnique.MESH, MyModelsEnum.BoxHiRes)); + AddModel(new MyModel("Models2\\Debug\\BoxLowRes", MyMeshDrawTechnique.MESH, MyModelsEnum.BoxLowRes)); + AddModel(new MyModel("Models2\\Debug\\Sphere", MyMeshDrawTechnique.MESH, MyModelsEnum.Sphere)); + AddModel(new MyModel("Models2\\Debug\\Sphere_low", MyMeshDrawTechnique.MESH, MyModelsEnum.Sphere_low)); + AddModel(new MyModel("Models2\\Debug\\Cone", MyMeshDrawTechnique.MESH, MyModelsEnum.Cone)); + AddModel(new MyModel("Models2\\Debug\\Hemisphere", MyMeshDrawTechnique.MESH, MyModelsEnum.Hemisphere)); + AddModel(new MyModel("Models2\\Debug\\Hemisphere_low", MyMeshDrawTechnique.MESH, MyModelsEnum.Hemisphere_low)); + AddModel(new MyModel("Models2\\Debug\\Capsule", MyMeshDrawTechnique.MESH, MyModelsEnum.Capsule)); + + + AddEntityModels("Models2\\Prefabs\\05_Details\\02_Lights\\default_light_0", MyModelsEnum.default_light_0, null, MyModelsEnum.default_light_0_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\02_Lights\\p521_a01_light1", MyModelsEnum.p521_a01_light1, null, MyModelsEnum.p521_a01_light1_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\02_Lights\\p521_a02_light2", MyModelsEnum.p521_a02_light2, null, MyModelsEnum.p521_a02_light2_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\02_Lights\\p521_a03_light3", MyModelsEnum.p521_a03_light3, null, MyModelsEnum.p521_a03_light3_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\02_Lights\\p521_a04_light4", MyModelsEnum.p521_a04_light4, null, MyModelsEnum.p521_a04_light4_COL); + + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\05_Particles\\default_particles_0", MyMeshDrawTechnique.MESH, MyModelsEnum.default_particlesprefab_0)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\05_Particles\\p551_a01_particles", MyMeshDrawTechnique.MESH, MyModelsEnum.p551_a01_particles)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\05_Particles\\p551_b01_particles", MyMeshDrawTechnique.MESH, MyModelsEnum.p551_b01_particles)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\05_Particles\\p551_c01_particles", MyMeshDrawTechnique.MESH, MyModelsEnum.p551_c01_particles)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\05_Particles\\p551_d01_particles", MyMeshDrawTechnique.MESH, MyModelsEnum.p551_d01_particles)); + + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\06_Sounds\\default_sound_0", MyMeshDrawTechnique.MESH, MyModelsEnum.default_soundprefab_0)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\06_Sounds\\p561_a01_sound", MyMeshDrawTechnique.MESH, MyModelsEnum.p561_a01_sound)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\06_Sounds\\p561_b01_sound", MyMeshDrawTechnique.MESH, MyModelsEnum.p561_b01_sound)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\06_Sounds\\p561_c01_sound", MyMeshDrawTechnique.MESH, MyModelsEnum.p561_c01_sound)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\06_Sounds\\p561_d01_sound", MyMeshDrawTechnique.MESH, MyModelsEnum.p561_d01_sound)); + + AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a01_billboard", MyModelsEnum.p511_a01_billboard, MyModelsEnum.p511_a01_billboard_LOD1, MyModelsEnum.p511_a01_billboard_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a02_billboard", MyModelsEnum.p511_a02_billboard, MyModelsEnum.p511_a02_billboard_LOD1, MyModelsEnum.p511_a02_billboard_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a03_billboard", MyModelsEnum.p511_a03_billboard, MyModelsEnum.p511_a03_billboard_LOD1, MyModelsEnum.p511_a03_billboard_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a04_billboard", MyModelsEnum.p511_a04_billboard, MyModelsEnum.p511_a04_billboard_LOD1, MyModelsEnum.p511_a04_billboard_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a05_billboard", MyModelsEnum.p511_a05_billboard, MyModelsEnum.p511_a05_billboard_LOD1, MyModelsEnum.p511_a05_billboard_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a06_billboard", MyModelsEnum.p511_a06_billboard, MyModelsEnum.p511_a06_billboard_LOD1, MyModelsEnum.p511_a06_billboard_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a07_billboard", MyModelsEnum.p511_a07_billboard, MyModelsEnum.p511_a07_billboard_LOD1, MyModelsEnum.p511_a07_billboard_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a08_billboard", MyModelsEnum.p511_a08_billboard, MyModelsEnum.p511_a08_billboard_LOD1, MyModelsEnum.p511_a08_billboard_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a09_billboard", MyModelsEnum.p511_a09_billboard, MyModelsEnum.p511_a09_billboard_LOD1, MyModelsEnum.p511_a09_billboard_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a10_billboard", MyModelsEnum.p511_a10_billboard, MyModelsEnum.p511_a10_billboard_LOD1, MyModelsEnum.p511_a10_billboard_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a11_billboard", MyModelsEnum.p511_a11_billboard, MyModelsEnum.p511_a11_billboard_LOD1, MyModelsEnum.p511_a11_billboard_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a12_billboard", MyModelsEnum.p511_a12_billboard, MyModelsEnum.p511_a12_billboard_LOD1, MyModelsEnum.p511_a12_billboard_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a14_billboard", MyModelsEnum.p511_a14_billboard, MyModelsEnum.p511_a14_billboard_LOD1, MyModelsEnum.p511_a14_billboard_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a15_billboard", MyModelsEnum.p511_a15_billboard, MyModelsEnum.p511_a15_billboard_LOD1, MyModelsEnum.p511_a15_billboard_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a16_billboard", MyModelsEnum.p511_a16_billboard, MyModelsEnum.p511_a16_billboard_LOD1, MyModelsEnum.p511_a16_billboard_COL); + + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_a01_sign1", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_a01_sign1)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_a02_sign2", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_a02_sign2)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_a03_sign3", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_a03_sign3)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_a04_sign4", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_a04_sign4)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_a05_sign5", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_a05_sign5)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_a06_sign6", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_a06_sign6)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_a07_sign7", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_a07_sign7)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_a08_sign8", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_a08_sign8)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_a09_sign9", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_a09_sign9)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_a10_sign10", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_a10_sign10)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_a11_sign11", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_a11_sign11)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_a12_sign12", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_a12_sign12)); + + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_administrative_area", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_administrative_area)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_armory", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_armory)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_arrow_L", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_arrow_L)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_arrow_R", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_arrow_R)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_arrow_str", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_arrow_str)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_cargo_bay", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_cargo_bay)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_command_center", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_command_center)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_commercial_area", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_commercial_area)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_communications", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_communications)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_defenses", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_defenses)); + AddEntityModels("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_docks", MyModelsEnum.p531_c_docks, null, MyModelsEnum.p531_c_docks_COL); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_emergency_exit", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_emergency_exit)); + AddEntityModels("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_engineering_area", MyModelsEnum.p531_c_engineering_area, null, MyModelsEnum.p531_c_engineering_area_COL); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_exit", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_exit)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_experimental_labs", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_experimental_labs)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_foundry", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_foundry)); + AddEntityModels("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_habitats", MyModelsEnum.p531_c_habitats, null, MyModelsEnum.p531_c_habitats_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_hangars", MyModelsEnum.p531_c_hangars, null, MyModelsEnum.p531_c_hangars_COL); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_industrial_area", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_industrial_area)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_landing_bay", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_landing_bay)); + AddEntityModels("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_maintenance", MyModelsEnum.p531_c_maintenance, null, MyModelsEnum.p531_c_maintenance_COL); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_military_area", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_military_area)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_mines", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_mines)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_ore_processing", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_ore_processing)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_outer_area", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_outer_area)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_prison", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_prison)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_public_area", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_public_area)); + AddEntityModels("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_reactor", MyModelsEnum.p531_c_reactor, null, MyModelsEnum.p531_c_reactor_COL); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_research", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_research)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_restricted_area", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_restricted_area)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_security", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_security)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_sign", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_sign)); + AddEntityModels("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_storage", MyModelsEnum.p531_c_storage, null, MyModelsEnum.p531_c_storage_COL); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_technical_area", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_technical_area)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\03_Signs\\531_c_trade_port", MyMeshDrawTechnique.MESH, MyModelsEnum.p531_c_trade_port)); + + + //AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\01\\p221a02_chamber_v2", MyMeshDrawTechnique.MESH, MyModelsEnum.p221a02_chamber_v2)); + AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\01\\p221a02_chamber_v2", MyModelsEnum.p221a02_chamber_v2, null, MyModelsEnum.p221a02_chamber_v2_COL); + AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\02\\p221b02_chamber_v2", MyMeshDrawTechnique.MESH, MyModelsEnum.p221b02_chamber_v2)); + AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\02\\p221b02_chamber_v2_COL", MyMeshDrawTechnique.MESH, MyModelsEnum.p221b02_chamber_v2_COL)); + + //Used col model from Arena prefab because of bad collision model of this one + //AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\03\\p221c02_chamber_v2", MyModelsEnum.p221c02_chamber_v2, MyModelsEnum.p221c02_chamber_v2_LOD1, MyModelsEnum.p221c01_chamber_v1_COL); + AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\03\\p221c02_chamber_v2", MyMeshDrawTechnique.MESH, MyModelsEnum.p221c02_chamber_v2)); + AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\03\\p221c02_chamber_v2_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p221c02_chamber_v2_LOD1)); + m_models[(int)MyModelsEnum.p221c02_chamber_v2_COL] = m_models[(int)MyModelsEnum.p221c01_chamber_v1_COL]; + + AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\04\\p221d02_chamber_v2", MyModelsEnum.p221d02_chamber_v2, MyModelsEnum.p221d02_chamber_v2_LOD1, MyModelsEnum.p221d02_chamber_v2_COL); + AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\05\\p221e02_chamber_v2", MyMeshDrawTechnique.MESH, MyModelsEnum.p221e02_chamber_v2)); + AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\05\\p221e02_chamber_v2_COL", MyMeshDrawTechnique.MESH, MyModelsEnum.p221e02_chamber_v2_COL)); + + //AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\01\\p221a01_chamber_v1_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p221a01_chamber_v1_LOD1)); + //AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\02\\p221b01_chamber_v1_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p221b01_chamber_v1_LOD1)); + //AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\03\\p221c01_chamber_v1_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p221c01_chamber_v1_LOD1)); + //AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\04\\p221d01_chamber_v1_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p221d01_chamber_v1_LOD1)); + //AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\05\\p221e01_chamber_v1_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p221e01_chamber_v1_LOD1)); + + AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\01\\p221a02_chamber_v2_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p221a02_chamber_v2_LOD1)); + AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\02\\p221b02_chamber_v2_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p221b02_chamber_v2_LOD1)); + //AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\03\\p221c02_chamber_v2_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p221c02_chamber_v2_LOD1)); + //AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\04\\p221d02_chamber_v2_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p221d02_chamber_v2_LOD1)); + AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\02_Chambers\\05\\p221e02_chamber_v2_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p221e02_chamber_v2_LOD1)); + + AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\01\\p130a01_a_straight_10m", MyModelsEnum.p130a01_a_straight_10m, null, MyModelsEnum.p130a01_a_straight_10m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\01\\p130a02_a_straight_30m", MyModelsEnum.p130a02_a_straight_30m, MyModelsEnum.p130a02_a_straight_30m_LOD1, MyModelsEnum.p130a02_a_straight_30m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\02\\p130b01_b_straight_10m", MyModelsEnum.p130b01_b_straight_10m, null, MyModelsEnum.p130b01_b_straight_10m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\02\\p130b02_b_straight_30m", MyModelsEnum.p130b02_b_straight_30m, MyModelsEnum.p130b02_b_straight_30m_LOD1, MyModelsEnum.p130b02_b_straight_30m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\03\\p130c01_c_straight_10m", MyModelsEnum.p130c01_c_straight_10m, null, MyModelsEnum.p130c01_c_straight_10m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\03\\p130c02_c_straight_30m", MyModelsEnum.p130c02_c_straight_30m, MyModelsEnum.p130c02_c_straight_30m_LOD1, MyModelsEnum.p130c02_c_straight_30m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\04\\p130d01_d_straight_10m", MyModelsEnum.p130d01_d_straight_10m, null, MyModelsEnum.p130d01_d_straight_10m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\04\\p130d02_d_straight_30m", MyModelsEnum.p130d02_d_straight_30m, MyModelsEnum.p130d02_d_straight_30m_LOD1, MyModelsEnum.p130d02_d_straight_30m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\05\\p130e01_e_straight_10m", MyModelsEnum.p130e01_e_straight_10m, null, MyModelsEnum.p130e01_e_straight_10m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\05\\p130e02_e_straight_30m", MyModelsEnum.p130e02_e_straight_30m, MyModelsEnum.p130e02_e_straight_30m_LOD1, MyModelsEnum.p130e02_e_straight_30m_COL); + + AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\04\\p321d01_big_solar_panel", MyModelsEnum.p321d01_big_solar_panel, MyModelsEnum.p321d01_big_solar_panel_LOD1, MyModelsEnum.p321d01_big_solar_panel_COL); + //AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\04\\p321d01_big_solar_panel", MyMeshDrawTechnique.MESH, MyModelsEnum.p321d01_big_solar_panel)); + + AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\01\\p321b01_solar_panel", MyModelsEnum.p321b01_solar_panel, MyModelsEnum.p321b01_solar_panel_LOD1, MyModelsEnum.p321b01_solar_panel_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\01\\p321c01_solar_panel", MyModelsEnum.p321c01_solar_panel, MyModelsEnum.p321c01_solar_panel_LOD1, MyModelsEnum.p321c01_solar_panel_COL); + + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\04\\05_Junction\\p413_d02_junction_t_vertical", MyModelsEnum.p413_d02_junction_t_vertical, MyModelsEnum.p413_d02_junction_t_vertical_LOD1, MyModelsEnum.p413_d02_junction_t_vertical_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\04\\05_Junction\\p413_d04_junction_x_vertical", MyModelsEnum.p413_d04_junction_x_vertical, MyModelsEnum.p413_d04_junction_x_vertical_LOD1, MyModelsEnum.p413_d04_junction_x_vertical_COL); + + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\02_Turn90\\01_230m\\p412_f11_turn_90_up_230m", MyModelsEnum.p412_f11_turn_90_up_230m, MyModelsEnum.p412_f11_turn_90_up_230m_LOD1, MyModelsEnum.p412_f11_turn_90_up_230m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\02_Turn90\\01_230m\\p412_f12_turn_90_left_230m", MyModelsEnum.p412_f12_turn_90_left_230m, MyModelsEnum.p412_f12_turn_90_left_230m_LOD1, MyModelsEnum.p412_f12_turn_90_left_230m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\02_Turn90\\01_230m\\p412_f13_turn_90_right_230m", MyModelsEnum.p412_f13_turn_90_right_230m, MyModelsEnum.p412_f13_turn_90_right_230m_LOD1, MyModelsEnum.p412_f13_turn_90_right_230m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\02_Turn90\\01_230m\\p412_f14_turn_90_down_230m", MyModelsEnum.p412_f14_turn_90_down_230m, MyModelsEnum.p412_f14_turn_90_down_230m_LOD1, MyModelsEnum.p412_f14_turn_90_down_230m_COL); + + //AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\01_Straight\\p411_f04_straight_4", MyMeshDrawTechnique.MESH, MyModelsEnum.p411_f04_straight_4)); + //AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\01_Straight\\p411_f05_straight_5", MyMeshDrawTechnique.MESH, MyModelsEnum.p411_f05_straight_5)); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\01_Straight\\p411_f04_straight_4", MyModelsEnum.p411_f04_straight_4, null, MyModelsEnum.p411_f04_straight_4_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\01_Straight\\p411_f05_straight_5", MyModelsEnum.p411_f05_straight_5, null, MyModelsEnum.p411_f05_straight_5_COL); + + //AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\01_Tunnel\\07\\01_Straight\\p411_g05_straight_5", MyMeshDrawTechnique.MESH, MyModelsEnum.p411_g05_straight_5)); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\07\\01_Straight\\p411_g05_straight_5", MyModelsEnum.p411_g05_straight_5, MyModelsEnum.p411_g05_straight_5_LOD1, MyModelsEnum.p411_g05_straight_5_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\06\\04_Entrance\\p414_f01_entrance_60m", MyModelsEnum.p414_f01_entrance_60m, MyModelsEnum.p414_f01_entrance_60m_LOD1, MyModelsEnum.p414_f01_entrance_60m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\01_Tunnel\\07\\04_Entrance\\p414_g01_entrance_60m", MyModelsEnum.p414_g01_entrance_60m, MyModelsEnum.p414_g01_entrance_60m_LOD1, MyModelsEnum.p414_g01_entrance_60m_COL); + + AddEntityModels("Models2\\Prefabs\\05_Details\\07_traffic_signs\\p571_a01_traffic_sign", MyModelsEnum.p571_a01_traffic_sign, null, MyModelsEnum.p571_a01_traffic_sign_COL); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\07_traffic_signs\\p571_b01_traffic_sign", MyMeshDrawTechnique.MESH, MyModelsEnum.p571_b01_traffic_sign)); + AddEntityModels("Models2\\Prefabs\\05_Details\\07_traffic_signs\\p571_box01_traffic_sign", MyModelsEnum.p571_box01_traffic_sign, null, MyModelsEnum.p571_box01_traffic_sign_COL); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\07_traffic_signs\\p571_box02_traffic_sign", MyMeshDrawTechnique.MESH, MyModelsEnum.p571_box02_traffic_sign)); + AddEntityModels("Models2\\Prefabs\\05_Details\\07_traffic_signs\\p571_c01_traffic_sign", MyModelsEnum.p571_c01_traffic_sign, null, MyModelsEnum.p571_c01_traffic_sign_COL); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\07_traffic_signs\\p571_d01_traffic_sign", MyMeshDrawTechnique.MESH, MyModelsEnum.p571_d01_traffic_sign)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\07_traffic_signs\\p571_e01_traffic_sign", MyMeshDrawTechnique.MESH, MyModelsEnum.p571_e01_traffic_sign)); + AddEntityModels("Models2\\Prefabs\\05_Details\\07_traffic_signs\\p571_f01_traffic_sign", MyModelsEnum.p571_f01_traffic_sign, null, MyModelsEnum.p571_f01_traffic_sign_COL); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\07_traffic_signs\\p571_g01_traffic_sign", MyMeshDrawTechnique.MESH, MyModelsEnum.p571_g01_traffic_sign)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\07_traffic_signs\\p571_h01_traffic_sign", MyMeshDrawTechnique.MESH, MyModelsEnum.p571_h01_traffic_sign)); + AddEntityModels("Models2\\Prefabs\\05_Details\\07_traffic_signs\\p571_i01_traffic_sign", MyModelsEnum.p571_i01_traffic_sign, null, MyModelsEnum.p571_i01_traffic_sign_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\07_traffic_signs\\p571_j01_traffic_sign", MyModelsEnum.p571_j01_traffic_sign, null, MyModelsEnum.p571_j01_traffic_sign_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\07_traffic_signs\\p571_k01_traffic_sign", MyModelsEnum.p571_k01_traffic_sign, null, MyModelsEnum.p571_k01_traffic_sign_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\07_traffic_signs\\p571_l01_traffic_sign", MyModelsEnum.p571_l01_traffic_sign, null, MyModelsEnum.p571_l01_traffic_sign_COL); + + AddEntityModels("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\05_Temple\\01\\p385_a01_temple_900m", MyModelsEnum.p385_a01_temple_900m, MyModelsEnum.p385_a01_temple_900m_LOD1, MyModelsEnum.p385_a01_temple_900m_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\03_Church\\01\\p383_a01_church", MyModelsEnum.p383_a01_church, MyModelsEnum.p383_a01_church_LOD1, MyModelsEnum.p383_a01_church_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\03_LifeSupport\\04_FoodGrowing\\01\\p334_a01_food_grow", MyModelsEnum.p334_a01_food_grow, MyModelsEnum.p334_a01_food_grow_LOD01, MyModelsEnum.p334_a01_food_grow_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\06_BioExperiment\\01\\p345_a01_bio_exp", MyModelsEnum.p345_a01_bio_exp, MyModelsEnum.p345_a01_bio_exp_LOD1, MyModelsEnum.p345_a01_bio_exp_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\06_BioExperiment\\01\\p345_a01_bio_exp_center", MyModelsEnum.p345_a01_bio_exp_center, MyModelsEnum.p345_a01_bio_exp_center_LOD1, MyModelsEnum.p345_a01_bio_exp_center_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\06_BioExperiment\\01\\p345_a01_bio_exp_tanks", MyModelsEnum.p345_a01_bio_exp_tanks, MyModelsEnum.p345_a01_bio_exp_tanks_LOD1, MyModelsEnum.p345_a01_bio_exp_tanks_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\07_BioMachine\\01\\p345_a01_bio_mach_exp", MyModelsEnum.p345_a01_bio_mach_exp, MyModelsEnum.p345_a01_bio_mach_exp_LOD1, MyModelsEnum.p345_a01_bio_mach_exp_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\08_Recycle\\01\\p345_a01_recycle", MyModelsEnum.p345_a01_recycle, MyModelsEnum.p345_a01_recycle_LOD1, MyModelsEnum.p345_a01_recycle_COL); + + //AddModel(new MyModel("Models2\\Prefabs\\05_Details\\04_Other\\541_escape_pod", MyMeshDrawTechnique.MESH, MyModelsEnum.p541_escape_pod)); + AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\541_escape_pod", MyModelsEnum.p541_escape_pod, MyModelsEnum.p541_escape_pod_LOD1, MyModelsEnum.p541_escape_pod_COL); + + AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\541_escape_pod_base", MyModelsEnum.p541_escape_pod_base, MyModelsEnum.p541_escape_pod_base_LOD1, MyModelsEnum.p541_escape_pod_base_COL); + + + //AddModel(new MyModel("Models2\\Prefabs\\05_Details\\04_Other\\541_ventilator_body", MyMeshDrawTechnique.MESH, MyModelsEnum.p541_ventilator_body)); + AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\541_ventilator_body", MyModelsEnum.p541_ventilator_body, MyModelsEnum.p541_ventilator_body_LOD1, MyModelsEnum.p541_ventilator_body_COL); + + AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\541_ventilator_propeller", MyModelsEnum.p541_ventilator_propeller, null, MyModelsEnum.p541_ventilator_propeller_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\541_ventilator_propeller_big", MyModelsEnum.p541_ventilator_propeller_big, MyModelsEnum.p541_ventilator_propeller_big_LOD1, MyModelsEnum.p541_ventilator_propeller_big_COL); + + AddModel(new MyModel("Models2\\Prefabs\\06_Custom\\SimpleObject", MyMeshDrawTechnique.MESH, MyModelsEnum.SimpleObject)); + //AddModel(new MyModel("Models2\\Prefabs\\06_Custom\\asteroid_test", MyMeshDrawTechnique.MESH, MyModelsEnum.AsteroidPrefabTest)); + AddEntityModels("Models2\\Prefabs\\FoundationFactory", MyModelsEnum.FoundationFactory, null, MyModelsEnum.FoundationFactory_COL); + + AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\09_Tower\\p349_a_tower", MyModelsEnum.p349_a_tower, MyModelsEnum.p349_a_tower_LOD1, MyModelsEnum.p349_a_tower_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\09_Tower\\p349_b_tower", MyModelsEnum.p349_b_tower, MyModelsEnum.p349_b_tower_LOD1, MyModelsEnum.p349_b_tower_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\09_Tower\\p349_c_tower", MyModelsEnum.p349_c_tower, MyModelsEnum.p349_c_tower_LOD1, MyModelsEnum.p349_c_tower_COL); + + //AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\07_Hangars\\01_Small\\01\\p361_a02_hangar_panel", MyMeshDrawTechnique.MESH, MyModelsEnum.p361_a02_hangar_panel)); + + AddEntityModels("Models2\\Prefabs\\05_Details\\03_Signs\\p531_b_faction", MyModelsEnum.p531_b_faction, null, MyModelsEnum.p531_b_faction_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\03_Signs\\p531_b_faction_holo", MyModelsEnum.p531_b_faction_holo, null, MyModelsEnum.p531_b_faction_holo_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\armor_hull", MyModelsEnum.armor_hull, MyModelsEnum.armor_hull_LOD1, MyModelsEnum.armor_hull_COL); + + AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\Fourth_Reich_mothership", MyMeshDrawTechnique.MESH, MyModelsEnum.FourthReichMothership)); + AddModel(new MyModel("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\Fourth_Reich_mothership_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.FourthReichMothership_LOD1)); + AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\Fourth_Reich_mothership_B", MyModelsEnum.FourthReichMothership_B, MyModelsEnum.FourthReichMothership_B_LOD1, MyModelsEnum.FourthReichMothership_B_COL); + + AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\Rus_mothership", MyModelsEnum.RusMothership, MyModelsEnum.RusMothership_LOD1, MyModelsEnum.RusMothership_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\Rus_Mothership_Russian_Hummer", MyModelsEnum.Russian_Mothership_Hummer, MyModelsEnum.Russian_Mothership_Hummer_LOD1, MyModelsEnum.Russian_Mothership_Hummer_COL); + + + AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\01_Flight\\01_LongTermThruster\\01\\p311a01_long_term_thruster_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p311a01_long_term_thruster_LOD1)); + + AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\02\\p321b01_nuclear_reactor_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p321b01_nuclear_reactor_LOD1)); + AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\04_Industry\\02_LoadingBay\\01\\p342_a01_loading_bay_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p342_a01_loading_bay_LOD1)); + AddModel(new MyModel("Models2\\Prefabs\\03_Modules\\04_Industry\\03_OreStorage\\01\\p343_a01_ore_storage_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.p343_a01_ore_storage_LOD1)); + + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Doon_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Doon_LOD1)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Jacknife_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Jacknife_LOD1)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Hammer_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Hammer_LOD1)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_ORG_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_ORG_LOD1)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_ORG_NoPaint_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_ORG_NoPaint_LOD1)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_YG_Closed_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_YG_Closed_LOD1)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Hawk_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Hawk_LOD1)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Phoenix_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Phoenix_LOD1)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Leviathan_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Leviathan_LOD1)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Rockheater_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Rockheater_LOD1)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_SteelHead_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_SteelHead_LOD1)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Talon_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Talon_LOD1)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_Stanislav_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.SmallShip_Stanislav_LOD1)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip01_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.Liberator_LOD1)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip02_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.Enforcer_LOD1)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip03_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.Kammler_LOD1)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip04_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.Gettysburg_LOD1)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip05_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.Virginia_LOD1)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip06_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.Baer_LOD1)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip07_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.Hewer_LOD1)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip08_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.Razorclaw_LOD1)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip09_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.Greiser_LOD1)); + AddModel(new MyModel("Models2\\Ships\\Ships\\SmallShip_MinerShip10_LOD1", MyMeshDrawTechnique.MESH, MyModelsEnum.Tracer_LOD1)); + + // Drones + AddModel(new MyModel("Models2\\Ships\\Drones\\drone_CN", MyMeshDrawTechnique.MESH, MyModelsEnum.DroneCN)); + AddModel(new MyModel("Models2\\Ships\\Drones\\drone_SS", MyMeshDrawTechnique.MESH, MyModelsEnum.DroneSS)); + AddModel(new MyModel("Models2\\Ships\\Drones\\drone_US", MyMeshDrawTechnique.MESH, MyModelsEnum.DroneUS)); + + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212a01_panel_large", MyModelsEnum.p212a01_panel_large, MyModelsEnum.p212a01_panel_large_LOD1, MyModelsEnum.p212a01_panel_large_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212a01_panel_medium", MyModelsEnum.p212a01_panel_medium, MyModelsEnum.p212a01_panel_medium_LOD1, MyModelsEnum.p212a01_panel_medium_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212b02_panel_medium", MyModelsEnum.p212b02_panel_medium, MyModelsEnum.p212b02_panel_medium_LOD1, MyModelsEnum.p212b02_panel_medium_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212c03_panel_medium", MyModelsEnum.p212c03_panel_medium, MyModelsEnum.p212c03_panel_medium_LOD1, MyModelsEnum.p212c03_panel_medium_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212d04_panel_medium", MyModelsEnum.p212d04_panel_medium, null, MyModelsEnum.p212d04_panel_medium_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212e05_panel_medium", MyModelsEnum.p212e05_panel_medium, null, MyModelsEnum.p212e05_panel_medium_COL); + + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212a01_panel_small", MyModelsEnum.p212a01_panel_small, null, MyModelsEnum.p212a01_panel_small_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212b02_panel_small", MyModelsEnum.p212b02_panel_small, null, MyModelsEnum.p212b02_panel_small_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212c03_panel_small", MyModelsEnum.p212c03_panel_small, null, MyModelsEnum.p212c03_panel_small_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212d04_panel_small", MyModelsEnum.p212d04_panel_small, null, MyModelsEnum.p212d04_panel_small_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212e05_panel_small", MyModelsEnum.p212e05_panel_small, null, MyModelsEnum.p212e05_panel_small_COL); + + AddModel(new MyModel("Models2\\ObjectsFloating\\Box_matt_5m", MyMeshDrawTechnique.MESH, MyModelsEnum.MysteriousBox_matt_5m)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Box_spec_5m", MyMeshDrawTechnique.MESH, MyModelsEnum.MysteriousBox_spec_5m)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Box_mid_5m", MyMeshDrawTechnique.MESH, MyModelsEnum.MysteriousBox_mid_5m)); + + + AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\01_Docks\\03\\p341_c01_closed_dock_v1", MyModelsEnum.p341_c01_closed_dock_v1, MyModelsEnum.p341_c01_closed_dock_v1_LOD1, MyModelsEnum.p341_c01_closed_dock_v1_COL); + + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212b02_panel_large", MyModelsEnum.p212b02_panel_large, MyModelsEnum.p212b02_panel_large_LOD1, MyModelsEnum.p212b02_panel_large_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212c03_panel_large", MyModelsEnum.p212c03_panel_large, MyModelsEnum.p212c03_panel_large_LOD1, MyModelsEnum.p212c03_panel_large_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212d04_panel_large", MyModelsEnum.p212d04_panel_large, MyModelsEnum.p212d04_panel_large_LOD1, MyModelsEnum.p212d04_panel_large_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212e05_panel_large", MyModelsEnum.p212e05_panel_large, MyModelsEnum.p212e05_panel_large_LOD1, MyModelsEnum.p212e05_panel_large_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\01_CagePanels\\08_bariers\\p212f01_panel_large", MyModelsEnum.p212f01_panel_large, null, MyModelsEnum.p212f01_panel_large_COL); + + AddEntityModels("Models2\\Prefabs\\03_Modules\\09_Alien\\01_Alien_Gate\\p391_Alien_Gate", MyModelsEnum.Alien_gate, MyModelsEnum.Alien_gate_LOD1, null); + + AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\mship\\mship_body", MyModelsEnum.mship_body, MyModelsEnum.mship_body_LOD1, null); + AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\mship\\mship_engine", MyModelsEnum.mship_engine, MyModelsEnum.mship_engine_LOD1, null); + AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\mship\\mship_shield_back_large_left", MyModelsEnum.mship_shield_back_large_left, MyModelsEnum.mship_shield_back_large_left_LOD1, null); + AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\mship\\mship_shield_back_large_right", MyModelsEnum.mship_shield_back_large_right, MyModelsEnum.mship_shield_back_large_right_LOD1, null); + AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\mship\\mship_shield_back_small_left", MyModelsEnum.mship_shield_back_small_left, MyModelsEnum.mship_shield_back_small_left_LOD1, null); + AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\mship\\mship_shield_back_small_right", MyModelsEnum.mship_shield_back_small_right, MyModelsEnum.mship_shield_back_small_right_LOD1, null); + AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\mship\\mship_shield_front_large_left", MyModelsEnum.mship_shield_front_large_left, MyModelsEnum.mship_shield_front_large_left_LOD1, null); + AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\mship\\mship_shield_front_large_right", MyModelsEnum.mship_shield_front_large_right, MyModelsEnum.mship_shield_front_large_right_LOD1, null); + AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\mship\\mship_shield_front_small_left", MyModelsEnum.mship_shield_front_small_left, MyModelsEnum.mship_shield_front_small_left_LOD1, null); + AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\mship\\mship_shield_front_small_right", MyModelsEnum.mship_shield_front_small_right, MyModelsEnum.mship_shield_front_small_right_LOD1, null); + AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\mship\\mship_shield_front_small02_left", MyModelsEnum.mship_shield_front_small02_left, MyModelsEnum.mship_shield_front_small02_left_LOD1, null); + AddEntityModels("Models2\\ObjectsStatic\\LargeShips\\mship\\mship_shield_front_small02_right", MyModelsEnum.mship_shield_front_small02_right, MyModelsEnum.mship_shield_front_small02_right_LOD1, null); + + AddEntityModels("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\01_LivingQuarters\\04\\p381_d03_hospital", MyModelsEnum.p381_d03_hospital, MyModelsEnum.p381_d03_hospital_LOD1, MyModelsEnum.p381_d03_hospital_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\01_LivingQuarters\\04\\p381_d05_food_grow", MyModelsEnum.p381_d05_food_grow, MyModelsEnum.p381_d05_food_grow_LOD1, null); + + AddEntityModels("Models2\\Prefabs\\04_Connections\\04_Cables\\Cable_corner_25m", MyModelsEnum.Cable_corner_25m, null, MyModelsEnum.Cable_corner_25m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\04_Cables\\Cable_S_45m", MyModelsEnum.Cable_S_45m, null, MyModelsEnum.Cable_S_45m_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\04_Cables\\Cable_straight_180", MyModelsEnum.Cable_straight_180, null, MyModelsEnum.Cable_straight_180_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\04_Cables\\Cable_straight_45", MyModelsEnum.Cable_straight_45, null, MyModelsEnum.Cable_straight_45_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\04_Cables\\Cable_straight_90", MyModelsEnum.Cable_straight_90, null, MyModelsEnum.Cable_straight_90_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\04_Cables\\Connection_box", MyModelsEnum.Connection_box, null, MyModelsEnum.Connection_box_COL); + + AddModel(new MyModel("Models2\\ObjectsFloating\\cargo_box", MyMeshDrawTechnique.MESH, MyModelsEnum.cargo_box_1)); + AddModel(new MyModel("Models2\\ObjectsFloating\\cargo_box_2", MyMeshDrawTechnique.MESH, MyModelsEnum.cargo_box_2)); + AddModel(new MyModel("Models2\\ObjectsFloating\\cargo_box_3", MyMeshDrawTechnique.MESH, MyModelsEnum.cargo_box_3)); + AddModel(new MyModel("Models2\\ObjectsFloating\\cargo_box_4", MyMeshDrawTechnique.MESH, MyModelsEnum.cargo_box_4)); + AddModel(new MyModel("Models2\\ObjectsFloating\\cargo_box_5", MyMeshDrawTechnique.MESH, MyModelsEnum.cargo_box_5)); + AddModel(new MyModel("Models2\\ObjectsFloating\\cargo_box_6", MyMeshDrawTechnique.MESH, MyModelsEnum.cargo_box_6)); + AddModel(new MyModel("Models2\\ObjectsFloating\\cargo_box_7", MyMeshDrawTechnique.MESH, MyModelsEnum.cargo_box_7)); + AddModel(new MyModel("Models2\\ObjectsFloating\\cargo_box_8", MyMeshDrawTechnique.MESH, MyModelsEnum.cargo_box_8)); + AddModel(new MyModel("Models2\\ObjectsFloating\\cargo_box_9", MyMeshDrawTechnique.MESH, MyModelsEnum.cargo_box_9)); + AddModel(new MyModel("Models2\\ObjectsFloating\\cargo_box_10", MyMeshDrawTechnique.MESH, MyModelsEnum.cargo_box_10)); + AddModel(new MyModel("Models2\\ObjectsFloating\\cargo_box_small", MyMeshDrawTechnique.MESH, MyModelsEnum.cargo_box_small)); + AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\541_security_hub", MyModelsEnum.p541_security_hub, MyModelsEnum.p541_security_hub_LOD1, MyModelsEnum.p541_security_hub_COL); + AddModel(new MyModel("Models2\\ObjectsFloating\\Alarm", MyMeshDrawTechnique.MESH, MyModelsEnum.Alarm)); + AddModel(new MyModel("Models2\\ObjectsFloating\\Alarm_off", MyMeshDrawTechnique.MESH, MyModelsEnum.Alarm_off)); + AddEntityModels("Models2\\ObjectsFloating\\Bank_node", MyModelsEnum.Bank_node, null, MyModelsEnum.Bank_node_COL); + //AddEntityModels("Models2\\ObjectsFloating\\Bank_node", MyModelsEnum.Bank_node, null, null); + AddModel(new MyModel("Models2\\ObjectsFloating\\Cam", MyMeshDrawTechnique.MESH, MyModelsEnum.Cam)); + + AddEntityModels("Models2\\Prefabs\\03_Modules\\06_Communications\\01_LongDistanceAntenna\\01\\p361_b01_long_distance_antenna_big", MyModelsEnum.p361_b01_long_distance_antenna_big, MyModelsEnum.p361_b01_long_distance_antenna_big_LOD1, MyModelsEnum.p361_b01_long_distance_antenna_big_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\06_Communications\\01_LongDistanceAntenna\\01\\p361_b01_long_distance_antenna_dish", MyModelsEnum.p361_b01_long_distance_antenna_dish, MyModelsEnum.p361_b01_long_distance_antenna_dish_LOD1, MyModelsEnum.p361_b01_long_distance_antenna_dish_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\4th_reich_wreck", MyModelsEnum.fourth_reich_wreck, MyModelsEnum.fourth_reich_wreck_LOD1, MyModelsEnum.fourth_reich_wreck_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\04_CargoStorage\\01\\p344_a03_container", MyModelsEnum.p344_a03_container, MyModelsEnum.p344_a03_container_LOD1, MyModelsEnum.p344_a03_container_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231b01_armor", MyModelsEnum.p231b01_armor, MyModelsEnum.p231b01_armor_LOD1, MyModelsEnum.p231b01_armor_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231b01_armor_corner", MyModelsEnum.p231b01_armor_corner, MyModelsEnum.p231b01_armor_corner_LOD1, MyModelsEnum.p231b01_armor_corner_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231b01_armor_edge", MyModelsEnum.p231b01_armor_edge, MyModelsEnum.p231b01_armor_edge_LOD1, MyModelsEnum.p231b01_armor_edge_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\03_Armor\\01\\p231b01_armor_hole", MyModelsEnum.p231b01_armor_hole, MyModelsEnum.p231b01_armor_hole_LOD1, MyModelsEnum.p231b01_armor_hole_COL); + + AddEntityModels("Models2\\Prefabs\\01_Beams\\05_Shelf\\p150a03_shelf_1", MyModelsEnum.p150a03_shelf_1, MyModelsEnum.p150a03_shelf_1_LOD1, MyModelsEnum.p150a03_shelf_1_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\05_Shelf\\p150a02_shelf_1X2", MyModelsEnum.p150a02_shelf_1X2, MyModelsEnum.p150a02_shelf_1X2_LOD1, MyModelsEnum.p150a02_shelf_1X2_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\05_Shelf\\p150a01_shelf_1X3", MyModelsEnum.p150a01_shelf_1X3, MyModelsEnum.p150a01_shelf_1X3_LOD1, MyModelsEnum.p150a01_shelf_1X3_COL); + + AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\04\\p130d02_d_straight_300m", MyModelsEnum.p130d02_d_straight_300m, MyModelsEnum.p130d02_d_straight_300m_LOD1, MyModelsEnum.p130d02_d_straight_300m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\03_Small\\10\\p130j01_j_straight_300m", MyModelsEnum.p130j01_j_straight_300m, MyModelsEnum.p130j01_j_straight_300m_LOD1, MyModelsEnum.p130j01_j_straight_300m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\02_Medium\\03\\p120c02_c_straight_400m", MyModelsEnum.p120c02_c_straight_400m, MyModelsEnum.p120c02_c_straight_400m_LOD1, MyModelsEnum.p120c02_c_straight_400m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\02\\p110b03_lattice_beam_straight_420m", MyModelsEnum.p110b03_lattice_beam_straight_420m, MyModelsEnum.p110b03_lattice_beam_straight_420m_LOD1, MyModelsEnum.p110b03_lattice_beam_straight_420m_COL); + AddEntityModels("Models2\\Prefabs\\01_Beams\\01_Large\\02\\p110b04_lattice_beam_straight_420m_with_panels", MyModelsEnum.p110b04_lattice_beam_straight_420m_with_panels, MyModelsEnum.p110b04_lattice_beam_straight_420m_with_panels_LOD1, MyModelsEnum.p110b04_lattice_beam_straight_420m_with_panels_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\06_Communications\\03_BigAntenna\\p363_a01_big_antenna_300m", MyModelsEnum.p363_a01_big_antenna_300m, MyModelsEnum.p363_a01_big_antenna_300m_LOD1, MyModelsEnum.p363_a01_big_antenna_300m_COL); + AddEntityModels("Models2\\Prefabs\\06_Custom\\01_Asteroid_Prefabs\\p611_asteroid_part_A", MyModelsEnum.p611_asteroid_part_A, MyModelsEnum.p611_asteroid_part_A_LOD1, null); + AddEntityModels("Models2\\Prefabs\\06_Custom\\01_Asteroid_Prefabs\\p611_asteroid_part_B", MyModelsEnum.p611_asteroid_part_B, MyModelsEnum.p611_asteroid_part_B_LOD1, null); + + //AddModel(new MyModel("Models2\\Prefabs\\05_Details\\04_Other\\541_ventilator_body_standalone", MyMeshDrawTechnique.MESH, MyModelsEnum.p541_ventilator_body_standalone)); + AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\541_ventilator_body_standalone", MyModelsEnum.p541_ventilator_body_standalone, MyModelsEnum.p541_ventilator_body_standalone_LOD1, MyModelsEnum.p541_ventilator_body_standalone_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\541_ventilator_propeller_standalone", MyModelsEnum.p541_ventilator_propeller_standalone, MyModelsEnum.p541_ventilator_propeller_standalone_LOD1, MyModelsEnum.p541_ventilator_propeller_standalone_COL); + + AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c03_centrifuge", MyModelsEnum.p321c03_centrifuge, MyModelsEnum.p321c03_centrifuge_LOD1, MyModelsEnum.p321c03_centrifuge_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c04_box_generator", MyModelsEnum.p321c04_box_generator, MyModelsEnum.p321c04_box_generator_LOD1, MyModelsEnum.p321c04_box_generator_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c05_centrifuge_big", MyModelsEnum.p321c05_centrifuge_big, MyModelsEnum.p321c05_centrifuge_big_LOD1, MyModelsEnum.p321c05_centrifuge_big_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\06_Communications\\03_BigAntenna\\p363_a01_big_antenna_1500m", MyModelsEnum.p363_a01_big_antenna_1500m, MyModelsEnum.p363_a01_big_antenna_1500m_LOD1, MyModelsEnum.p363_a01_big_antenna_1500m_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\\\p321c02_generator_wall_big", MyModelsEnum.p321c02_generator_wall_big, MyModelsEnum.p321c02_generator_wall_big_LOD1, MyModelsEnum.p321c02_generator_wall_big_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c02_inertia_generator_center_big", MyModelsEnum.p321c02_inertia_generator_center_big, MyModelsEnum.p321c02_inertia_generator_center_big_LOD1, MyModelsEnum.p321c02_inertia_generator_center_big_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c02_inertia_generator_center_vert", MyModelsEnum.p321c02_inertia_generator_center_vert, MyModelsEnum.p321c02_inertia_generator_center_vert_LOD1, null); + AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c03_centrifuge_centre", MyModelsEnum.p321c03_centrifuge_centre, MyModelsEnum.p321c03_centrifuge_centre_LOD1, MyModelsEnum.p321c03_centrifuge_centre_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c04_two_big_inertia", MyModelsEnum.p321c04_two_big_inertia, MyModelsEnum.p321c04_two_big_inertia_LOD1, null); + AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c05_centrifuge_centre_big", MyModelsEnum.p321c05_centrifuge_centre_big, MyModelsEnum.p321c05_centrifuge_centre_big_LOD1, null); + + AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c06_inertia_B_centre", MyModelsEnum.p321c06_inertia_B_centre, MyModelsEnum.p321c06_inertia_B_centre_LOD1, MyModelsEnum.p321c06_inertia_B_centre_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c06_inertia_generator_B", MyModelsEnum.p321c06_inertia_generator_B, MyModelsEnum.p321c06_inertia_generator_B_LOD1, MyModelsEnum.p321c06_inertia_generator_B_COL); + AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\02_Pipe\\02\\01_Cooling_Device_Wall\\p4221_a01_cooling_device_ventilator_1", MyMeshDrawTechnique.MESH, MyModelsEnum.p4221_a01_cooling_device_ventilator_1)); + AddModel(new MyModel("Models2\\Prefabs\\04_Connections\\02_Pipe\\02\\01_Cooling_Device_Wall\\p4221_a01_cooling_device_ventilator_2", MyMeshDrawTechnique.MESH, MyModelsEnum.p4221_a01_cooling_device_ventilator_2)); + AddEntityModels("Models2\\Prefabs\\04_Connections\\02_Pipe\\02\\01_Cooling_Device_Wall\\p4221_a01_cooling_device_wall_340x400", MyModelsEnum.p4221_a01_cooling_device_wall_340x400, MyModelsEnum.p4221_a01_cooling_device_wall_340x400_LOD1, MyModelsEnum.p4221_a01_cooling_device_wall_340x400_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\02_Pipe\\02\\02_Pipes_Connector\\p4222_a01_pipes_connector_center", MyModelsEnum.p4222_a01_pipes_connector_center, MyModelsEnum.p4222_a01_pipes_connector_center_LOD1, null); + AddEntityModels("Models2\\Prefabs\\04_Connections\\02_Pipe\\02\\02_Pipes_Connector\\p4222_a01_pipes_connector", MyModelsEnum.p4222_a01_pipes_connector, MyModelsEnum.p4222_a01_pipes_connector_LOD1, MyModelsEnum.p4222_a01_pipes_connector_COL); + AddEntityModels("Models2\\Prefabs\\04_Connections\\02_Pipe\\02\\03_Open_Pipe\\p4223_a01_open_pipe", MyModelsEnum.p4223_a01_open_pipe, MyModelsEnum.p4223_a01_open_pipe_LOD1, MyModelsEnum.p4223_a01_open_pipe_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\01_Flight\\01_LongTermThruster\\01\\p311b01_long_term_thruster", MyModelsEnum.p311b01_long_term_thruster, MyModelsEnum.p311b01_long_term_thruster_LOD1, null); + AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c07_generator_center", MyModelsEnum.p321c07_generator_center, MyModelsEnum.p321c07_generator_center_LOD1, null); + AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c07_generator_propeller_1", MyModelsEnum.p321c07_generator_propeller_1, null, MyModelsEnum.p321c07_generator_propeller_1_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c07_generator_propeller_2", MyModelsEnum.p321c07_generator_propeller_2, null, MyModelsEnum.p321c07_generator_propeller_2_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\03\\p321c07_generator", MyModelsEnum.p321c07_generator, MyModelsEnum.p321c07_generator_LOD1, MyModelsEnum.p321c07_generator_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\10\\p221k01_chamber_v2", MyModelsEnum.p221k01_chamber_v2, MyModelsEnum.p221k01_chamber_v2_LOD1, null); + + + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\08_Barrels\\p581_a01_barrel_biohazard", MyMeshDrawTechnique.MESH, MyModelsEnum.p581_a01_barrel_biohazard)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\08_Barrels\\p581_a01_barrel_biohazard_2", MyMeshDrawTechnique.MESH, MyModelsEnum.p581_a01_barrel_biohazard_2)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\08_Barrels\\p581_a01_nuke_barrel", MyMeshDrawTechnique.MESH, MyModelsEnum.p581_a01_nuke_barrel)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\08_Barrels\\p581_a01_red_barrel", MyMeshDrawTechnique.MESH, MyModelsEnum.p581_a01_red_barrel)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\08_Barrels\\p581_a01_simple_barrel", MyMeshDrawTechnique.MESH, MyModelsEnum.p581_a01_simple_barrel)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\08_Barrels\\p581_a01_simple_barrel_2", MyMeshDrawTechnique.MESH, MyModelsEnum.p581_a01_simple_barrel_2)); + AddModel(new MyModel("Models2\\ObjectsFloating\\cargo_box_11", MyMeshDrawTechnique.MESH, MyModelsEnum.cargo_box_11)); + AddModel(new MyModel("Models2\\ObjectsFloating\\cargo_box_12", MyMeshDrawTechnique.MESH, MyModelsEnum.cargo_box_12)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\08_Barrels\\Barrel_prop_A", MyMeshDrawTechnique.MESH, MyModelsEnum.Barrel_prop_A)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\08_Barrels\\Barrel_prop_B", MyMeshDrawTechnique.MESH, MyModelsEnum.Barrel_prop_B)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\08_Barrels\\Barrel_prop_C", MyMeshDrawTechnique.MESH, MyModelsEnum.Barrel_prop_C)); + //AddModel(new MyModel("Models2\\Prefabs\\05_Details\\08_Barrels\\Barrel_prop_D", MyMeshDrawTechnique.MESH, MyModelsEnum.Barrel_prop_D)); + //AddModel(new MyModel("Models2\\Prefabs\\05_Details\\08_Barrels\\Barrel_prop_E", MyMeshDrawTechnique.MESH, MyModelsEnum.Barrel_prop_E)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\08_Barrels\\p581_a01_universal_barrel_COL", MyMeshDrawTechnique.MESH, MyModelsEnum.p581_a01_universal_barrel_COL)); + AddModel(new MyModel("Models2\\ObjectsFloating\\CargoBox_prop_A", MyMeshDrawTechnique.MESH, MyModelsEnum.CargoBox_prop_A)); + AddModel(new MyModel("Models2\\ObjectsFloating\\CargoBox_prop_B", MyMeshDrawTechnique.MESH, MyModelsEnum.CargoBox_prop_B)); + AddModel(new MyModel("Models2\\ObjectsFloating\\CargoBox_prop_C", MyMeshDrawTechnique.MESH, MyModelsEnum.CargoBox_prop_C)); + AddEntityModels("Models2\\Prefabs\\05_Details\\09_Ammo\\CannonBall_Capsule_1", MyModelsEnum.CannonBall_Capsule_1, null, MyModelsEnum.CannonBall_Capsule_1_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\09_Ammo\\Gattling_ammo_belt", MyModelsEnum.gattling_ammo_belt, null, MyModelsEnum.gattling_ammo_belt_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\09_Ammo\\Missile_pack01", MyModelsEnum.Missile_pack01, null, MyModelsEnum.Missile_pack01_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\09_Ammo\\Missile_pack02", MyModelsEnum.Missile_pack02, null, MyModelsEnum.Missile_pack02_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\09_Ammo\\Missile_plazma01", MyModelsEnum.Missile_plazma01, null, MyModelsEnum.Missile_plazma01_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\09_Ammo\\Missile_stack_biochem01", MyModelsEnum.Missile_stack_biochem01, null, MyModelsEnum.Missile_stack_biochem01_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\08_Barrels\\p581_a01_o2_barrel", MyModelsEnum.p581_a01_o2_barrel, null, MyModelsEnum.p581_a01_o2_barrel_COL); + + //AddModel(new MyModel("Models2\\Prefabs\\05_Details\\09_Ammo\\Nuclear_Warhead_closed", MyMeshDrawTechnique.MESH, MyModelsEnum.Nuclear_Warhead_closed)); + AddEntityModels("Models2\\Prefabs\\05_Details\\09_Ammo\\Nuclear_Warhead_closed", MyModelsEnum.Nuclear_Warhead_closed, MyModelsEnum.Nuclear_Warhead_closed_LOD1, MyModelsEnum.Nuclear_Warhead_closed_COL); + //AddModel(new MyModel("Models2\\Prefabs\\05_Details\\09_Ammo\\Nuclear_Warhead_open", MyMeshDrawTechnique.MESH, MyModelsEnum.Nuclear_Warhead_open)); + AddEntityModels("Models2\\Prefabs\\05_Details\\09_Ammo\\Nuclear_Warhead_open", MyModelsEnum.Nuclear_Warhead_open, MyModelsEnum.Nuclear_Warhead_open_LOD1, MyModelsEnum.Nuclear_Warhead_open_COL); + AddModel(new MyModel("Models2\\ObjectsFloating\\CargoBox_prop_D", MyMeshDrawTechnique.MESH, MyModelsEnum.CargoBox_prop_D)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\08_Barrels\\p581_a01_nuke_barrel_1", MyMeshDrawTechnique.MESH, MyModelsEnum.p581_a01_nuke_barrel_1)); + AddModel(new MyModel("Models2\\Prefabs\\05_Details\\08_Barrels\\p581_a01_simple_barrel_3", MyMeshDrawTechnique.MESH, MyModelsEnum.p581_a01_simple_barrel_3)); + AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\11\\p221L01_chamber_v1", MyModelsEnum.p221L01_chamber_v1, MyModelsEnum.p221L01_chamber_v1_LOD1, MyModelsEnum.p221L01_chamber_v1_COL); + + AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\12\\p221M01_chamber_bottom_v1", MyModelsEnum.p221m01_chamber_bottom_v1, MyModelsEnum.p221m01_chamber_bottom_v1_LOD1, MyModelsEnum.p221m01_chamber_bottom_v1_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\12\\p221M01_chamber_center_v1", MyModelsEnum.p221m01_chamber_center_v1, MyModelsEnum.p221m01_chamber_center_v1_LOD1, MyModelsEnum.p221m01_chamber_center_v1_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\12\\p221M01_chamber_top_v1", MyModelsEnum.p221m01_chamber_top_v1, MyModelsEnum.p221m01_chamber_top_v1_LOD1, MyModelsEnum.p221m01_chamber_top_v1_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\02_Supply\\01_PowerGeneration\\04\\p321e01_solar_panel", MyModelsEnum.p321e01_solar_panel, MyModelsEnum.p321e01_solar_panel_LOD1, MyModelsEnum.p321e01_solar_panel_COL); + AddModel(new MyModel("Models2\\Prefabs\\01_Beams\\01_Large\\01\\p110a06_solid_beam_straight_420m", MyMeshDrawTechnique.MESH, MyModelsEnum.p110a06_solid_beam_straight_420m)); + + AddEntityModels("Models2\\Prefabs\\03_Modules\\01_Flight\\01_LongTermThruster\\02\\p311b01_cut_thruster", MyModelsEnum.p311b01_cut_thruster, MyModelsEnum.p311b01_cut_thruster_LOD1, MyModelsEnum.p311b01_cut_thruster_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\01_Flight\\02_ShortTermThruster\\02\\p312b01_cut_thruster_lateral", MyModelsEnum.p312b01_cut_thruster_lateral, MyModelsEnum.p312b01_cut_thruster_lateral_LOD1, MyModelsEnum.p312b01_cut_thruster_lateral_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\01_Flight\\02_ShortTermThruster\\02\\p312b02_cut_thruster_latitude", MyModelsEnum.p312b02_cut_thruster_latitude, MyModelsEnum.p312b02_cut_thruster_latitude_LOD1, MyModelsEnum.p312b02_cut_thruster_latitude_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\alien_detector_unit", MyModelsEnum.alien_detector_unit, null, MyModelsEnum.alien_detector_unit_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\01_LivingQuarters\\03\\p381_c01_building5", MyModelsEnum.p381_c01_building5, MyModelsEnum.p381_c01_building5_LOD1, MyModelsEnum.p381_c01_building5_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\01_LivingQuarters\\03\\p381_c01_building6", MyModelsEnum.p381_c01_building6, MyModelsEnum.p381_c01_building6_LOD1, MyModelsEnum.p381_c01_building6_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\08_MannedObjects\\01_LivingQuarters\\03\\p381_c01_building7", MyModelsEnum.p381_c01_building7, MyModelsEnum.p381_c01_building7_LOD1, MyModelsEnum.p381_c01_building7_COL); + AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\13\\p221n01_chamber_v1", MyModelsEnum.p221n01_chamber_v1, MyModelsEnum.p221n01_chamber_v1_LOD1, MyModelsEnum.p221n01_chamber_v1_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\03_Signs\\531_d_medic_cross", MyModelsEnum.p531_d_medic_cross, null, MyModelsEnum.p531_d_medic_cross_COL); + + AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\541_screen_A", MyModelsEnum.p541_screen_A, MyModelsEnum.p541_screen_A_LOD1, MyModelsEnum.p541_screen_A_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\541_screen_B", MyModelsEnum.p541_screen_B, MyModelsEnum.p541_screen_B_LOD1, MyModelsEnum.p541_screen_B_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\541_terminal_A", MyModelsEnum.p541_terminal_A, MyModelsEnum.p541_terminal_A_LOD1, MyModelsEnum.p541_terminal_A_COL); + + AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\alien_artefact", MyModelsEnum.alien_artefact, null, MyModelsEnum.alien_artefact_COL); + + AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\bomb", MyModelsEnum.bomb, null, MyModelsEnum.bomb_COL); + + AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\14\\rail_gun", MyModelsEnum.rail_gun, MyModelsEnum.rail_gun_LOD1, MyModelsEnum.rail_gun_COL); + AddEntityModels("Models2\\Prefabs\\03_Modules\\04_Industry\\08_Recycle\\01\\p345_a01_recycle_sphere", MyModelsEnum.p345_a01_recycle_sphere, MyModelsEnum.p345_a01_recycle_sphere_LOD1, MyModelsEnum.p345_a01_recycle_sphere_COL); + + AddEntityModels("Models2\\Prefabs\\02_Shells\\02_Chambers\\15\\prison", MyModelsEnum.prison, null, MyModelsEnum.prison_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\vendor", MyModelsEnum.vendor, null, MyModelsEnum.vendor_COL); + + AddEntityModels("Models2\\Prefabs\\05_Details\\04_Other\\hangar_screen", MyModelsEnum.hangar_screen, null, MyModelsEnum.hangar_screen_COL); + + AddEntityModels("Models2\\Prefabs\\ScannerPlane", MyModelsEnum.ScannerPlane, null, null); + AddEntityModels("Models2\\Prefabs\\ScannerRays", MyModelsEnum.ScannerRays, null, null); + + AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a17_billboard_portrait_1", MyModelsEnum.p511_a17_billboard_portrait_1, null, MyModelsEnum.p511_a17_billboard_portrait_1_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a17_billboard_portrait_2", MyModelsEnum.p511_a17_billboard_portrait_2, null, null); + + AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a18_billboard", MyModelsEnum.p511_a18_billboard, MyModelsEnum.p511_a18_billboard_LOD1, MyModelsEnum.p511_a18_billboard_COL); + AddEntityModels("Models2\\Prefabs\\05_Details\\01_Billboards\\511_a19_billboard", MyModelsEnum.p511_a19_billboard, MyModelsEnum.p511_a19_billboard_LOD1, MyModelsEnum.p511_a19_billboard_COL); + + + // Check if we didn't forget to load some model + foreach (int i in Enum.GetValues(typeof(MyModelsEnum))) + { + MyModel myModel = m_models[i]; + MyModelsEnum modelEnum = (MyModelsEnum)i; + MyMwcLog.WriteLine("Checking model enum id [" + i + "] " + modelEnum, LoggingOptions.ENUM_CHECKING); // Here we show model enum as a string. It won't work after obfuscation, but we need it only in debug (before obfuscation), so it's OK. + MyCommonDebugUtils.AssertRelease(myModel != null); + } + + //FindMissingAndUnusedModels(); + + MyMwcLog.DecreaseIndent(); + MyMwcLog.WriteLine("MyModels.InitModels - END"); + } + + /// + /// Used to find models that does not have LOD1 or COL set, and models that can have those models set + /// + private static void FindMissingAndUnusedModels() + { + string contentDirectory = @"C:\KeenSWH\MinerWars\Sources\MinerWars\Content"; + + using (StreamWriter missing = new StreamWriter(File.OpenWrite("models-missing.csv")), notused = new StreamWriter(File.OpenWrite("models-notused.csv"))) + { + missing.WriteLine("Model,Triangles,Volume,Missing"); + notused.WriteLine("Model,NotUsed"); + foreach (int i in Enum.GetValues(typeof(MyModelsEnum))) + { + MyModel myModel = m_models[i]; + string firstAssetName = NormalizeAssetName(myModel.AssetName); + + if (!firstAssetName.EndsWith("LOD0", StringComparison.InvariantCultureIgnoreCase)) + continue; + + bool hasLod1 = false; + bool hasCol = false; + foreach (int j in Enum.GetValues(typeof(MyModelsEnum))) + { + if (i == j) + continue; + + MyModel secondModel = m_models[j]; + string assetName = NormalizeAssetName(secondModel.AssetName); + + if (RemoveModifier(firstAssetName) != RemoveModifier(assetName)) + { + continue; + } + + if (secondModel.AssetName.EndsWith("COL", StringComparison.InvariantCultureIgnoreCase)) + hasCol = true; + if (secondModel.AssetName.EndsWith("LOD1", StringComparison.InvariantCultureIgnoreCase)) + hasLod1 = true; + + if (hasCol && hasLod1) + break; + } + + if (!hasLod1) + { + bool lod1Exists = File.Exists(Path.Combine(contentDirectory, RemoveModifier(myModel.AssetName) + "_LOD1.fbx")); + if (lod1Exists) + { + notused.WriteLine("{0},LOD1", myModel.AssetName); + } + myModel.LoadData(); + missing.WriteLine("{0},{1},{2},LOD1", myModel.AssetName, myModel.GetTrianglesCount(), myModel.BoundingBox.Volume()); + myModel.UnloadData(); + } + if (!hasCol) + { + bool colExists = File.Exists(Path.Combine(contentDirectory, RemoveModifier(myModel.AssetName) + "_COL.fbx")); + if (colExists) + { + notused.WriteLine("{0},COL", myModel.AssetName); + } + myModel.LoadData(); + missing.WriteLine("{0},{1},{2},COL", myModel.AssetName, myModel.GetTrianglesCount(), myModel.BoundingBox.Volume()); + myModel.UnloadData(); + } + } + missing.Flush(); + missing.Close(); + notused.Flush(); + notused.Close(); + } + } + + private static string NormalizeAssetName(string assetName) + { + if (!assetName.EndsWith("LOD1", StringComparison.InvariantCultureIgnoreCase) && !assetName.EndsWith("COL", StringComparison.InvariantCultureIgnoreCase)) + { + if (!assetName.EndsWith("LOD0", StringComparison.InvariantCultureIgnoreCase)) + { + assetName = assetName + "_LOD0"; + } + } + return assetName; + } + + private static string RemoveModifier(string assetName) + { + return assetName.Replace("_LOD0", "").Replace("_LOD1", "").Replace("_COL", ""); + } + + + static void AddModel(MyModel model) + { + // If we already have an object in the array with this model id, then it means we are trying to load it twice (duplicity) + // The idea is: every model is instantiated only once, and is also only once in m_models. No duplicities. + MyCommonDebugUtils.AssertRelease(m_models[(int)model.ModelEnum] == null); + + m_models[(int)model.ModelEnum] = model; + m_modelsByAssertName.Add(model.AssetName, model); + } + + static void AddEntityModels(string assetName, MyModelsEnum lod0, MyModelsEnum? lod1, MyModelsEnum? collision, bool keepInMemory = false) + { + AddModel(new MyModel(assetName, MyMeshDrawTechnique.MESH, lod0, keepInMemory)); + + if (lod1.HasValue) + AddModel(new MyModel(assetName + "_LOD1", MyMeshDrawTechnique.MESH, lod1.Value, keepInMemory)); + if (collision.HasValue) + AddModel(new MyModel(assetName + "_COL", MyMeshDrawTechnique.MESH, collision.Value, keepInMemory)); + } + } +} diff --git a/Sources/MinerWars.GameLib/AppCode/Game/Render/MyRender-Draw.cs b/Sources/MinerWars.GameLib/AppCode/Game/Render/MyRender-Draw.cs index da06854..335191c 100644 --- a/Sources/MinerWars.GameLib/AppCode/Game/Render/MyRender-Draw.cs +++ b/Sources/MinerWars.GameLib/AppCode/Game/Render/MyRender-Draw.cs @@ -748,7 +748,7 @@ struct ShaderContext } - private static MyMeshMaterial m_emptyMaterial = new MyMeshMaterial("", "", null, null); + private static MyMeshMaterial m_emptyMaterial = new MyMeshMaterial("", @"K:\\KeenSWH\\MinerWars\\MediaDevelopment\\MinerWars\\Content\\Textures2\\Models\\Prefabs\\v01\v01_cargo_box_d.png", null, null); private static void DrawRenderElements(List renderElements, bool applyStencil, out int ibChangesStats) { @@ -1196,9 +1196,10 @@ public static MyEffectBase SetupShaderForMaterial(MyMeshMaterial material, MyVox if (material != null) { shader.SetTextureDiffuse(material.DiffuseTexture); - shader.SetTextureNormal(material.NormalTexture); - - //Do we need this? Graphicians dont use this + shader.SetTextureNormal(material.NormalTexture); + + + //Do we need this? Graphicians dont use this //shader.SetDiffuseColor(material.DiffuseColor); shader.SetSpecularIntensity(material.SpecularIntensity); diff --git a/Sources/MinerWars.GameLib/MinerWars.GameLib.csproj b/Sources/MinerWars.GameLib/MinerWars.GameLib.csproj index 416a7c0..05a8f1d 100644 --- a/Sources/MinerWars.GameLib/MinerWars.GameLib.csproj +++ b/Sources/MinerWars.GameLib/MinerWars.GameLib.csproj @@ -1,1362 +1,1358 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {F2AA32D9-F560-4DEF-BBF2-3DCCF4B17320} - Library - Properties - MinerWars - MinerWars.GameLib - v4.0 - 512 - - - true - full - false - bin\Debug\ - TRACE;DEBUG;WINDOWS;PACKED_VERTEX_FORMAT;noRENDER_PROFILING;noMEMORY_PROFILING;noGPU_PROFILING;noDETECT_LEAKS - prompt - 4 - true - true - 162,612,618,429,414,169,649 - - - pdbonly - true - bin\Release\ - TRACE;WINDOWS;dontENABLE_NETWORK_VERBOSE_LOGGING;PACKED_VERTEX_FORMAT;noRENDER_PROFILING;noMEMORY_PROFILING;noGPU_PROFILING - prompt - 4 - true - - - true - bin\Debug\ - TRACE;DEBUG;WINDOWS;PACKED_VERTEX_FORMAT;noRENDER_PROFILING;noMEMORY_PROFILING;noGPU_PROFILING;noDETECT_LEAKS - true - true - 162,612,618,429,414,169,649 - full - x86 - prompt - false - false - - - bin\Release\ - TRACE;WINDOWS;dontENABLE_NETWORK_VERBOSE_LOGGING;PACKED_VERTEX_FORMAT;noRENDER_PROFILING;noMEMORY_PROFILING;noGPU_PROFILING - true - true - pdbonly - x86 - prompt - false - false - - - - False - - - ..\..\3rd\SharpDX\SharpDX.dll - - - ..\..\3rd\SharpDX\SharpDX.Direct3D9.dll - - - ..\..\3rd\SharpDX\SharpDX.DirectInput.dll - - - ..\..\3rd\SharpDX\SharpDX.RawInput.dll - - - ..\..\3rd\SharpDX\SharpDX.XACT3.dll - - - ..\..\3rd\SharpDX\SharpDX.XAudio2.dll - - - False - - - - - - - - - - False - - - False - - - False - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MyDialoguesWrapperGenerated.tt - True - True - - - - - - MyTextsWrapperGenerated.tt - True - True - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MyEnumToStringsGenerated.tt - True - True - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Form - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MyDialogues.resx - True - True - - - MyTexts.resx - True - True - - - True - True - Reference.svcmap - - - True - True - Reference.svcmap - - - - - - - - - Designer - - - Designer - - - Designer - - - Designer - - - - Designer - - - Designer - - - Designer - - - Designer - - - Reference.svcmap - - - Reference.svcmap - - - Designer - - - Designer - - - Designer - - - Designer - - - - Designer - - - Designer - - - - - TextTemplatingFileGenerator - MyDialoguesWrapperGenerated.cs - - - TextTemplatingFileGenerator - MyTextsWrapperGenerated.cs - - - TextTemplatingFileGenerator - MyEnumToStringsGenerated.cs - - - - - - - - {2C96F0AB-7962-4B73-A075-B0E0B09F6195} - MinerWarsCommonLIB - - - {8E36615C-ACDA-4002-BF65-8032577E754C} - Library.Trace - - - {26FE022E-42AB-40BE-BA9D-97CBE34E7D99} - Library - - - {7B22B556-B0CD-4EA0-A638-1F33975C7764} - MinerWars.GameServices - - - {40CE67D5-C89F-4A56-AE52-85DB1BEA07FE} - MinerWarsMath - - - {5609DC59-63E9-4262-90BB-4E31329244B1} - MinerWarsPluginAPI - - - {D0B69D3D-70AD-4C7C-BEFB-AFF902AB9BD2} - ParallelTasks - - - - - - - - - - - - - - - - - - WCF Proxy Generator - Reference.cs - - - - - - - - - - - WCF Proxy Generator - Reference.cs - - - - - - ResXFileCodeGenerator - MyDialogues.Designer.cs - Designer - - - Designer - - - ResXFileCodeGenerator - MyTexts.Designer.cs - Designer - - - + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {F2AA32D9-F560-4DEF-BBF2-3DCCF4B17320} + Library + Properties + MinerWars + MinerWars.GameLib + v4.0 + 512 + + + true + full + false + bin\Debug\ + TRACE;DEBUG;WINDOWS;PACKED_VERTEX_FORMAT;noRENDER_PROFILING;noMEMORY_PROFILING;noGPU_PROFILING;noDETECT_LEAKS + prompt + 4 + true + true + 162,612,618,429,414,169,649 + + + pdbonly + true + bin\Release\ + TRACE;WINDOWS;dontENABLE_NETWORK_VERBOSE_LOGGING;PACKED_VERTEX_FORMAT;noRENDER_PROFILING;noMEMORY_PROFILING;noGPU_PROFILING + prompt + 4 + true + + + true + bin\Debug\ + TRACE;DEBUG;WINDOWS;PACKED_VERTEX_FORMAT;noRENDER_PROFILING;noMEMORY_PROFILING;noGPU_PROFILING;noDETECT_LEAKS + true + true + 162,612,618,429,414,169,649 + full + x86 + prompt + false + false + + + bin\Release\ + TRACE;WINDOWS;dontENABLE_NETWORK_VERBOSE_LOGGING;PACKED_VERTEX_FORMAT;noRENDER_PROFILING;noMEMORY_PROFILING;noGPU_PROFILING + true + true + pdbonly + x86 + prompt + false + false + + + + False + + + ..\..\3rd\SharpDX\SharpDX.dll + + + ..\..\3rd\SharpDX\SharpDX.Direct3D9.dll + + + ..\..\3rd\SharpDX\SharpDX.DirectInput.dll + + + ..\..\3rd\SharpDX\SharpDX.RawInput.dll + + + ..\..\3rd\SharpDX\SharpDX.XACT3.dll + + + ..\..\3rd\SharpDX\SharpDX.XAudio2.dll + + + False + + + + + + + + + + False + + + False + + + False + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MyDialoguesWrapperGenerated.tt + True + True + + + + + + MyTextsWrapperGenerated.tt + True + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MyEnumToStringsGenerated.tt + True + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Form + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MyDialogues.resx + True + True + + + MyTexts.resx + True + True + + + True + True + Reference.svcmap + + + True + True + Reference.svcmap + + + + + + + + + Designer + + + Designer + + + Designer + + + Designer + + + + Designer + + + Designer + + + Designer + + + Designer + + + Reference.svcmap + + + Reference.svcmap + + + Designer + + + Designer + + + Designer + + + Designer + + + + Designer + + + Designer + + + + + TextTemplatingFileGenerator + MyDialoguesWrapperGenerated.cs + + + TextTemplatingFileGenerator + MyTextsWrapperGenerated.cs + + + TextTemplatingFileGenerator + MyEnumToStringsGenerated.cs + + + + + + + + {2C96F0AB-7962-4B73-A075-B0E0B09F6195} + MinerWarsCommonLIB + + + {8E36615C-ACDA-4002-BF65-8032577E754C} + Library.Trace + + + {26FE022E-42AB-40BE-BA9D-97CBE34E7D99} + Library + + + {7B22B556-B0CD-4EA0-A638-1F33975C7764} + MinerWars.GameServices + + + {40CE67D5-C89F-4A56-AE52-85DB1BEA07FE} + MinerWarsMath + + + {5609DC59-63E9-4262-90BB-4E31329244B1} + MinerWarsPluginAPI + + + {D0B69D3D-70AD-4C7C-BEFB-AFF902AB9BD2} + ParallelTasks + + + + + + + + + + + + + + + + + + WCF Proxy Generator + Reference.cs + + + + + + + + + + + WCF Proxy Generator + Reference.cs + + + + + ResXFileCodeGenerator + MyDialogues.Designer.cs + Designer + + + ResXFileCodeGenerator + MyTexts.Designer.cs + Designer + + + - + Other similar extension points exist, see Microsoft.Common.targets. --> + - + --> + \ No newline at end of file diff --git a/Sources/MinerWarsExpressLauncher/Program.cs b/Sources/MinerWarsExpressLauncher/Program.cs index 529197b..d1d7e2d 100644 --- a/Sources/MinerWarsExpressLauncher/Program.cs +++ b/Sources/MinerWarsExpressLauncher/Program.cs @@ -97,7 +97,7 @@ static bool VerifySteamAppIdTxt(string path) [STAThread] static void Main(string[] args) { - string path = TestPaths(args.FirstOrDefault(), InstallPath64, InstallPath, FromRegistryPath, DefaultPath); + string path = TestPaths(args.FirstOrDefault(), InstallPath, FromRegistryPath, DefaultPath); while (path == null) {