From 64398cfa3d38963657a34d6c6f731cd9bc76eeb8 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 14 Aug 2023 21:51:47 +0100 Subject: [PATCH] remove old Warp3d files not in use --- .../Warp3D/BasicWarp3D/BasicWarp3D.vbproj | 130 --- .../BasicWarp3D/BasicWarp3D.vbproj.vspscc | 10 - .../Warp3D/BasicWarp3D/Form1.Designer.vb | 46 - trunk/managed/Warp3D/BasicWarp3D/Form1.resx | 120 -- trunk/managed/Warp3D/BasicWarp3D/Form1.vb | 40 - .../My Project/Application.Designer.vb | 38 - .../BasicWarp3D/My Project/Application.myapp | 11 - .../BasicWarp3D/My Project/AssemblyInfo.vb | 35 - .../My Project/Resources.Designer.vb | 62 - .../BasicWarp3D/My Project/Resources.resx | 117 -- .../My Project/Settings.Designer.vb | 73 -- .../BasicWarp3D/My Project/Settings.settings | 7 - trunk/managed/Warp3D/TestWarp/MCI.cs | 250 ---- .../managed/Warp3D/TestWarp/OdeWarpHelpers.cs | 84 -- trunk/managed/Warp3D/TestWarp/Program.cs | 19 - .../TestWarp/Properties/AssemblyInfo.cs | 33 - .../TestWarp/Properties/Resources.Designer.cs | 74 -- .../Warp3D/TestWarp/Properties/Resources.resx | 117 -- .../TestWarp/Properties/Settings.Designer.cs | 31 - .../TestWarp/Properties/Settings.settings | 7 - trunk/managed/Warp3D/TestWarp/TestWarp.csproj | 149 --- .../Warp3D/TestWarp/TestWarp.csproj.vspscc | 10 - .../managed/Warp3D/TestWarp/Warp.Designer.cs | 184 --- trunk/managed/Warp3D/TestWarp/Warp.cs | 476 -------- trunk/managed/Warp3D/TestWarp/Warp.resx | 117 -- trunk/managed/Warp3D/TestWarpVB/MCI.vb | 224 ---- .../Warp3D/TestWarpVB/MainForm.Designer.vb | 160 --- trunk/managed/Warp3D/TestWarpVB/MainForm.resx | 120 -- trunk/managed/Warp3D/TestWarpVB/MainForm.vb | 412 ------- .../My Project/Application.Designer.vb | 38 - .../TestWarpVB/My Project/Application.myapp | 10 - .../TestWarpVB/My Project/AssemblyInfo.vb | 35 - .../My Project/Resources.Designer.vb | 63 - .../TestWarpVB/My Project/Resources.resx | 117 -- .../My Project/Settings.Designer.vb | 73 -- .../TestWarpVB/My Project/Settings.settings | 7 - .../Warp3D/TestWarpVB/OdeWarpHelpers.vb | 76 -- trunk/managed/Warp3D/TestWarpVB/Program.vb | 8 - .../Warp3D/TestWarpVB/TestWarpVB.vbproj | 167 --- .../TestWarpVB/TestWarpVB.vbproj.vspscc | 10 - .../Warp3D/Warp3D/Properties/AssemblyInfo.cs | 39 - .../managed/Warp3D/Warp3D/Warp3D.Designer.cs | 48 - trunk/managed/Warp3D/Warp3D/Warp3D.cs | 1021 ----------------- trunk/managed/Warp3D/Warp3D/Warp3D.csproj | 157 --- .../Warp3D/Warp3D/Warp3D.csproj.vspscc | 10 - trunk/managed/Warp3D/Warp3D/Warp3D.resx | 117 -- trunk/managed/Warp3D/Warp3D/build.mono | 2 - .../Warp3D/Warp3D/warp_3ds_Importer.cs | 212 ---- trunk/managed/Warp3D/Warp3D/warp_Camera.cs | 166 --- trunk/managed/Warp3D/Warp3D/warp_Color.cs | 233 ---- .../managed/Warp3D/Warp3D/warp_CoreObject.cs | 115 -- trunk/managed/Warp3D/Warp3D/warp_Edge.cs | 33 - .../managed/Warp3D/Warp3D/warp_Environment.cs | 22 - .../Warp3D/Warp3D/warp_FXLensFlare .cs | 352 ------ trunk/managed/Warp3D/Warp3D/warp_FXPlugin.cs | 20 - trunk/managed/Warp3D/Warp3D/warp_Light.cs | 66 -- trunk/managed/Warp3D/Warp3D/warp_Lightmap.cs | 90 -- trunk/managed/Warp3D/Warp3D/warp_Material.cs | 244 ---- trunk/managed/Warp3D/Warp3D/warp_Math.cs | 215 ---- trunk/managed/Warp3D/Warp3D/warp_Matrix.cs | 362 ------ trunk/managed/Warp3D/Warp3D/warp_Object.cs | 378 ------ .../Warp3D/Warp3D/warp_ObjectFactory.cs | 309 ----- .../managed/Warp3D/Warp3D/warp_Quaternion.cs | 123 -- .../managed/Warp3D/Warp3D/warp_Rasterizer.cs | 614 ---------- .../Warp3D/Warp3D/warp_RenderPipeline.cs | 270 ----- trunk/managed/Warp3D/Warp3D/warp_Scene.cs | 363 ------ trunk/managed/Warp3D/Warp3D/warp_Screen.cs | 168 --- trunk/managed/Warp3D/Warp3D/warp_Texture.cs | 217 ---- .../Warp3D/Warp3D/warp_TextureFactory.cs | 233 ---- .../Warp3D/Warp3D/warp_TextureProjector.cs | 53 - .../Warp3D/Warp3D/warp_TextureSettings.cs | 33 - trunk/managed/Warp3D/Warp3D/warp_Triangle.cs | 98 -- trunk/managed/Warp3D/Warp3D/warp_Vector.cs | 148 --- trunk/managed/Warp3D/Warp3D/warp_Vertex.cs | 194 ---- .../Warp3D/Warp3DVB/Custom/warp_Color.vb | 36 - .../Warp3D/Warp3DVB/Custom/warp_Screen.vb | 254 ---- .../My Project/Application.Designer.vb | 13 - .../Warp3DVB/My Project/Application.myapp | 10 - .../Warp3DVB/My Project/AssemblyInfo.vb | 35 - .../Warp3DVB/My Project/Resources.Designer.vb | 63 - .../Warp3D/Warp3DVB/My Project/Resources.resx | 117 -- .../Warp3DVB/My Project/Settings.Designer.vb | 73 -- .../Warp3DVB/My Project/Settings.settings | 7 - trunk/managed/Warp3D/Warp3DVB/Warp3D.resx | 117 -- trunk/managed/Warp3D/Warp3DVB/Warp3D.vb | 809 ------------- trunk/managed/Warp3D/Warp3DVB/Warp3DVB.vbproj | 251 ---- .../Warp3D/Warp3DVB/Warp3DVB.vbproj.vspscc | 10 - trunk/managed/Warp3D/Warp3DVB/Warp_Vector.vb | 124 -- .../Warp3D/Warp3DVB/warp_3ds_Importer.vb | 196 ---- trunk/managed/Warp3D/Warp3DVB/warp_Camera.vb | 155 --- trunk/managed/Warp3D/Warp3DVB/warp_Color.vb | 192 ---- .../Warp3D/Warp3DVB/warp_CoreObject.vb | 106 -- trunk/managed/Warp3D/Warp3DVB/warp_Edge.vb | 38 - .../Warp3D/Warp3DVB/warp_Environment.vb | 30 - .../Warp3D/Warp3DVB/warp_FXLensFlare.vb | 330 ------ .../managed/Warp3D/Warp3DVB/warp_FXPlugin.vb | 29 - trunk/managed/Warp3D/Warp3DVB/warp_Light.vb | 68 -- .../managed/Warp3D/Warp3DVB/warp_Lightmap.vb | 98 -- .../managed/Warp3D/Warp3DVB/warp_Material.vb | 224 ---- trunk/managed/Warp3D/Warp3DVB/warp_Math.vb | 182 --- trunk/managed/Warp3D/Warp3DVB/warp_Matrix.vb | 348 ------ trunk/managed/Warp3D/Warp3DVB/warp_Object.vb | 375 ------ .../Warp3D/Warp3DVB/warp_ObjectFactory.vb | 280 ----- .../Warp3D/Warp3DVB/warp_Quaternion.vb | 102 -- .../Warp3D/Warp3DVB/warp_Rasterizer.vb | 591 ---------- .../Warp3D/Warp3DVB/warp_RenderPipeline.vb | 242 ---- trunk/managed/Warp3D/Warp3DVB/warp_Scene.vb | 325 ------ trunk/managed/Warp3D/Warp3DVB/warp_Screen.vb | 159 --- trunk/managed/Warp3D/Warp3DVB/warp_Texture.vb | 227 ---- .../Warp3D/Warp3DVB/warp_TextureFactory.vb | 205 ---- .../Warp3D/Warp3DVB/warp_TextureProjector.vb | 59 - .../Warp3D/Warp3DVB/warp_TextureSettings.vb | 41 - .../managed/Warp3D/Warp3DVB/warp_Triangle.vb | 105 -- trunk/managed/Warp3D/Warp3DVB/warp_Vertex.vb | 199 ---- .../Warp3D_Tester/AniSpriteTest.Designer.vb | 39 - .../Warp3D/Warp3D_Tester/AniSpriteTest.resx | 120 -- .../Warp3D/Warp3D_Tester/AniSpriteTest.vb | 184 --- .../BackgroundImageTest.Designer.vb | 39 - .../Warp3D_Tester/BackgroundImageTest.resx | 120 -- .../Warp3D_Tester/BackgroundImageTest.vb | 41 - trunk/managed/Warp3D/Warp3D_Tester/CBX.png | Bin 250179 -> 0 bytes .../Warp3D/Warp3D_Tester/CBX128x128.png | Bin 23809 -> 0 bytes .../Warp3D/Warp3D_Tester/CBX256x256.png | Bin 80939 -> 0 bytes .../managed/Warp3D/Warp3D_Tester/CBX32x32.png | Bin 2031 -> 0 bytes trunk/managed/Warp3D/Warp3D_Tester/General.vb | 51 - .../Warp3D/Warp3D_Tester/MainForm.Designer.vb | 131 --- .../Warp3D/Warp3D_Tester/MainForm.resx | 120 -- .../managed/Warp3D/Warp3D_Tester/MainForm.vb | 119 -- .../My Project/Application.Designer.vb | 38 - .../My Project/Application.myapp | 10 - .../Warp3D_Tester/My Project/AssemblyInfo.vb | 35 - .../My Project/Resources.Designer.vb | 63 - .../Warp3D_Tester/My Project/Resources.resx | 117 -- .../My Project/Settings.Designer.vb | 73 -- .../My Project/Settings.settings | 7 - .../ScreenDrawingMethods.Designer.vb | 39 - .../Warp3D_Tester/ScreenDrawingMethods.resx | 120 -- .../Warp3D_Tester/ScreenDrawingMethods.vb | 94 -- .../Warp3D_Tester/SpriteTest.Designer.vb | 39 - .../Warp3D/Warp3D_Tester/SpriteTest.resx | 120 -- .../Warp3D/Warp3D_Tester/SpriteTest.vb | 106 -- .../TextureGeneration.Designer.vb | 41 - .../Warp3D_Tester/TextureGeneration.resx | 120 -- .../Warp3D/Warp3D_Tester/TextureGeneration.vb | 166 --- .../Warp3D_Tester/Transparency.Designer.vb | 39 - .../Warp3D/Warp3D_Tester/Transparency.resx | 120 -- .../Warp3D/Warp3D_Tester/Transparency.vb | 81 -- .../Warp3D_Tester/TriangleTest.Designer.vb | 39 - .../Warp3D/Warp3D_Tester/TriangleTest.resx | 120 -- .../Warp3D/Warp3D_Tester/TriangleTest.vb | 99 -- .../Warp3D/Warp3D_Tester/Warp3D_Tester.vbproj | 267 ----- .../Warp3D_Tester/Warp3D_Tester.vbproj.vspscc | 10 - trunk/managed/Warp3D/Warp3D_Tester/flare1.png | Bin 51207 -> 0 bytes .../Warp3D/Yipdiddy_Tester/CBX256x256.png | Bin 80939 -> 0 bytes .../Warp3D/Yipdiddy_Tester/Form1.Designer.vb | 35 - .../managed/Warp3D/Yipdiddy_Tester/Form1.resx | 120 -- trunk/managed/Warp3D/Yipdiddy_Tester/Form1.vb | 93 -- .../managed/Warp3D/Yipdiddy_Tester/General.vb | 15 - trunk/managed/Warp3D/Yipdiddy_Tester/Image.vb | 298 ----- .../My Project/Application.Designer.vb | 38 - .../My Project/Application.myapp | 11 - .../My Project/AssemblyInfo.vb | 35 - .../My Project/Resources.Designer.vb | 63 - .../Yipdiddy_Tester/My Project/Resources.resx | 117 -- .../My Project/Settings.Designer.vb | 73 -- .../My Project/Settings.settings | 7 - .../Yipdiddy_Tester/Yipdiddy_Tester.vbproj | 136 --- .../Yipdiddy_Tester.vbproj.vspscc | 10 - .../managed/Warp3D/Yipdiddy_Tester/flare1.png | Bin 51207 -> 0 bytes .../managed/Warp3D/Yipdiddy_Tester/flare4.png | Bin 7122 -> 0 bytes 170 files changed, 21288 deletions(-) delete mode 100644 trunk/managed/Warp3D/BasicWarp3D/BasicWarp3D.vbproj delete mode 100644 trunk/managed/Warp3D/BasicWarp3D/BasicWarp3D.vbproj.vspscc delete mode 100644 trunk/managed/Warp3D/BasicWarp3D/Form1.Designer.vb delete mode 100644 trunk/managed/Warp3D/BasicWarp3D/Form1.resx delete mode 100644 trunk/managed/Warp3D/BasicWarp3D/Form1.vb delete mode 100644 trunk/managed/Warp3D/BasicWarp3D/My Project/Application.Designer.vb delete mode 100644 trunk/managed/Warp3D/BasicWarp3D/My Project/Application.myapp delete mode 100644 trunk/managed/Warp3D/BasicWarp3D/My Project/AssemblyInfo.vb delete mode 100644 trunk/managed/Warp3D/BasicWarp3D/My Project/Resources.Designer.vb delete mode 100644 trunk/managed/Warp3D/BasicWarp3D/My Project/Resources.resx delete mode 100644 trunk/managed/Warp3D/BasicWarp3D/My Project/Settings.Designer.vb delete mode 100644 trunk/managed/Warp3D/BasicWarp3D/My Project/Settings.settings delete mode 100644 trunk/managed/Warp3D/TestWarp/MCI.cs delete mode 100644 trunk/managed/Warp3D/TestWarp/OdeWarpHelpers.cs delete mode 100644 trunk/managed/Warp3D/TestWarp/Program.cs delete mode 100644 trunk/managed/Warp3D/TestWarp/Properties/AssemblyInfo.cs delete mode 100644 trunk/managed/Warp3D/TestWarp/Properties/Resources.Designer.cs delete mode 100644 trunk/managed/Warp3D/TestWarp/Properties/Resources.resx delete mode 100644 trunk/managed/Warp3D/TestWarp/Properties/Settings.Designer.cs delete mode 100644 trunk/managed/Warp3D/TestWarp/Properties/Settings.settings delete mode 100644 trunk/managed/Warp3D/TestWarp/TestWarp.csproj delete mode 100644 trunk/managed/Warp3D/TestWarp/TestWarp.csproj.vspscc delete mode 100644 trunk/managed/Warp3D/TestWarp/Warp.Designer.cs delete mode 100644 trunk/managed/Warp3D/TestWarp/Warp.cs delete mode 100644 trunk/managed/Warp3D/TestWarp/Warp.resx delete mode 100644 trunk/managed/Warp3D/TestWarpVB/MCI.vb delete mode 100644 trunk/managed/Warp3D/TestWarpVB/MainForm.Designer.vb delete mode 100644 trunk/managed/Warp3D/TestWarpVB/MainForm.resx delete mode 100644 trunk/managed/Warp3D/TestWarpVB/MainForm.vb delete mode 100644 trunk/managed/Warp3D/TestWarpVB/My Project/Application.Designer.vb delete mode 100644 trunk/managed/Warp3D/TestWarpVB/My Project/Application.myapp delete mode 100644 trunk/managed/Warp3D/TestWarpVB/My Project/AssemblyInfo.vb delete mode 100644 trunk/managed/Warp3D/TestWarpVB/My Project/Resources.Designer.vb delete mode 100644 trunk/managed/Warp3D/TestWarpVB/My Project/Resources.resx delete mode 100644 trunk/managed/Warp3D/TestWarpVB/My Project/Settings.Designer.vb delete mode 100644 trunk/managed/Warp3D/TestWarpVB/My Project/Settings.settings delete mode 100644 trunk/managed/Warp3D/TestWarpVB/OdeWarpHelpers.vb delete mode 100644 trunk/managed/Warp3D/TestWarpVB/Program.vb delete mode 100644 trunk/managed/Warp3D/TestWarpVB/TestWarpVB.vbproj delete mode 100644 trunk/managed/Warp3D/TestWarpVB/TestWarpVB.vbproj.vspscc delete mode 100644 trunk/managed/Warp3D/Warp3D/Properties/AssemblyInfo.cs delete mode 100644 trunk/managed/Warp3D/Warp3D/Warp3D.Designer.cs delete mode 100644 trunk/managed/Warp3D/Warp3D/Warp3D.cs delete mode 100644 trunk/managed/Warp3D/Warp3D/Warp3D.csproj delete mode 100644 trunk/managed/Warp3D/Warp3D/Warp3D.csproj.vspscc delete mode 100644 trunk/managed/Warp3D/Warp3D/Warp3D.resx delete mode 100755 trunk/managed/Warp3D/Warp3D/build.mono delete mode 100644 trunk/managed/Warp3D/Warp3D/warp_3ds_Importer.cs delete mode 100644 trunk/managed/Warp3D/Warp3D/warp_Camera.cs delete mode 100644 trunk/managed/Warp3D/Warp3D/warp_Color.cs delete mode 100644 trunk/managed/Warp3D/Warp3D/warp_CoreObject.cs delete mode 100644 trunk/managed/Warp3D/Warp3D/warp_Edge.cs delete mode 100644 trunk/managed/Warp3D/Warp3D/warp_Environment.cs delete mode 100644 trunk/managed/Warp3D/Warp3D/warp_FXLensFlare .cs delete mode 100644 trunk/managed/Warp3D/Warp3D/warp_FXPlugin.cs delete mode 100644 trunk/managed/Warp3D/Warp3D/warp_Light.cs delete mode 100644 trunk/managed/Warp3D/Warp3D/warp_Lightmap.cs delete mode 100644 trunk/managed/Warp3D/Warp3D/warp_Material.cs delete mode 100644 trunk/managed/Warp3D/Warp3D/warp_Math.cs delete mode 100644 trunk/managed/Warp3D/Warp3D/warp_Matrix.cs delete mode 100644 trunk/managed/Warp3D/Warp3D/warp_Object.cs delete mode 100644 trunk/managed/Warp3D/Warp3D/warp_ObjectFactory.cs delete mode 100644 trunk/managed/Warp3D/Warp3D/warp_Quaternion.cs delete mode 100644 trunk/managed/Warp3D/Warp3D/warp_Rasterizer.cs delete mode 100644 trunk/managed/Warp3D/Warp3D/warp_RenderPipeline.cs delete mode 100644 trunk/managed/Warp3D/Warp3D/warp_Scene.cs delete mode 100644 trunk/managed/Warp3D/Warp3D/warp_Screen.cs delete mode 100644 trunk/managed/Warp3D/Warp3D/warp_Texture.cs delete mode 100644 trunk/managed/Warp3D/Warp3D/warp_TextureFactory.cs delete mode 100644 trunk/managed/Warp3D/Warp3D/warp_TextureProjector.cs delete mode 100644 trunk/managed/Warp3D/Warp3D/warp_TextureSettings.cs delete mode 100644 trunk/managed/Warp3D/Warp3D/warp_Triangle.cs delete mode 100644 trunk/managed/Warp3D/Warp3D/warp_Vector.cs delete mode 100644 trunk/managed/Warp3D/Warp3D/warp_Vertex.cs delete mode 100644 trunk/managed/Warp3D/Warp3DVB/Custom/warp_Color.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/Custom/warp_Screen.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/My Project/Application.Designer.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/My Project/Application.myapp delete mode 100644 trunk/managed/Warp3D/Warp3DVB/My Project/AssemblyInfo.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/My Project/Resources.Designer.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/My Project/Resources.resx delete mode 100644 trunk/managed/Warp3D/Warp3DVB/My Project/Settings.Designer.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/My Project/Settings.settings delete mode 100644 trunk/managed/Warp3D/Warp3DVB/Warp3D.resx delete mode 100644 trunk/managed/Warp3D/Warp3DVB/Warp3D.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/Warp3DVB.vbproj delete mode 100644 trunk/managed/Warp3D/Warp3DVB/Warp3DVB.vbproj.vspscc delete mode 100644 trunk/managed/Warp3D/Warp3DVB/Warp_Vector.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/warp_3ds_Importer.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/warp_Camera.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/warp_Color.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/warp_CoreObject.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/warp_Edge.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/warp_Environment.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/warp_FXLensFlare.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/warp_FXPlugin.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/warp_Light.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/warp_Lightmap.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/warp_Material.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/warp_Math.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/warp_Matrix.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/warp_Object.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/warp_ObjectFactory.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/warp_Quaternion.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/warp_Rasterizer.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/warp_RenderPipeline.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/warp_Scene.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/warp_Screen.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/warp_Texture.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/warp_TextureFactory.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/warp_TextureProjector.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/warp_TextureSettings.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/warp_Triangle.vb delete mode 100644 trunk/managed/Warp3D/Warp3DVB/warp_Vertex.vb delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/AniSpriteTest.Designer.vb delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/AniSpriteTest.resx delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/AniSpriteTest.vb delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/BackgroundImageTest.Designer.vb delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/BackgroundImageTest.resx delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/BackgroundImageTest.vb delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/CBX.png delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/CBX128x128.png delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/CBX256x256.png delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/CBX32x32.png delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/General.vb delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/MainForm.Designer.vb delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/MainForm.resx delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/MainForm.vb delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/My Project/Application.Designer.vb delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/My Project/Application.myapp delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/My Project/AssemblyInfo.vb delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/My Project/Resources.Designer.vb delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/My Project/Resources.resx delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/My Project/Settings.Designer.vb delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/My Project/Settings.settings delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/ScreenDrawingMethods.Designer.vb delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/ScreenDrawingMethods.resx delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/ScreenDrawingMethods.vb delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/SpriteTest.Designer.vb delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/SpriteTest.resx delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/SpriteTest.vb delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/TextureGeneration.Designer.vb delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/TextureGeneration.resx delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/TextureGeneration.vb delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/Transparency.Designer.vb delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/Transparency.resx delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/Transparency.vb delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/TriangleTest.Designer.vb delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/TriangleTest.resx delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/TriangleTest.vb delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/Warp3D_Tester.vbproj delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/Warp3D_Tester.vbproj.vspscc delete mode 100644 trunk/managed/Warp3D/Warp3D_Tester/flare1.png delete mode 100644 trunk/managed/Warp3D/Yipdiddy_Tester/CBX256x256.png delete mode 100644 trunk/managed/Warp3D/Yipdiddy_Tester/Form1.Designer.vb delete mode 100644 trunk/managed/Warp3D/Yipdiddy_Tester/Form1.resx delete mode 100644 trunk/managed/Warp3D/Yipdiddy_Tester/Form1.vb delete mode 100644 trunk/managed/Warp3D/Yipdiddy_Tester/General.vb delete mode 100644 trunk/managed/Warp3D/Yipdiddy_Tester/Image.vb delete mode 100644 trunk/managed/Warp3D/Yipdiddy_Tester/My Project/Application.Designer.vb delete mode 100644 trunk/managed/Warp3D/Yipdiddy_Tester/My Project/Application.myapp delete mode 100644 trunk/managed/Warp3D/Yipdiddy_Tester/My Project/AssemblyInfo.vb delete mode 100644 trunk/managed/Warp3D/Yipdiddy_Tester/My Project/Resources.Designer.vb delete mode 100644 trunk/managed/Warp3D/Yipdiddy_Tester/My Project/Resources.resx delete mode 100644 trunk/managed/Warp3D/Yipdiddy_Tester/My Project/Settings.Designer.vb delete mode 100644 trunk/managed/Warp3D/Yipdiddy_Tester/My Project/Settings.settings delete mode 100644 trunk/managed/Warp3D/Yipdiddy_Tester/Yipdiddy_Tester.vbproj delete mode 100644 trunk/managed/Warp3D/Yipdiddy_Tester/Yipdiddy_Tester.vbproj.vspscc delete mode 100644 trunk/managed/Warp3D/Yipdiddy_Tester/flare1.png delete mode 100644 trunk/managed/Warp3D/Yipdiddy_Tester/flare4.png diff --git a/trunk/managed/Warp3D/BasicWarp3D/BasicWarp3D.vbproj b/trunk/managed/Warp3D/BasicWarp3D/BasicWarp3D.vbproj deleted file mode 100644 index 66fe602b..00000000 --- a/trunk/managed/Warp3D/BasicWarp3D/BasicWarp3D.vbproj +++ /dev/null @@ -1,130 +0,0 @@ - - - - Debug - AnyCPU - 8.0.50727 - 2.0 - {D9F00283-9C34-4208-8C72-AD394AD4C22F} - WinExe - BasicWarp3D.My.MyApplication - BasicWarp3D - BasicWarp3D - WindowsForms - On - SAK - SAK - SAK - SAK - - - true - full - true - true - bin\Debug\ - BasicWarp3D.xml - 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 - - - pdbonly - false - true - true - bin\Release\ - BasicWarp3D.xml - 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 - - - true - true - true - bin\Slixel Tester\ - BasicWarp3D.xml - 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 - full - AnyCPU - \rules - true - GlobalSuppressions.vb - - - - - - - - - - - - - - - - - - - - - - Form - - - Form1.vb - Form - - - - True - Application.myapp - - - True - True - Resources.resx - - - True - Settings.settings - True - - - - - Designer - Form1.vb - - - VbMyResourcesResXFileCodeGenerator - Resources.Designer.vb - My.Resources - Designer - - - - - MyApplicationCodeGenerator - Application.Designer.vb - - - SettingsSingleFileGenerator - My - Settings.Designer.vb - - - - - {6E48530B-16AB-4861-9CED-97334739D675} - Warp3D %28Warp3D\Warp3D%29 - - - - - \ No newline at end of file diff --git a/trunk/managed/Warp3D/BasicWarp3D/BasicWarp3D.vbproj.vspscc b/trunk/managed/Warp3D/BasicWarp3D/BasicWarp3D.vbproj.vspscc deleted file mode 100644 index feffdeca..00000000 --- a/trunk/managed/Warp3D/BasicWarp3D/BasicWarp3D.vbproj.vspscc +++ /dev/null @@ -1,10 +0,0 @@ -"" -{ -"FILE_VERSION" = "9237" -"ENLISTMENT_CHOICE" = "NEVER" -"PROJECT_FILE_RELATIVE_PATH" = "" -"NUMBER_OF_EXCLUDED_FILES" = "0" -"ORIGINAL_PROJECT_FILE_PATH" = "" -"NUMBER_OF_NESTED_PROJECTS" = "0" -"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" -} diff --git a/trunk/managed/Warp3D/BasicWarp3D/Form1.Designer.vb b/trunk/managed/Warp3D/BasicWarp3D/Form1.Designer.vb deleted file mode 100644 index ba31b2d7..00000000 --- a/trunk/managed/Warp3D/BasicWarp3D/Form1.Designer.vb +++ /dev/null @@ -1,46 +0,0 @@ - _ -Partial Class Form1 - Inherits System.Windows.Forms.Form - - 'Form overrides dispose to clean up the component list. - _ - Protected Overrides Sub Dispose(ByVal disposing As Boolean) - If disposing AndAlso components IsNot Nothing Then - components.Dispose() - End If - MyBase.Dispose(disposing) - End Sub - - 'Required by the Windows Form Designer - Private components As System.ComponentModel.IContainer - - 'NOTE: The following procedure is required by the Windows Form Designer - 'It can be modified using the Windows Form Designer. - 'Do not modify it using the code editor. - _ - Private Sub InitializeComponent() - Me.W3D = New Warp3D.Warp3D - Me.SuspendLayout() - ' - 'W3D - ' - Me.W3D.Dock = System.Windows.Forms.DockStyle.Fill - Me.W3D.Location = New System.Drawing.Point(0, 0) - Me.W3D.Name = "W3D" - Me.W3D.Size = New System.Drawing.Size(427, 379) - Me.W3D.TabIndex = 0 - ' - 'Form1 - ' - Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) - Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(427, 379) - Me.Controls.Add(Me.W3D) - Me.Name = "Form1" - Me.Text = "Form1" - Me.ResumeLayout(False) - - End Sub - Friend WithEvents W3D As Warp3D.Warp3D - -End Class diff --git a/trunk/managed/Warp3D/BasicWarp3D/Form1.resx b/trunk/managed/Warp3D/BasicWarp3D/Form1.resx deleted file mode 100644 index ff31a6db..00000000 --- a/trunk/managed/Warp3D/BasicWarp3D/Form1.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/trunk/managed/Warp3D/BasicWarp3D/Form1.vb b/trunk/managed/Warp3D/BasicWarp3D/Form1.vb deleted file mode 100644 index a8951799..00000000 --- a/trunk/managed/Warp3D/BasicWarp3D/Form1.vb +++ /dev/null @@ -1,40 +0,0 @@ -Public Class Form1 - - Protected Friend WithEvents RenderTimer As Timers.Timer - - - - Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing - RenderTimer.Stop() - RenderTimer = Nothing - End Sub - - Private Sub CreateScene() - 'W3D.DisplayDefaultScene() - W3D.CreateScene(Me.ClientSize.Width, Me.ClientSize.Height) - W3D.AddBox("box", 5, 5, 5) - W3D.AddMaterial("red") - W3D.Scene.material("red").color = Color.Red.ToArgb - W3D.SetObjectMaterial("box", "red") - - W3D.AddLight("light1", 0, 5, 20, Color.White.ToArgb, 100, 40) - - W3D.ShiftDefaultCamera(0, 0, -20) - End Sub - - Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load - Control.CheckForIllegalCrossThreadCalls = False - CreateScene() - - RenderTimer = New Timers.Timer(33) - RenderTimer.AutoReset = False - RenderTimer.Start() - End Sub - - Private Sub RenderTimer_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles RenderTimer.Elapsed - - W3D.Render() - ' W3D.Refresh() - If Me.Created AndAlso RenderTimer IsNot Nothing Then RenderTimer.Start() - End Sub -End Class diff --git a/trunk/managed/Warp3D/BasicWarp3D/My Project/Application.Designer.vb b/trunk/managed/Warp3D/BasicWarp3D/My Project/Application.Designer.vb deleted file mode 100644 index 3153b86c..00000000 --- a/trunk/managed/Warp3D/BasicWarp3D/My Project/Application.Designer.vb +++ /dev/null @@ -1,38 +0,0 @@ -'------------------------------------------------------------------------------ -' -' This code was generated by a tool. -' Runtime Version:2.0.50727.42 -' -' Changes to this file may cause incorrect behavior and will be lost if -' the code is regenerated. -' -'------------------------------------------------------------------------------ - -Option Strict On -Option Explicit On - - -Namespace My - - 'NOTE: This file is auto-generated; do not modify it directly. To make changes, - ' or if you encounter build errors in this file, go to the Project Designer - ' (go to Project Properties or double-click the My Project node in - ' Solution Explorer), and make changes on the Application tab. - ' - Partial Friend Class MyApplication - - _ - Public Sub New() - MyBase.New(Global.Microsoft.VisualBasic.ApplicationServices.AuthenticationMode.Windows) - Me.IsSingleInstance = false - Me.EnableVisualStyles = true - Me.SaveMySettingsOnExit = true - Me.ShutDownStyle = Global.Microsoft.VisualBasic.ApplicationServices.ShutdownMode.AfterMainFormCloses - End Sub - - _ - Protected Overrides Sub OnCreateMainForm() - Me.MainForm = Global.BasicWarp3D.Form1 - End Sub - End Class -End Namespace diff --git a/trunk/managed/Warp3D/BasicWarp3D/My Project/Application.myapp b/trunk/managed/Warp3D/BasicWarp3D/My Project/Application.myapp deleted file mode 100644 index 7b0c597d..00000000 --- a/trunk/managed/Warp3D/BasicWarp3D/My Project/Application.myapp +++ /dev/null @@ -1,11 +0,0 @@ - - - true - Form1 - false - 0 - true - 0 - 0 - true - diff --git a/trunk/managed/Warp3D/BasicWarp3D/My Project/AssemblyInfo.vb b/trunk/managed/Warp3D/BasicWarp3D/My Project/AssemblyInfo.vb deleted file mode 100644 index c5c39b76..00000000 --- a/trunk/managed/Warp3D/BasicWarp3D/My Project/AssemblyInfo.vb +++ /dev/null @@ -1,35 +0,0 @@ -Imports System -Imports System.Reflection -Imports System.Runtime.InteropServices - -' General Information about an assembly is controlled through the following -' set of attributes. Change these attribute values to modify the information -' associated with an assembly. - -' Review the values of the assembly attributes - - - - - - - - - - -'The following GUID is for the ID of the typelib if this project is exposed to COM - - -' Version information for an assembly consists of the following four values: -' -' Major Version -' Minor Version -' Build Number -' Revision -' -' You can specify all the values or you can default the Build and Revision Numbers -' by using the '*' as shown below: -' - - - diff --git a/trunk/managed/Warp3D/BasicWarp3D/My Project/Resources.Designer.vb b/trunk/managed/Warp3D/BasicWarp3D/My Project/Resources.Designer.vb deleted file mode 100644 index ae756f62..00000000 --- a/trunk/managed/Warp3D/BasicWarp3D/My Project/Resources.Designer.vb +++ /dev/null @@ -1,62 +0,0 @@ -'------------------------------------------------------------------------------ -' -' This code was generated by a tool. -' Runtime Version:2.0.50727.42 -' -' Changes to this file may cause incorrect behavior and will be lost if -' the code is regenerated. -' -'------------------------------------------------------------------------------ - -Option Strict On -Option Explicit On - - -Namespace My.Resources - - 'This class was auto-generated by the StronglyTypedResourceBuilder - 'class via a tool like ResGen or Visual Studio. - 'To add or remove a member, edit your .ResX file then rerun ResGen - 'with the /str option, or rebuild your VS project. - ' - ' A strongly-typed resource class, for looking up localized strings, etc. - ' - _ - Friend Module Resources - - Private resourceMan As Global.System.Resources.ResourceManager - - Private resourceCulture As Global.System.Globalization.CultureInfo - - ' - ' Returns the cached ResourceManager instance used by this class. - ' - _ - Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager - Get - If Object.ReferenceEquals(resourceMan, Nothing) Then - Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("BasicWarp3D.Resources", GetType(Resources).Assembly) - resourceMan = temp - End If - Return resourceMan - End Get - End Property - - ' - ' Overrides the current thread's CurrentUICulture property for all - ' resource lookups using this strongly typed resource class. - ' - _ - Friend Property Culture() As Global.System.Globalization.CultureInfo - Get - Return resourceCulture - End Get - Set(ByVal value As Global.System.Globalization.CultureInfo) - resourceCulture = value - End Set - End Property - End Module -End Namespace diff --git a/trunk/managed/Warp3D/BasicWarp3D/My Project/Resources.resx b/trunk/managed/Warp3D/BasicWarp3D/My Project/Resources.resx deleted file mode 100644 index ffecec85..00000000 --- a/trunk/managed/Warp3D/BasicWarp3D/My Project/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/trunk/managed/Warp3D/BasicWarp3D/My Project/Settings.Designer.vb b/trunk/managed/Warp3D/BasicWarp3D/My Project/Settings.Designer.vb deleted file mode 100644 index d5e901bf..00000000 --- a/trunk/managed/Warp3D/BasicWarp3D/My Project/Settings.Designer.vb +++ /dev/null @@ -1,73 +0,0 @@ -'------------------------------------------------------------------------------ -' -' This code was generated by a tool. -' Runtime Version:2.0.50727.42 -' -' Changes to this file may cause incorrect behavior and will be lost if -' the code is regenerated. -' -'------------------------------------------------------------------------------ - -Option Strict On -Option Explicit On - - -Namespace My - - _ - Partial Friend NotInheritable Class MySettings - Inherits Global.System.Configuration.ApplicationSettingsBase - - Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings), MySettings) - -#Region "My.Settings Auto-Save Functionality" -#If _MyType = "WindowsForms" Then - Private Shared addedHandler As Boolean - - Private Shared addedHandlerLockObject As New Object - - _ - Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs) - If My.Application.SaveMySettingsOnExit Then - My.Settings.Save() - End If - End Sub -#End If -#End Region - - Public Shared ReadOnly Property [Default]() As MySettings - Get - -#If _MyType = "WindowsForms" Then - If Not addedHandler Then - SyncLock addedHandlerLockObject - If Not addedHandler Then - AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings - addedHandler = True - End If - End SyncLock - End If -#End If - Return defaultInstance - End Get - End Property - End Class -End Namespace - -Namespace My - - _ - Friend Module MySettingsProperty - - _ - Friend ReadOnly Property Settings() As Global.BasicWarp3D.My.MySettings - Get - Return Global.BasicWarp3D.My.MySettings.Default - End Get - End Property - End Module -End Namespace diff --git a/trunk/managed/Warp3D/BasicWarp3D/My Project/Settings.settings b/trunk/managed/Warp3D/BasicWarp3D/My Project/Settings.settings deleted file mode 100644 index 377f56d6..00000000 --- a/trunk/managed/Warp3D/BasicWarp3D/My Project/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/trunk/managed/Warp3D/TestWarp/MCI.cs b/trunk/managed/Warp3D/TestWarp/MCI.cs deleted file mode 100644 index 87900e13..00000000 --- a/trunk/managed/Warp3D/TestWarp/MCI.cs +++ /dev/null @@ -1,250 +0,0 @@ -using System; -using System.Runtime.InteropServices; -using System.Text; -using System.IO; - -namespace MCI -{ - public delegate void PositionEventHandler(object sender, PositionChangedEventArgs e); - - public class Media - { - private System.Windows.Forms.Timer timer1; - public bool FileIsOpen = false; - - public event PositionEventHandler PositionChanged; - - [DllImport("winmm.dll")] - private static extern long mciSendString(string strCommand,StringBuilder strReturn,int iReturnLength, IntPtr hwndCallback); - [DllImport("Winmm.dll")] - private static extern long PlaySound(byte[] data, IntPtr hMod, UInt32 dwFlags); - private string sCommand; - private StringBuilder sBuffer = new StringBuilder(128); - private bool m_Repeat = false; - private bool m_Pause = false; - private int seconds; - - public Media() - { - timer1 = new System.Windows.Forms.Timer(); - timer1.Enabled = false; - timer1.Interval = 100; - timer1.Tick += new System.EventHandler(this.timer1_Tick); - } - - private void timer1_Tick(object sender, System.EventArgs e) - { - PositionChangedEventArgs pArgs = new PositionChangedEventArgs(this.Position); - - if(PositionChanged != null) - PositionChanged(this,pArgs); - } - - public void Close() - { - sCommand = "close MediaFile"; - mciSendString(sCommand, null, 0, IntPtr.Zero); - - timer1.Enabled = false; - FileIsOpen = false; - } - - public void Stop() - { - this.Position = 0; - sCommand = "stop MediaFile"; - mciSendString(sCommand, null, 0, IntPtr.Zero); - - timer1.Enabled = false; - } - - public bool Pause - { - get - { - return m_Pause; - } - set - { - m_Pause = value; - - if(m_Pause) - sCommand = "pause MediaFile"; - else - sCommand = "resume MediaFile"; - - mciSendString(sCommand, null, 0, IntPtr.Zero); - } - } - - public void Open(string sFileName) - { - if(this.Status() == "playing") - this.Close(); - - sCommand = "open \"" + sFileName + "\" type mpegvideo alias MediaFile"; - mciSendString(sCommand, null, 0, IntPtr.Zero); - - FileIsOpen = true; - } - - public void Open(string sFileName,System.Windows.Forms.PictureBox videobox) - { - if(this.Status() == "playing") - this.Close(); - - sCommand = "open \"" + sFileName + "\" type mpegvideo alias MediaFile style child parent " + videobox.Handle.ToInt32(); - mciSendString(sCommand, null, 0, IntPtr.Zero); - sCommand = "put MediaFile window at 0 0 " + videobox.Width + " " +videobox.Height; - mciSendString(sCommand, null, 0, IntPtr.Zero); - - FileIsOpen = true; - } - - public void Play() - { - if(FileIsOpen) - { - sCommand = "play MediaFile"; - - if (Repeat) - sCommand += " REPEAT"; - - mciSendString(sCommand, null, 0, IntPtr.Zero); - - timer1.Enabled = true; - } - } - - public void FullScreen() - { - sCommand = "play MediaFile FullScreen"; - mciSendString(sCommand, null, 0, IntPtr.Zero); - } - - public int Position - { - set - { - seconds = value; - seconds = seconds * 1000; - sCommand = "play MediaFile from " + seconds.ToString(); - mciSendString(sCommand, null, 0, IntPtr.Zero); - } - - get - { - sCommand = "status MediaFile position"; - mciSendString(sCommand, sBuffer, sBuffer.Capacity, IntPtr.Zero); - - seconds = int.Parse(sBuffer.ToString()); - seconds = seconds /1000; - return seconds; - } - } - - public int Duration() - { - int ReturnSeconds; - sCommand = "status MediaFile length"; - mciSendString(sCommand, sBuffer, 128, IntPtr.Zero); - - ReturnSeconds = int.Parse(sBuffer.ToString()); - ReturnSeconds = ReturnSeconds /1000; - return ReturnSeconds; - } - - public string Status() - { - mciSendString("status MediaFile mode", sBuffer, sBuffer.Capacity, IntPtr.Zero); - return sBuffer.ToString(); - } - - public int Volume - { - get - { - if(Status() != "") - { - mciSendString("status MediaFile volume", sBuffer, sBuffer.Capacity, IntPtr.Zero); - return int.Parse(sBuffer.ToString()); - } - else - { - return 0; - } - } - set - { - if(value <= 1000) - { - mciSendString("setaudio MediaFile volume to " + value.ToString(), null, 0, IntPtr.Zero); - } - else - { - System.Windows.Forms.MessageBox.Show("Volume value must be smaller than 1000"); - } - } - } - - public bool Repeat - { - get - { - return m_Repeat; - } - set - { - m_Repeat = value; - } - } - - public string SecondsToTime(int seconds) - { - int hours,minutes; - - hours = seconds / 3600; - minutes = seconds / 60; - minutes = minutes % 60; - seconds = seconds % 60; - - return hours.ToString("00") + ":" + minutes.ToString("00") + ":" + seconds.ToString("00"); - } - - public void PlayWavResource(string wav) - { - // get the namespace - string strNameSpace = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name.ToString(); - - // get the resource into a stream - Stream str = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream( strNameSpace +"."+ wav ); - - if ( str == null ) - return; - // bring stream into a byte array - byte[] bStr = new Byte[str.Length]; - str.Read(bStr, 0, (int)str.Length); - - // play the resource - PlaySound(bStr, IntPtr.Zero, 1 | 4 | 8); - } - } - - public class PositionChangedEventArgs : EventArgs - { - private int _position; - - public PositionChangedEventArgs(int num) - { - this._position = num; - } - - public int newPosition - { - get - { - return _position; - } - } - } -} diff --git a/trunk/managed/Warp3D/TestWarp/OdeWarpHelpers.cs b/trunk/managed/Warp3D/TestWarp/OdeWarpHelpers.cs deleted file mode 100644 index 4617d198..00000000 --- a/trunk/managed/Warp3D/TestWarp/OdeWarpHelpers.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System; -using Rednettle.Warp3D; - -namespace Ode -{ - /// - /// Summary description for OdeDxHelpers. - /// - public sealed class OdeWarpHelpers - { - private OdeWarpHelpers() { } - - public static warp_Matrix Ode2WarpMatrix( Ode.Matrix3 m ) - { - warp_Matrix result = new warp_Matrix(); - - result.m11 = ( float )m.m11; - result.m12 = ( float )m.m12; - result.m13 = ( float )m.m13; - - result.m21 = ( float )m.m21; - result.m22 = ( float )m.m22; - result.m23 = ( float )m.m23; - - result.m31 = ( float )m.m31; - result.m32 = ( float )m.m32; - result.m33 = ( float )m.m33; - - return result; - } - - public static Ode.Matrix3 Warp2OdeMatrix3( warp_Matrix m ) - { - Ode.Matrix3 odeM = new Ode.Matrix3(); - - odeM.m11 = m.m11; - odeM.m12 = m.m12; - odeM.m13 = m.m13; - - odeM.m21 = m.m21; - odeM.m22 = m.m22; - odeM.m23 = m.m23; - - odeM.m31 = m.m31; - odeM.m32 = m.m32; - odeM.m33 = m.m33; - - return odeM; - } - - public static warp_Quaternion Ode2WarpQuaternion( Ode.Quaternion odeQ ) - { - warp_Quaternion q = new warp_Quaternion( - ( float )odeQ.X, - ( float )odeQ.Y, - ( float )odeQ.Z, - ( float )odeQ.W ); - - return q; - } - - public static Ode.Quaternion Warp2OdeQuaternion( warp_Quaternion q ) - { - Ode.Quaternion odeQ = new Ode.Quaternion(); - - odeQ.W = q.W; - odeQ.X = q.X; - odeQ.Y = q.Y; - odeQ.Z = q.Z; - - return odeQ; - } - - public static warp_Vector Ode2DxVector3( Ode.Vector3 odeV ) - { - return new warp_Vector( ( float )odeV.X, ( float )odeV.Y, ( float )odeV.Z ); - } - - public static Ode.Vector3 Dx2OdeVector3( warp_Vector dxV ) - { - return new Ode.Vector3( dxV.x, dxV.y, dxV.z ); - } - } -} diff --git a/trunk/managed/Warp3D/TestWarp/Program.cs b/trunk/managed/Warp3D/TestWarp/Program.cs deleted file mode 100644 index 5a62a503..00000000 --- a/trunk/managed/Warp3D/TestWarp/Program.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Collections; -using System.Windows.Forms; - -namespace TestWarp -{ - static class Program - { - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main() - { - Application.EnableVisualStyles(); - Application.Run(new Warp()); - } - } -} \ No newline at end of file diff --git a/trunk/managed/Warp3D/TestWarp/Properties/AssemblyInfo.cs b/trunk/managed/Warp3D/TestWarp/Properties/AssemblyInfo.cs deleted file mode 100644 index 5159c0ed..00000000 --- a/trunk/managed/Warp3D/TestWarp/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("TestWarp")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("TestWarp")] -[assembly: AssemblyCopyright("Copyright © 2005")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM componenets. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("600296e6-e905-4892-a624-8ae680586e33")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/trunk/managed/Warp3D/TestWarp/Properties/Resources.Designer.cs b/trunk/managed/Warp3D/TestWarp/Properties/Resources.Designer.cs deleted file mode 100644 index 2bb38ca0..00000000 --- a/trunk/managed/Warp3D/TestWarp/Properties/Resources.Designer.cs +++ /dev/null @@ -1,74 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50215.44 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "TestWarp.Properties.Resources.get_ResourceManager():System.Resources.ResourceManager")] -[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "TestWarp.Properties.Resources.get_Culture():System.Globalization.CultureInfo")] -[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "TestWarp.Properties.Resources.set_Culture(System.Globalization.CultureInfo):Void")] - -namespace TestWarp.Properties -{ - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources - { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() - { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager - { - get - { - if ((resourceMan == null)) - { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("TestWarp.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture - { - get - { - return resourceCulture; - } - set - { - resourceCulture = value; - } - } - } -} diff --git a/trunk/managed/Warp3D/TestWarp/Properties/Resources.resx b/trunk/managed/Warp3D/TestWarp/Properties/Resources.resx deleted file mode 100644 index ffecec85..00000000 --- a/trunk/managed/Warp3D/TestWarp/Properties/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/trunk/managed/Warp3D/TestWarp/Properties/Settings.Designer.cs b/trunk/managed/Warp3D/TestWarp/Properties/Settings.Designer.cs deleted file mode 100644 index a3fb355e..00000000 --- a/trunk/managed/Warp3D/TestWarp/Properties/Settings.Designer.cs +++ /dev/null @@ -1,31 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50215.44 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -[assembly: global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode", Scope = "member", Target = "TestWarp.Properties.Settings.get_Default():TestWarp.Properties.Settings")] - -namespace TestWarp.Properties -{ - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase - { - - private static Settings defaultInstance = new Settings(); - - public static Settings Default - { - get - { - return defaultInstance; - } - } - } -} diff --git a/trunk/managed/Warp3D/TestWarp/Properties/Settings.settings b/trunk/managed/Warp3D/TestWarp/Properties/Settings.settings deleted file mode 100644 index abf36c5d..00000000 --- a/trunk/managed/Warp3D/TestWarp/Properties/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/trunk/managed/Warp3D/TestWarp/TestWarp.csproj b/trunk/managed/Warp3D/TestWarp/TestWarp.csproj deleted file mode 100644 index 0925d3ca..00000000 --- a/trunk/managed/Warp3D/TestWarp/TestWarp.csproj +++ /dev/null @@ -1,149 +0,0 @@ - - - Debug - AnyCPU - 8.0.50727 - 2.0 - {0F882E9B-E9A2-4273-BA14-93E5CBB82489} - WinExe - Properties - TestWarp - TestWarp - - - SAK - SAK - SAK - SAK - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - true - AnyCPU - - - pdbonly - true - bin\Debug\ - TRACE - prompt - 4 - true - AnyCPU - - - bin\Original\ - true - true - - - bin\64Bit CPU%27s\ - - - true - bin\x64\Debug\ - DEBUG;TRACE - full - x64 - prompt - - - bin\x64\Release\ - TRACE - true - pdbonly - x64 - prompt - - - bin\x64\Original\ - true - true - x64 - - - bin\x64\64Bit CPU%27s\ - x64 - - - true - bin\Slixel Tester\ - DEBUG;TRACE - full - AnyCPU - \rules - true - GlobalSuppressions.cs - prompt - - - true - bin\x64\Slixel Tester\ - DEBUG;TRACE - full - x64 - \rules - true - GlobalSuppressions.cs - prompt - - - - False - ..\debug\ode.dll - - - - - - - - - - - - Form - - - Warp.cs - - - - - - Warp.cs - Designer - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - {6E48530B-16AB-4861-9CED-97334739D675} - Warp3D %28Warp3D\Warp3D%29 - - - - \ No newline at end of file diff --git a/trunk/managed/Warp3D/TestWarp/TestWarp.csproj.vspscc b/trunk/managed/Warp3D/TestWarp/TestWarp.csproj.vspscc deleted file mode 100644 index feffdeca..00000000 --- a/trunk/managed/Warp3D/TestWarp/TestWarp.csproj.vspscc +++ /dev/null @@ -1,10 +0,0 @@ -"" -{ -"FILE_VERSION" = "9237" -"ENLISTMENT_CHOICE" = "NEVER" -"PROJECT_FILE_RELATIVE_PATH" = "" -"NUMBER_OF_EXCLUDED_FILES" = "0" -"ORIGINAL_PROJECT_FILE_PATH" = "" -"NUMBER_OF_NESTED_PROJECTS" = "0" -"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" -} diff --git a/trunk/managed/Warp3D/TestWarp/Warp.Designer.cs b/trunk/managed/Warp3D/TestWarp/Warp.Designer.cs deleted file mode 100644 index c6c9dc79..00000000 --- a/trunk/managed/Warp3D/TestWarp/Warp.Designer.cs +++ /dev/null @@ -1,184 +0,0 @@ -namespace TestWarp -{ - partial class Warp - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.Load_Scene = new System.Windows.Forms.Button(); - this.button_Flare1 = new System.Windows.Forms.Button(); - this.button_Stones = new System.Windows.Forms.Button(); - this.button_Bounce = new System.Windows.Forms.Button(); - this.button_Studio = new System.Windows.Forms.Button(); - this.button_Physics = new System.Windows.Forms.Button(); - this.button_Body = new System.Windows.Forms.Button(); - this.button_Sphere = new System.Windows.Forms.Button(); - this.warp3D1 = new Warp3D.Warp3D(); - this.label1 = new System.Windows.Forms.Label(); - this.SuspendLayout(); - // - // Load_Scene - // - this.Load_Scene.Anchor = ( ( System.Windows.Forms.AnchorStyles )( ( System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left ) ) ); - this.Load_Scene.Location = new System.Drawing.Point( 12, 503 ); - this.Load_Scene.Name = "Load_Scene"; - this.Load_Scene.Size = new System.Drawing.Size( 75, 23 ); - this.Load_Scene.TabIndex = 1; - this.Load_Scene.Text = "Chair"; - this.Load_Scene.Click += new System.EventHandler( this.Load_Scene_Click ); - // - // button_Flare1 - // - this.button_Flare1.Anchor = ( ( System.Windows.Forms.AnchorStyles )( ( System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left ) ) ); - this.button_Flare1.Location = new System.Drawing.Point( 93, 503 ); - this.button_Flare1.Name = "button_Flare1"; - this.button_Flare1.Size = new System.Drawing.Size( 75, 23 ); - this.button_Flare1.TabIndex = 2; - this.button_Flare1.Text = "Flare"; - this.button_Flare1.Click += new System.EventHandler( this.button_Flare1_Click ); - // - // button_Stones - // - this.button_Stones.Anchor = ( ( System.Windows.Forms.AnchorStyles )( ( System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left ) ) ); - this.button_Stones.Location = new System.Drawing.Point( 174, 503 ); - this.button_Stones.Name = "button_Stones"; - this.button_Stones.Size = new System.Drawing.Size( 75, 23 ); - this.button_Stones.TabIndex = 3; - this.button_Stones.Text = "Stones"; - this.button_Stones.Click += new System.EventHandler( this.button_Stones_Click ); - // - // button_Bounce - // - this.button_Bounce.Anchor = ( ( System.Windows.Forms.AnchorStyles )( ( System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left ) ) ); - this.button_Bounce.Location = new System.Drawing.Point( 255, 503 ); - this.button_Bounce.Name = "button_Bounce"; - this.button_Bounce.Size = new System.Drawing.Size( 75, 23 ); - this.button_Bounce.TabIndex = 4; - this.button_Bounce.Text = "Objects"; - this.button_Bounce.Click += new System.EventHandler( this.button_Bounce_Click ); - // - // button_Studio - // - this.button_Studio.Anchor = ( ( System.Windows.Forms.AnchorStyles )( ( System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left ) ) ); - this.button_Studio.Location = new System.Drawing.Point( 336, 503 ); - this.button_Studio.Name = "button_Studio"; - this.button_Studio.Size = new System.Drawing.Size( 75, 23 ); - this.button_Studio.TabIndex = 5; - this.button_Studio.Text = "3Ds"; - this.button_Studio.Click += new System.EventHandler( this.button_Studio_Click ); - // - // button_Physics - // - this.button_Physics.Anchor = ( ( System.Windows.Forms.AnchorStyles )( ( System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left ) ) ); - this.button_Physics.Location = new System.Drawing.Point( 417, 503 ); - this.button_Physics.Name = "button_Physics"; - this.button_Physics.Size = new System.Drawing.Size( 75, 23 ); - this.button_Physics.TabIndex = 6; - this.button_Physics.Text = "Physics"; - this.button_Physics.Click += new System.EventHandler( this.button_Physics_Click ); - // - // button_Body - // - this.button_Body.Anchor = ( ( System.Windows.Forms.AnchorStyles )( ( System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right ) ) ); - this.button_Body.Enabled = false; - this.button_Body.Location = new System.Drawing.Point( 450, 12 ); - this.button_Body.Name = "button_Body"; - this.button_Body.Size = new System.Drawing.Size( 42, 23 ); - this.button_Body.TabIndex = 10; - this.button_Body.Text = "cube"; - this.button_Body.Click += new System.EventHandler( this.button_Body_Click ); - // - // button_Sphere - // - this.button_Sphere.Anchor = ( ( System.Windows.Forms.AnchorStyles )( ( System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right ) ) ); - this.button_Sphere.Enabled = false; - this.button_Sphere.Location = new System.Drawing.Point( 450, 41 ); - this.button_Sphere.Name = "button_Sphere"; - this.button_Sphere.Size = new System.Drawing.Size( 42, 23 ); - this.button_Sphere.TabIndex = 11; - this.button_Sphere.Text = "sphere"; - this.button_Sphere.Click += new System.EventHandler( this.button_Sphere_Click ); - // - // warp3D1 - // - this.warp3D1.Anchor = ( ( System.Windows.Forms.AnchorStyles )( ( ( ( System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom ) - | System.Windows.Forms.AnchorStyles.Left ) - | System.Windows.Forms.AnchorStyles.Right ) ) ); - this.warp3D1.Location = new System.Drawing.Point( 12, 12 ); - this.warp3D1.Name = "warp3D1"; - this.warp3D1.Size = new System.Drawing.Size( 429, 462 ); - this.warp3D1.TabIndex = 0; - // - // label1 - // - this.label1.Anchor = System.Windows.Forms.AnchorStyles.Bottom; - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point( 12, 542 ); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size( 351, 13 ); - this.label1.TabIndex = 12; - this.label1.Text = "Use the mouse to rotate the scene. Hold down control to zoom in and out."; - // - // Warp - // - this.AutoScaleDimensions = new System.Drawing.SizeF( 6F, 13F ); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size( 503, 564 ); - this.Controls.Add( this.label1 ); - this.Controls.Add( this.button_Sphere ); - this.Controls.Add( this.button_Body ); - this.Controls.Add( this.button_Physics ); - this.Controls.Add( this.button_Studio ); - this.Controls.Add( this.button_Bounce ); - this.Controls.Add( this.button_Stones ); - this.Controls.Add( this.button_Flare1 ); - this.Controls.Add( this.Load_Scene ); - this.Controls.Add( this.warp3D1 ); - this.Name = "Warp"; - this.Text = "Warp Demos"; - this.Load += new System.EventHandler( this.Form1_Load ); - this.ResumeLayout( false ); - this.PerformLayout(); - - } - - #endregion - - private Warp3D.Warp3D warp3D1; - private System.Windows.Forms.Button Load_Scene; - private System.Windows.Forms.Button button_Flare1; - private System.Windows.Forms.Button button_Stones; - private System.Windows.Forms.Button button_Bounce; - private System.Windows.Forms.Button button_Studio; - private System.Windows.Forms.Button button_Physics; - private System.Windows.Forms.Button button_Body; - private System.Windows.Forms.Button button_Sphere; - private System.Windows.Forms.Label label1; - - - } -} - diff --git a/trunk/managed/Warp3D/TestWarp/Warp.cs b/trunk/managed/Warp3D/TestWarp/Warp.cs deleted file mode 100644 index 16f2d30b..00000000 --- a/trunk/managed/Warp3D/TestWarp/Warp.cs +++ /dev/null @@ -1,476 +0,0 @@ -using System; -using System.Collections; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Text; -using System.Windows.Forms; -using System.Diagnostics; - -using MCI; - -using Ode; - - -namespace TestWarp -{ - - public partial class Warp : Form - { - /* - * ODE stuff - */ - protected Ode.World _world= new Ode.World(); - protected Ode.Space _space = new Ode.HashSpace(); - protected Ode.JointGroup _contactGroup = new Ode.JointGroup(); - private Ode.CollideHandler collideCallback; - protected Ode.Geom _floor; - protected PlaneGeom[] _walls; - private const int HALF_WIDTH = 256; - private const int HALF_LENGTH = 256; - protected bool _useStepFast = false; - private const float MAX_STEP_SIZE = 0.1f; - private DateTime lastframe = DateTime.MinValue; - private double leftOverTime = 0; - protected bool pauseSim; - Ode.Vector3 _prevpos = new Vector3(); - int _bodyIndex = 0; - Body[] _body = new Body[ 500 ]; - Geom _geom; - - - /* - * End - */ - - - private Media media = new Media(); - - Timer Clock; - enum State - { - demo1, demo2, demo3, demo4, demo5, demo6 - } - - - State _state = State.demo1; - - - public Warp() - { - InitializeComponent(); - } - - private void Form1_Load(object sender, EventArgs e) - { - warp3D1.DisplayDefaultScene(); - //media.PlayWavResource( "tunes.Bass_Is_Extra_90bpm.wav" ); - - Clock = new Timer(); - Clock.Interval = 50; - - Clock.Tick += new EventHandler( Timer_Tick ); - - Clock.Start(); - } - - public void Timer_Tick( object sender, EventArgs eArgs ) - { - if ( sender == Clock ) - { - switch (_state) - { - case State.demo1: - warp3D1.RotateObject( "LensFlare1", -.05f, -.15f, -.05f ); - warp3D1.RotateScene( .05f, .05f, .05f ); - break; - - case State.demo6: - UpdateWorld(); - - for ( int q = 0; q < _body.Length; q++ ) - { - if ( _body[ q ] != null ) - { - Ode.Vector3 pos = _body[ q ].Position; - - warp3D1.RotateSelf( "cube"+q, OdeWarpHelpers.Ode2WarpQuaternion( _body[ q ].Quaternion ) ); - warp3D1.SetPos( "cube" + q, pos.X, pos.Y, pos.Z ); - } - } - - break; - - case State.demo4: - warp3D1.RotateModelSelf( "satellite", -.15f, -.15f, -.15f ); - warp3D1.RotateModel( "satellite", -.02f, -.02f, -.02f ); - break; - - case State.demo3: - case State.demo2: - warp3D1.RotateScene( .05f, .05f, .05f ); - break; - } - - warp3D1.Render(); - warp3D1.Refresh(); - } - } - - private void Load_Scene_Click(object sender, EventArgs e) - { - _state = State.demo1; - - warp3D1.CreateScene(512, 512); - warp3D1.SetBackgroundColor( 0xECE9D8 ); - - Hashtable objects = warp3D1.Import3Ds( "chair", "DesignerChair3.3ds", true ); - - warp3D1.AddLight("Light1", -1f, -1f, -1f, 0xffffff, 320, 200); - warp3D1.AddLight("Light2", .2f, .2f, 1f, 0xffffff, 320, 200); - - warp3D1.AddMaterial("seat"); - warp3D1.SetTexture("seat", "glass.jpg"); - warp3D1.SetReflectivity("seat", 80); - warp3D1.SetTransparency("seat", 180); - warp3D1.SetWireframe( "seat", true ); - - warp3D1.AddMaterial("wood"); - warp3D1.SetTexture("wood", "cream.jpg"); - warp3D1.SetReflectivity("wood", 100); - - warp3D1.AddMaterial("strut"); - warp3D1.SetTexture("strut", "chrome.jpg"); - warp3D1.SetReflectivity("strut", 255); - warp3D1.SetEnvMap("strut", "skymap.jpg"); - - warp3D1.SetObjectMaterial("chair_Object", "seat"); - warp3D1.SetObjectMaterial( "chair_Object", "seat" ); - warp3D1.SetObjectMaterial( "chair_Object01", "wood" ); - warp3D1.SetObjectMaterial( "chair_Object02", "wood" ); - warp3D1.SetObjectMaterial( "chair_Object03", "strut" ); - warp3D1.SetObjectMaterial( "chair_Object04", "strut" ); - warp3D1.SetObjectMaterial( "chair_Object05", "strut" ); - warp3D1.SetObjectMaterial( "chair_Object06", "strut" ); - warp3D1.SetObjectMaterial( "chair_Object07", "strut" ); - warp3D1.SetObjectMaterial( "chair_Object08", "strut" ); - warp3D1.SetObjectMaterial( "chair_Object09", "strut" ); - - warp3D1.NormaliseScene(); - - warp3D1.Render(); - warp3D1.Refresh(); - } - - private void button_Flare1_Click( object sender, EventArgs e ) - { - _state = State.demo2; - - warp3D1.CreateScene( 512, 512 ); - - warp3D1.SetBackgroundMaterial( "stardust.material" ); - warp3D1.AddMaterial( "metal" ); - warp3D1.SetEnvMap( "metal", "chrome.jpg" ); - warp3D1.SetReflectivity( "metal", 255 ); - - warp3D1.AddLight( "Light1", 0.2f, 0.2f, 1f, 0xffffff, 320, 80 ); - - Hashtable objects = warp3D1.Import3Ds( "wobble", "wobble.3ds", true ); - foreach ( DictionaryEntry myDE in objects ) - { - string name = (string)myDE.Key; - warp3D1.SetObjectMaterial( name, "metal" ); - } - - warp3D1.AddLensFlare("LensFlare1"); - warp3D1.NormaliseScene(); - - warp3D1.ScaleObject( "LensFlare1", 60f ); - warp3D1.ScaleScene( 0.5f, 0.5f, 0.5f ); - - warp3D1.Render(); - warp3D1.Refresh(); - } - - private void button_Stones_Click( object sender, EventArgs e ) - { - _state = State.demo3; - - warp3D1.CreateScene( 512, 512 ); - warp3D1.SetBackgroundColor( 0xECE9D8 ); - - warp3D1.AddMaterial( "Stone1" ); - warp3D1.SetTexture( "Stone1", "stone1.jpg" ); - - warp3D1.AddMaterial( "Stone2" ); - warp3D1.SetTexture( "Stone2", "stone2.jpg" ); - - warp3D1.AddMaterial( "Stone3" ); - warp3D1.SetTexture( "Stone3", "stone3.jpg" ); - - warp3D1.AddMaterial( "Stone4" ); - warp3D1.SetTexture( "Stone4", "stone4.jpg" ); - - warp3D1.AddLight( "Light1", 0.2f, 0.2f, 1f , 0xFFFFFF, 144, 120 ); - warp3D1.AddLight( "Light2", -1f, -1f, 1f , 0x332211, 100, 40 ); - warp3D1.AddLight( "Light3", -1f, -1f, 1f , 0x666666, 200, 120 ); - - Hashtable objects = warp3D1.Import3Ds( "wobble", "wobble.3ds", true ); - foreach ( DictionaryEntry myDE in objects ) - { - string name = ( string )myDE.Key; - warp3D1.ProjectFrontal( name ); - } - - warp3D1.SetObjectMaterial( "wobble_Sphere1", "Stone1" ); - warp3D1.SetObjectMaterial( "wobble_Wobble1", "Stone2" ); - warp3D1.SetObjectMaterial( "wobble_Wobble2", "Stone3" ); - warp3D1.SetObjectMaterial( "wobble_Wobble3", "Stone4" ); - - warp3D1.NormaliseScene(); - warp3D1.ShiftObject( "Wobble3", 55f, 1f, 1f ); - warp3D1.ScaleScene( 0.5f, 0.5f, 0.5f ); - - warp3D1.Render(); - warp3D1.Refresh(); - } - - private void button_Bounce_Click( object sender, EventArgs e ) - { - _state = State.demo4; - - warp3D1.CreateScene( 512, 512 ); - warp3D1.SetBackgroundMaterial( "stardust.material" ); - - warp3D1.AddMaterial( "earth" ); - warp3D1.SetTexture( "earth", "land_shallow_topo_1024.jpg" ); - warp3D1.SetReflectivity( "earth", 200 ); - - warp3D1.AddMaterial( "panel" ); - warp3D1.SetTexture( "panel", "icesolar.JPG" ); - warp3D1.SetReflectivity( "panel", 225 ); - - warp3D1.AddLight( "Light1", 0.2f, 0.2f, 1f, 0xFFFFFF, 144, 120 ); - warp3D1.AddLight( "Light2", -1f, -1f, 1f, 0x332211, 100, 40 ); - warp3D1.AddLight( "Light3", -1f, -1f, 1f, 0x666666, 200, 120 ); - - Hashtable objects = warp3D1.Import3Ds( "satellite", "voyager.3ds", true ); - foreach ( DictionaryEntry myDE in objects ) - { - string name = ( string )myDE.Key; - warp3D1.SetObjectMaterial( name, "panel" ); - } - - warp3D1.ScaleModel( "satellite", .002f ); - warp3D1.TranslateModel( "satellite", .66f,.66f,0f ); - - warp3D1.AddSphere( "Sphere1", .65f, 32 ); - warp3D1.SetObjectMaterial( "Sphere1", "earth" ); - - warp3D1.Render(); - warp3D1.Refresh(); - Clock.Start(); - } - - private void button_Studio_Click( object sender, EventArgs e ) - { - _state = State.demo5; - - warp3D1.CreateScene( 512, 512 ); - warp3D1.SetBackgroundColor( 0xECE9D8 ); - - warp3D1.AddMaterial( "panel" ); - warp3D1.SetTexture( "panel", "voyager.jpg" ); - warp3D1.SetReflectivity( "panel", 225 ); - - warp3D1.AddMaterial( "default" ); - warp3D1.SetReflectivity( "default", 225 ); - warp3D1.SetTexture( "default", "chrome.jpg" ); - - warp3D1.AddLight( "Light1", 0f, 0f, 1f, 0xFFFFFF, 320, 120 ); - - Hashtable objects = warp3D1.Import3Ds( "voyager", "voyager.3ds", true ); - foreach ( DictionaryEntry myDE in objects ) - { - string name = ( string )myDE.Key; - warp3D1.SetObjectMaterial( name, "default" ); - } - - warp3D1.SetObjectMaterial( "voyager_Plaque", "panel" ); - warp3D1.NormaliseScene(); - - } - - private void button_Physics_Click( object sender, EventArgs e ) - { - - _state = State.demo6; - - warp3D1.CreateScene( 512, 512 ); - warp3D1.SetBackgroundColor( 0xECE9D8 ); - - warp3D1.AddMaterial( "default", 0x00dd00 ); - warp3D1.SetReflectivity( "default", 255 ); - - warp3D1.AddMaterial( "yellow", 0xffff00 ); - warp3D1.SetReflectivity( "yellow", 200 ); - - warp3D1.AddMaterial( "floor", 0xcccccc ); - warp3D1.AddPlane("plane1", 10f); - warp3D1.SetObjectMaterial("plane1", "floor"); - - - warp3D1.AddLight( "Light1", 0.2f, 0.2f, 1f, 0xFFFFFF, 144, 120 ); - warp3D1.AddLight( "Light2", -1f, 0f, 0f, 0x332211, 100, 40 ); - warp3D1.AddLight( "Light3", 1f, 0f, 0f, 0x666666, 200, 120 ); - warp3D1.AddCube( "cube0", 2f ); - warp3D1.SetObjectMaterial( "cube0", "default" ); - - _world.SetGravity( 0, -9.81f, 0 ); - _world.CFM = 1e-6f; - _floor = new Ode.PlaneGeom( _space, 0, 1, 0, 0 ); - collideCallback = new Ode.CollideHandler( this.CollideCallback ); - - _walls = new PlaneGeom[ 4 ]; - _walls[ 0 ] = new PlaneGeom( _space, 1, 0, 0, -10 ); - _walls[ 1 ] = new PlaneGeom( _space, -1, 0, 0, -10 ); - _walls[ 2 ] = new PlaneGeom( _space, 0, 0, 1, -10 ); - _walls[ 3 ] = new PlaneGeom( _space, 0, 0, -1, -10 ); - - InitialiseWorld(); - - warp3D1.ShiftDefaultCamera( 0f, 0f, -20f ); - - button_Body.Enabled = true; - button_Sphere.Enabled = true; - } - - protected virtual void CollideCallback( Ode.Geom o1, Ode.Geom o2 ) - { - ContactGeom[] cgeoms = o1.Collide( o2, 30 ); - if ( cgeoms.Length > 0 ) - { - Contact[] contacts = Contact.FromContactGeomArray( cgeoms ); - - for ( int i = 0; i < contacts.Length; i++ ) - { - contacts[ i ].Surface.mode = SurfaceMode.Bounce; - contacts[ i ].Surface.mu = 100; //World.Infinity; - contacts[ i ].Surface.bounce = 0.70f; - contacts[ i ].Surface.bounce_vel = 0.05f; - ContactJoint cj = new ContactJoint( _world, _contactGroup, contacts[ i ] ); - cj.Attach( contacts[ i ].Geom.Geom1.Body, contacts[ i ].Geom.Geom2.Body ); - } - } - } - - private void UpdateWorld() - { - if ( lastframe == DateTime.MinValue || pauseSim ) - { - lastframe = DateTime.Now; - return; - } - - DateTime thisframe = DateTime.Now; - TimeSpan elapsed = thisframe - lastframe; - - float t = ( float )( elapsed.TotalSeconds + leftOverTime ); - float st; - - if ( t == 0 ) - return; - - while ( t > 0.02 ) - { - if ( t > MAX_STEP_SIZE ) - { - st = MAX_STEP_SIZE; - t -= MAX_STEP_SIZE; - } - else - { - st = t; - t = 0; - } - - _contactGroup.Empty(); - UpdateWorldForces( st ); - - _space.Collide( collideCallback ); - - if ( _useStepFast ) - _world.StepFast1( st, 5 ); - else - _world.Step( st ); - } - leftOverTime = t; - - lastframe = thisframe; - } - - protected void InitialiseWorld() - { - Mass mass; - mass = new Mass(); - mass.SetBox( 500.0f, 2f, 2f, 2f ); - - _body[_bodyIndex] = new Body( _world ); - _body[_bodyIndex].Position = new Ode.Vector3( 0, 8, 0 ); - _body[ _bodyIndex ].SetMass( mass ); - _body[_bodyIndex].Geoms.Add( new BoxGeom( _space, 2f, 2f, 2f ) ); - } - - protected void RenderWorld() - { - } - - protected void UpdateWorldForces( double stepSize ) - { - // eg _body[n].AddForce( new Ode.Vector3( 0, 0, 1.0f ) ); - } - - private void button_Body_Click( object sender, EventArgs e ) - { - if ( _state != State.demo6 ) - { - return; - } - - _bodyIndex++; - - warp3D1.AddCube( "cube" + _bodyIndex, 2f ); - warp3D1.SetObjectMaterial( "cube" + _bodyIndex, "default" ); - - - _body[ _bodyIndex ] = new Body( _world ); - _body[ _bodyIndex ].Position = new Ode.Vector3( 0, 8, 0 ); - _body[ _bodyIndex ].Geoms.Add( new BoxGeom( _space, 2f, 2f, 2f ) ); - - } - - private void button_Sphere_Click( object sender, EventArgs e ) - { - if ( _state != State.demo6 ) - { - return; - } - - _bodyIndex++; - - warp3D1.AddSphere( "cube" + _bodyIndex, 1f, 24 ); - warp3D1.SetObjectMaterial( "cube" + _bodyIndex, "yellow" ); - - _body[ _bodyIndex ] = new Body( _world ); - _body[ _bodyIndex ].Position = new Ode.Vector3( 0, 8, 0 ); - _body[ _bodyIndex ].Geoms.Add( new SphereGeom(_space, 1f)); - } - - private void button_Cancel_Click( object sender, EventArgs e ) - { - - } - - } - -} \ No newline at end of file diff --git a/trunk/managed/Warp3D/TestWarp/Warp.resx b/trunk/managed/Warp3D/TestWarp/Warp.resx deleted file mode 100644 index 8f95d662..00000000 --- a/trunk/managed/Warp3D/TestWarp/Warp.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/trunk/managed/Warp3D/TestWarpVB/MCI.vb b/trunk/managed/Warp3D/TestWarpVB/MCI.vb deleted file mode 100644 index d6feff6d..00000000 --- a/trunk/managed/Warp3D/TestWarpVB/MCI.vb +++ /dev/null @@ -1,224 +0,0 @@ -'using System; -'using System.Runtime.InteropServices; -'using System.Text; -'using System.IO; -Imports System.Text - -Namespace MCI - - Public Delegate Sub PositionEventHandler(ByVal sender As Object, ByVal e As PositionChangedEventArgs) - - Public Class Media - Private timer1 As System.Windows.Forms.Timer - Public FileIsOpen As Boolean = False - Public PositionChanged As PositionEventHandler - - Private Declare Auto Function PlaySound Lib "winmm.dll" (ByVal data() As Byte, ByVal hMod As IntPtr, ByVal dwFlags As Integer) As Long - Private Declare Auto Function mciSendString Lib "winmm.dll" (ByVal strCommand As String, ByRef strReturn As String, ByRef iReturnLength As Integer, ByVal hwndCallback As IntPtr) As Long - ' Private Declare Auto Function mciSendString Lib "winmm.dll" (ByVal strCommand As String, ByVal strReturn As StringBuilder, ByVal iReturnLength As Integer, ByVal hwndCallback As IntPtr) As Long - - ' _ - ' Private Shared Function mciSendString(ByVal strCommand As String, ByVal strReturn As StringBuilder, ByVal iReturnLength As Integer, ByVal hwndCallback As IntPtr) As Long - - ' _ - ' Private Shared Function PlaySound(ByVal data() As Byte, ByVal hMod As IntPtr, ByVal dwFlags As UInt32) As Long - - - Private sCommand As String - Private sBuffer As String 'New StringBuilder(128) - Private m_Repeat As Boolean = False - Private m_Pause As Boolean = False - Private seconds As Integer - - Public Sub New() - timer1 = New System.Windows.Forms.Timer() - timer1.Enabled = False - timer1.Interval = 100 - AddHandler timer1.Tick, AddressOf Me.timer1_Tick - End Sub - - Private Sub timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) - Dim pArgs As New PositionChangedEventArgs(Me.Position) - - If PositionChanged IsNot Nothing Then PositionChanged(Me, pArgs) - End Sub - - Public Sub Close() - sCommand = "close MediaFile" - mciSendString(sCommand, Nothing, 0, IntPtr.Zero) - - timer1.Enabled = False - FileIsOpen = False - End Sub - - Public Sub [Stop]() - Me.Position = 0 - sCommand = "stop MediaFile" - mciSendString(sCommand, Nothing, 0, IntPtr.Zero) - - timer1.Enabled = False - End Sub - - Public Property Pause() As Boolean - Get - Return m_Pause - End Get - Set(ByVal value As Boolean) - m_Pause = value - - If m_Pause Then - sCommand = "pause MediaFile" - Else - sCommand = "resume MediaFile" - End If - - mciSendString(sCommand, Nothing, 0, IntPtr.Zero) - End Set - End Property - - Public Sub Open(ByVal sFileName As String) - If Me.Status() = "playing" Then Me.Close() - - sCommand = "open """ + sFileName + """ type mpegvideo alias MediaFile" - mciSendString(sCommand, Nothing, 0, IntPtr.Zero) - - FileIsOpen = True - End Sub - - Public Sub Open(ByVal sFileName As String, ByVal videobox As System.Windows.Forms.PictureBox) - If Me.Status = "playing" Then Me.Close() - - sCommand = "open """ & sFileName & """ type mpegvideo alias MediaFile style child parent " & videobox.Handle.ToInt32() - mciSendString(sCommand, Nothing, 0, IntPtr.Zero) - sCommand = "put MediaFile window at 0 0 " & videobox.Width & " " & videobox.Height - mciSendString(sCommand, Nothing, 0, IntPtr.Zero) - - FileIsOpen = True - End Sub - - Public Sub Play() - - If FileIsOpen Then - sCommand = "play MediaFile" - - If Repeat Then sCommand += " REPEAT" - - mciSendString(sCommand, Nothing, 0, IntPtr.Zero) - - timer1.Enabled = True - End If - End Sub - - Public Sub FullScreen() - sCommand = "play MediaFile FullScreen" - mciSendString(sCommand, Nothing, 0, IntPtr.Zero) - End Sub - - Public Property Position() As Integer - Get - sCommand = "status MediaFile position" - mciSendString(sCommand, sBuffer, Nothing, IntPtr.Zero) - ' mciSendString(sCommand, sBuffer, sBuffer.Capacity, IntPtr.Zero) - - seconds = Integer.Parse(sBuffer.ToString()) - seconds = seconds \ 1000 - Return seconds - End Get - Set(ByVal value As Integer) - seconds = value - seconds = seconds * 1000 - sCommand = "play MediaFile from " & seconds.ToString() - mciSendString(sCommand, Nothing, 0, IntPtr.Zero) - End Set - End Property - - Public Function Duration() As Integer - Dim ReturnSeconds As Integer - sCommand = "status MediaFile length" - sBuffer = Space(128) - mciSendString(sCommand, sBuffer, 128, IntPtr.Zero) - - ReturnSeconds = Integer.Parse(sBuffer.ToString()) - ReturnSeconds = ReturnSeconds \ 1000 - Return ReturnSeconds - End Function - - Public Function Status() As String - mciSendString("status MediaFile mode", sBuffer, Nothing, IntPtr.Zero) - ' mciSendString(sCommand, sBuffer, sBuffer.Capacity, IntPtr.Zero) - Return sBuffer.ToString() - End Function - - Public Property Volume() As Integer - Get - If Me.Status() <> String.Empty Then - mciSendString("status MediaFile volume", sBuffer, Nothing, IntPtr.Zero) - ' mciSendString(sCommand, sBuffer, sBuffer.Capacity, IntPtr.Zero) - Return Integer.Parse(sBuffer.ToString()) - Else - Return 0 - End If - End Get - Set(ByVal value As Integer) - If value <= 1000 Then - mciSendString("setaudio MediaFile volume to " & value.ToString(), Nothing, 0, IntPtr.Zero) - Else - System.Windows.Forms.MessageBox.Show("Volume value must be smaller than 1000") - End If - End Set - End Property - - Public Property Repeat() As Boolean - Get - Return m_Repeat - End Get - Set(ByVal value As Boolean) - m_Repeat = value - End Set - End Property - - Public Function SecondsToTime(ByVal seconds As Integer) As String - Dim hours, minutes As Integer - - hours = seconds \ 3600 - minutes = seconds \ 60 - minutes = minutes Mod 60 - seconds = seconds Mod 60 - - Return hours.ToString("00") & ":" & minutes.ToString("00") & ":" & seconds.ToString("00") - End Function - - Public Sub PlayWavResource(ByVal wav As String) - '// get the namespace - Dim strNameSpace As String = System.Reflection.Assembly.GetExecutingAssembly().GetName.Name - - '// get the resource into a stream - Dim Str As IO.Stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(strNameSpace & "." & wav) - - If Str Is Nothing Then Return - - '// bring stream into a byte array - Dim bStr(CInt(Str.Length - 1)) As Byte - Str.Read(bStr, 0, CInt(Str.Length)) - - '// play the resource - PlaySound(bStr, IntPtr.Zero, 1 Or 4 Or 8) - End Sub - End Class - - Public Class PositionChangedEventArgs - Inherits EventArgs - - Private _position As Integer - - Public Sub New(ByVal num As Integer) - Me._position = num - End Sub - - Public ReadOnly Property newPosition() As Integer - Get - Return _position - End Get - End Property - End Class -End Namespace diff --git a/trunk/managed/Warp3D/TestWarpVB/MainForm.Designer.vb b/trunk/managed/Warp3D/TestWarpVB/MainForm.Designer.vb deleted file mode 100644 index 39ef43da..00000000 --- a/trunk/managed/Warp3D/TestWarpVB/MainForm.Designer.vb +++ /dev/null @@ -1,160 +0,0 @@ - _ -Partial Class MainForm - Inherits System.Windows.Forms.Form - - 'Form overrides dispose to clean up the component list. - _ - Protected Overrides Sub Dispose(ByVal disposing As Boolean) - If disposing AndAlso components IsNot Nothing Then - components.Dispose() - End If - MyBase.Dispose(disposing) - End Sub - - 'Required by the Windows Form Designer - Private components As System.ComponentModel.IContainer - - 'NOTE: The following procedure is required by the Windows Form Designer - 'It can be modified using the Windows Form Designer. - 'Do not modify it using the code editor. - _ - Private Sub InitializeComponent() - Me.label1 = New System.Windows.Forms.Label - Me.button_Sphere = New System.Windows.Forms.Button - Me.button_Body = New System.Windows.Forms.Button - Me.button_Physics = New System.Windows.Forms.Button - Me.button_Studio = New System.Windows.Forms.Button - Me.button_Bounce = New System.Windows.Forms.Button - Me.button_Stones = New System.Windows.Forms.Button - Me.button_Flare1 = New System.Windows.Forms.Button - Me.Load_Scene = New System.Windows.Forms.Button - Me.warp3D1 = New Warp3DVB.Warp3D.Warp3D - Me.SuspendLayout() - ' - 'label1 - ' - Me.label1.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles) - Me.label1.AutoSize = True - Me.label1.Location = New System.Drawing.Point(9, 446) - Me.label1.Name = "label1" - Me.label1.Size = New System.Drawing.Size(355, 13) - Me.label1.TabIndex = 22 - Me.label1.Text = "Use the mouse to rotate the scene. Hold down control to zoom in and out." - ' - 'button_Sphere - ' - Me.button_Sphere.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) - Me.button_Sphere.Enabled = False - Me.button_Sphere.Location = New System.Drawing.Point(488, 41) - Me.button_Sphere.Name = "button_Sphere" - Me.button_Sphere.Size = New System.Drawing.Size(42, 23) - Me.button_Sphere.TabIndex = 21 - Me.button_Sphere.Text = "sphere" - ' - 'button_Body - ' - Me.button_Body.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) - Me.button_Body.Enabled = False - Me.button_Body.Location = New System.Drawing.Point(488, 12) - Me.button_Body.Name = "button_Body" - Me.button_Body.Size = New System.Drawing.Size(42, 23) - Me.button_Body.TabIndex = 20 - Me.button_Body.Text = "cube" - ' - 'button_Physics - ' - Me.button_Physics.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles) - Me.button_Physics.Location = New System.Drawing.Point(414, 420) - Me.button_Physics.Name = "button_Physics" - Me.button_Physics.Size = New System.Drawing.Size(75, 23) - Me.button_Physics.TabIndex = 19 - Me.button_Physics.Text = "Physics" - ' - 'button_Studio - ' - Me.button_Studio.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles) - Me.button_Studio.Location = New System.Drawing.Point(333, 420) - Me.button_Studio.Name = "button_Studio" - Me.button_Studio.Size = New System.Drawing.Size(75, 23) - Me.button_Studio.TabIndex = 18 - Me.button_Studio.Text = "3Ds" - ' - 'button_Bounce - ' - Me.button_Bounce.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles) - Me.button_Bounce.Location = New System.Drawing.Point(252, 420) - Me.button_Bounce.Name = "button_Bounce" - Me.button_Bounce.Size = New System.Drawing.Size(75, 23) - Me.button_Bounce.TabIndex = 17 - Me.button_Bounce.Text = "Objects" - ' - 'button_Stones - ' - Me.button_Stones.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles) - Me.button_Stones.Location = New System.Drawing.Point(171, 420) - Me.button_Stones.Name = "button_Stones" - Me.button_Stones.Size = New System.Drawing.Size(75, 23) - Me.button_Stones.TabIndex = 16 - Me.button_Stones.Text = "Stones" - ' - 'button_Flare1 - ' - Me.button_Flare1.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles) - Me.button_Flare1.Location = New System.Drawing.Point(90, 420) - Me.button_Flare1.Name = "button_Flare1" - Me.button_Flare1.Size = New System.Drawing.Size(75, 23) - Me.button_Flare1.TabIndex = 15 - Me.button_Flare1.Text = "Flare" - ' - 'Load_Scene - ' - Me.Load_Scene.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles) - Me.Load_Scene.Location = New System.Drawing.Point(9, 420) - Me.Load_Scene.Name = "Load_Scene" - Me.Load_Scene.Size = New System.Drawing.Size(75, 23) - Me.Load_Scene.TabIndex = 14 - Me.Load_Scene.Text = "Chair" - ' - 'warp3D1 - ' - Me.warp3D1.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _ - Or System.Windows.Forms.AnchorStyles.Left) _ - Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) - Me.warp3D1.Location = New System.Drawing.Point(12, 12) - Me.warp3D1.Name = "warp3D1" - Me.warp3D1.Size = New System.Drawing.Size(470, 402) - Me.warp3D1.TabIndex = 13 - ' - 'Form1 - ' - Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) - Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(542, 468) - Me.Controls.Add(Me.label1) - Me.Controls.Add(Me.button_Sphere) - Me.Controls.Add(Me.button_Body) - Me.Controls.Add(Me.button_Physics) - Me.Controls.Add(Me.button_Studio) - Me.Controls.Add(Me.button_Bounce) - Me.Controls.Add(Me.button_Stones) - Me.Controls.Add(Me.button_Flare1) - Me.Controls.Add(Me.Load_Scene) - Me.Controls.Add(Me.warp3D1) - Me.Name = "Form1" - Me.Text = "Form1" - Me.ResumeLayout(False) - Me.PerformLayout() - - End Sub - Private WithEvents label1 As System.Windows.Forms.Label - Private WithEvents button_Sphere As System.Windows.Forms.Button - Private WithEvents button_Body As System.Windows.Forms.Button - Private WithEvents button_Physics As System.Windows.Forms.Button - Private WithEvents button_Studio As System.Windows.Forms.Button - Private WithEvents button_Bounce As System.Windows.Forms.Button - Private WithEvents button_Stones As System.Windows.Forms.Button - Private WithEvents button_Flare1 As System.Windows.Forms.Button - Private WithEvents Load_Scene As System.Windows.Forms.Button - Private WithEvents warp3D1 As Warp3DVB.Warp3D.Warp3D - -End Class diff --git a/trunk/managed/Warp3D/TestWarpVB/MainForm.resx b/trunk/managed/Warp3D/TestWarpVB/MainForm.resx deleted file mode 100644 index ff31a6db..00000000 --- a/trunk/managed/Warp3D/TestWarpVB/MainForm.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/trunk/managed/Warp3D/TestWarpVB/MainForm.vb b/trunk/managed/Warp3D/TestWarpVB/MainForm.vb deleted file mode 100644 index 124dfe08..00000000 --- a/trunk/managed/Warp3D/TestWarpVB/MainForm.vb +++ /dev/null @@ -1,412 +0,0 @@ -Public Class MainForm - ' /* - ' * ODE stuff - ' */ - Protected _world As New Ode.World() - Protected _space As Ode.Space = New Ode.HashSpace() - Protected _contactGroup As New Ode.JointGroup() - Private collideCallback As Ode.CollideHandler - Protected _floor As Ode.Geom - Protected _walls As Ode.PlaneGeom() - Private Const HALF_WIDTH As Integer = 256 - Private Const HALF_LENGTH As Integer = 256 - Protected _useStepFast As Boolean = False - Private Const MAX_STEP_SIZE As Single = 0.1F - Private lastframe As DateTime = DateTime.MinValue - Private leftOverTime As Single = 0 - Protected pauseSim As Boolean - Private _prevpos As New Ode.Vector3 - Private _bodyIndex As Integer = 0 - Private _body(499) As Ode.Body - Private _geom As Ode.Geom - - - '/* - ' * End - ' */ - - - ' Private media As New MCI.Media() - Private WithEvents Clock As Timer - - Enum State - demo1 - demo2 - demo3 - demo4 - demo5 - demo6 - End Enum - - - Private _state As State = State.demo1 - - - - Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load - warp3D1.DisplayDefaultScene() - '//media.PlayWavResource( "tunes.Bass_Is_Extra_90bpm.wav" ); - - Clock = New Timer() - Clock.Interval = 50 - - Clock.Start() - End Sub - - Public Sub Timer_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Clock.Tick - If sender Is Clock Then - Select Case _state - Case State.demo1 - warp3D1.RotateObject("LensFlare1", -0.05F, -0.15F, -0.05F) - warp3D1.RotateScene(0.05F, 0.05F, 0.05F) - - - Case State.demo6 - UpdateWorld() - - For q As Integer = 0 To _body.Length - 1 - If _body(q) IsNot Nothing Then - Dim pos As Ode.Vector3 = _body(q).Position - - warp3D1.RotateSelf("cube" & q, OdeWarpHelpers.Ode2WarpQuaternion(_body(q).Quaternion)) - warp3D1.SetPos("cube" & q, pos.X, pos.Y, pos.Z) - End If - Next - - - Case State.demo4 - warp3D1.RotateModelSelf("satellite", -0.15F, -0.15F, -0.15F) - warp3D1.RotateModel("satellite", -0.02F, -0.02F, -0.02F) - - Case State.demo3 - Case State.demo2 - warp3D1.RotateScene(0.05F, 0.05F, 0.05F) - End Select - - warp3D1.Render() - warp3D1.Refresh() - End If - End Sub - - Private Sub Load_Scene_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Load_Scene.Click - _state = State.demo1 - - warp3D1.CreateScene(512, 512) - warp3D1.SetBackgroundColor(&HECE9D8) - - Dim objects As Collections.Hashtable = warp3D1.Import3Ds("chair", "DesignerChair3.3ds", True) - - warp3D1.AddLight("Light1", -1.0F, -1.0F, -1.0F, &HFFFFFF, 320, 200) - warp3D1.AddLight("Light2", 0.2F, 0.2F, 1.0F, &HFFFFFF, 320, 200) - - warp3D1.AddMaterial("seat") - warp3D1.SetTexture("seat", "glass.jpg") - warp3D1.SetReflectivity("seat", 80) - warp3D1.SetTransparency("seat", 180) - warp3D1.SetWireframe("seat", True) - - warp3D1.AddMaterial("wood") - warp3D1.SetTexture("wood", "cream.jpg") - warp3D1.SetReflectivity("wood", 100) - - warp3D1.AddMaterial("strut") - warp3D1.SetTexture("strut", "chrome.jpg") - warp3D1.SetReflectivity("strut", 255) - warp3D1.SetEnvMap("strut", "skymap.jpg") - - warp3D1.SetObjectMaterial("chair_Object", "seat") - warp3D1.SetObjectMaterial("chair_Object", "seat") - warp3D1.SetObjectMaterial("chair_Object01", "wood") - warp3D1.SetObjectMaterial("chair_Object02", "wood") - warp3D1.SetObjectMaterial("chair_Object03", "strut") - warp3D1.SetObjectMaterial("chair_Object04", "strut") - warp3D1.SetObjectMaterial("chair_Object05", "strut") - warp3D1.SetObjectMaterial("chair_Object06", "strut") - warp3D1.SetObjectMaterial("chair_Object07", "strut") - warp3D1.SetObjectMaterial("chair_Object08", "strut") - warp3D1.SetObjectMaterial("chair_Object09", "strut") - - warp3D1.NormaliseScene() - - warp3D1.Render() - warp3D1.Refresh() - End Sub - - Private Sub button_Flare1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles button_Flare1.Click - _state = State.demo2 - - warp3D1.CreateScene(512, 512) - - warp3D1.SetBackgroundMaterial("stardust.material") - warp3D1.AddMaterial("metal") - warp3D1.SetEnvMap("metal", "chrome.jpg") - warp3D1.SetReflectivity("metal", 255) - - warp3D1.AddLight("Light1", 0.2F, 0.2F, 1.0F, &HFFFFFF, 320, 80) - - Dim objects As Collections.Hashtable = warp3D1.Import3Ds("wobble", "wobble.3ds", True) - For Each myDE As DictionaryEntry In objects - Dim name As String = myDE.Key.ToString - warp3D1.SetObjectMaterial(name, "metal") - Next - warp3D1.AddLensFlare("LensFlare1") - warp3D1.NormaliseScene() - - warp3D1.ScaleObject("LensFlare1", 60.0F) - warp3D1.ScaleScene(0.5F, 0.5F, 0.5F) - - warp3D1.Render() - warp3D1.Refresh() - End Sub - - Private Sub button_Stones_Click(ByVal sender As Object, ByVal e As EventArgs) Handles button_Stones.Click - _state = State.demo3 - - warp3D1.CreateScene(512, 512) - warp3D1.SetBackgroundColor(&HECE9D8) - - warp3D1.AddMaterial("Stone1") - warp3D1.SetTexture("Stone1", "stone1.jpg") - - warp3D1.AddMaterial("Stone2") - warp3D1.SetTexture("Stone2", "stone2.jpg") - - warp3D1.AddMaterial("Stone3") - warp3D1.SetTexture("Stone3", "stone3.jpg") - - warp3D1.AddMaterial("Stone4") - warp3D1.SetTexture("Stone4", "stone4.jpg") - - warp3D1.AddLight("Light1", 0.2F, 0.2F, 1.0F, &HFFFFFF, 144, 120) - warp3D1.AddLight("Light2", -1.0F, -1.0F, 1.0F, &H332211, 100, 40) - warp3D1.AddLight("Light3", -1.0F, -1.0F, 1.0F, &H666666, 200, 120) - - Dim objects As Collections.Hashtable = warp3D1.Import3Ds("wobble", "wobble.3ds", True) - For Each myDE As DictionaryEntry In objects - Dim name As String = myDE.Key.ToString - warp3D1.ProjectFrontal(name) - Next - - warp3D1.SetObjectMaterial("wobble_Sphere1", "Stone1") - warp3D1.SetObjectMaterial("wobble_Wobble1", "Stone2") - warp3D1.SetObjectMaterial("wobble_Wobble2", "Stone3") - warp3D1.SetObjectMaterial("wobble_Wobble3", "Stone4") - - warp3D1.NormaliseScene() - warp3D1.ShiftObject("Wobble3", 55.0F, 1.0F, 1.0F) - warp3D1.ScaleScene(0.5F, 0.5F, 0.5F) - - warp3D1.Render() - warp3D1.Refresh() - End Sub - - Private Sub button_Bounce_Click(ByVal sender As Object, ByVal e As EventArgs) Handles button_Bounce.Click - _state = State.demo4 - - warp3D1.CreateScene(512, 512) - warp3D1.SetBackgroundMaterial("stardust.material") - - warp3D1.AddMaterial("earth") - warp3D1.SetTexture("earth", "land_shallow_topo_1024.jpg") - warp3D1.SetReflectivity("earth", 200) - - warp3D1.AddMaterial("panel") - warp3D1.SetTexture("panel", "icesolar.JPG") - warp3D1.SetReflectivity("panel", 225) - - warp3D1.AddLight("Light1", 0.2F, 0.2F, 1.0F, &HFFFFFF, 144, 120) - warp3D1.AddLight("Light2", -1.0F, -1.0F, 1.0F, &H332211, 100, 40) - warp3D1.AddLight("Light3", -1.0F, -1.0F, 1.0F, &H666666, 200, 120) - - Dim objects As Collections.Hashtable = warp3D1.Import3Ds("satellite", "voyager.3ds", True) - For Each myDE As DictionaryEntry In objects - Dim name As String = myDE.Key.ToString - warp3D1.SetObjectMaterial(name, "panel") - Next - - warp3D1.ScaleModel("satellite", 0.002F) - warp3D1.TranslateModel("satellite", 0.66F, 0.66F, 0.0F) - - warp3D1.AddSphere("Sphere1", 0.65F, 32) - warp3D1.SetObjectMaterial("Sphere1", "earth") - - warp3D1.Render() - warp3D1.Refresh() - Clock.Start() - End Sub - - Private Sub button_Studio_Click(ByVal sender As Object, ByVal e As EventArgs) Handles button_Studio.Click - _state = State.demo5 - - warp3D1.CreateScene(512, 512) - warp3D1.SetBackgroundColor(&HECE9D8) - - warp3D1.AddMaterial("panel") - warp3D1.SetTexture("panel", "voyager.jpg") - warp3D1.SetReflectivity("panel", 225) - - warp3D1.AddMaterial("default") - warp3D1.SetReflectivity("default", 225) - warp3D1.SetTexture("default", "chrome.jpg") - - warp3D1.AddLight("Light1", 0.0F, 0.0F, 1.0F, &HFFFFFF, 320, 120) - - Dim objects As Collections.Hashtable = warp3D1.Import3Ds("voyager", "voyager.3ds", True) - For Each myDE As DictionaryEntry In objects - Dim name As String = myDE.Key.ToString - warp3D1.SetObjectMaterial(name, "default") - Next - - warp3D1.SetObjectMaterial("voyager_Plaque", "panel") - warp3D1.NormaliseScene() - - End Sub - - Private Sub button_Physics_Click(ByVal sender As Object, ByVal e As EventArgs) Handles button_Physics.Click - - _state = State.demo6 - - warp3D1.CreateScene(512, 512) - warp3D1.SetBackgroundColor(&HECE9D8) - - warp3D1.AddMaterial("default", &HDD00) - warp3D1.SetReflectivity("default", 255) - - warp3D1.AddMaterial("yellow", &HFFFF00) - warp3D1.SetReflectivity("yellow", 200) - - warp3D1.AddMaterial("floor", &HCCCCCC) - warp3D1.AddPlane("plane1", 10.0F) - warp3D1.SetObjectMaterial("plane1", "floor") - - - warp3D1.AddLight("Light1", 0.2F, 0.2F, 1.0F, &HFFFFFF, 144, 120) - warp3D1.AddLight("Light2", -1.0F, 0.0F, 0.0F, &H332211, 100, 40) - warp3D1.AddLight("Light3", 1.0F, 0.0F, 0.0F, &H666666, 200, 120) - warp3D1.AddCube("cube0", 2.0F) - warp3D1.SetObjectMaterial("cube0", "default") - - _world.SetGravity(0, -9.81F, 0) - _world.CFM = 0.000001F - _floor = New Ode.PlaneGeom(_space, 0, 1, 0, 0) - collideCallback = New Ode.CollideHandler(AddressOf Me.CollideCallbackHandler) - - ReDim _walls(3) - _walls(0) = New Ode.PlaneGeom(_space, 1, 0, 0, -10) - _walls(1) = New Ode.PlaneGeom(_space, -1, 0, 0, -10) - _walls(2) = New Ode.PlaneGeom(_space, 0, 0, 1, -10) - _walls(3) = New Ode.PlaneGeom(_space, 0, 0, -1, -10) - - InitialiseWorld() - - warp3D1.ShiftDefaultCamera(0.0F, 0.0F, -20.0F) - - button_Body.Enabled = True - button_Sphere.Enabled = True - End Sub - - Protected Sub CollideCallbackHandler(ByVal o1 As Ode.Geom, ByVal o2 As Ode.Geom) - Dim cgeoms() As Ode.ContactGeom = o1.Collide(o2, 30) - If cgeoms.Length > 0 Then - Dim contacts() As Ode.Contact = Ode.Contact.FromContactGeomArray(cgeoms) - - For i As Integer = 0 To contacts.Length - 1 - contacts(i).Surface.mode = Ode.SurfaceMode.Bounce - contacts(i).Surface.mu = 100 '//World.Infinity - contacts(i).Surface.bounce = 0.7F - contacts(i).Surface.bounce_vel = 0.05F - Dim cj As Ode.ContactJoint = New Ode.ContactJoint(_world, _contactGroup, contacts(i)) - cj.Attach(contacts(i).Geom.Geom1.Body, contacts(i).Geom.Geom2.Body) - Next - End If - End Sub - - Private Sub UpdateWorld() - If lastframe = DateTime.MinValue Or pauseSim Then - lastframe = DateTime.Now - Return - End If - - Dim thisframe As DateTime = DateTime.Now - Dim elapsed As TimeSpan = thisframe - lastframe - - Dim t As Single = CSng(elapsed.TotalSeconds + leftOverTime) - Dim st As Single - - If t = 0 Then Return - - While (t > 0.02) - If t > MAX_STEP_SIZE Then - st = MAX_STEP_SIZE - t -= MAX_STEP_SIZE - Else - st = t - t = 0 - End If - - _contactGroup.Empty() - UpdateWorldForces(st) - - _space.Collide(collideCallback) - - If _useStepFast Then - _world.StepFast1(st, 5) - Else - _world.Step(st) - End If - End While - leftOverTime = t - - lastframe = thisframe - End Sub - - Protected Sub InitialiseWorld() - Dim mass As New Ode.Mass - mass.SetBox(500.0F, 2.0F, 2.0F, 2.0F) - - _body(_bodyIndex) = New Ode.Body(_world) - _body(_bodyIndex).Position = New Ode.Vector3(0, 8, 0) - _body(_bodyIndex).SetMass(mass) - _body(_bodyIndex).Geoms.Add(New Ode.BoxGeom(_space, 2.0F, 2.0F, 2.0F)) - End Sub - - Protected Sub RenderWorld() - End Sub - - Protected Sub UpdateWorldForces(ByVal stepSize As Single) - '// eg _body[n].AddForce( new Ode.Vector3( 0, 0, 1.0f ) ); - End Sub - - Private Sub button_Body_Click(ByVal sender As Object, ByVal e As EventArgs) Handles button_Body.Click - If _state <> State.demo6 Then Return - - - _bodyIndex += 1 - - warp3D1.AddCube("cube" & _bodyIndex, 2.0F) - warp3D1.SetObjectMaterial("cube" & _bodyIndex, "default") - - - _body(_bodyIndex) = New Ode.Body(_world) - _body(_bodyIndex).Position = New Ode.Vector3(0, 8, 0) - _body(_bodyIndex).Geoms.Add(New Ode.BoxGeom(_space, 2.0F, 2.0F, 2.0F)) - - End Sub - - Private Sub button_Sphere_Click(ByVal sender As Object, ByVal e As EventArgs) Handles button_Sphere.Click - If _state <> State.demo6 Then Return - - _bodyIndex += 1 - - warp3D1.AddSphere("cube" & _bodyIndex, 1.0F, 24) - warp3D1.SetObjectMaterial("cube" & _bodyIndex, "yellow") - - _body(_bodyIndex) = New Ode.Body(_world) - _body(_bodyIndex).Position = New Ode.Vector3(0, 8, 0) - _body(_bodyIndex).Geoms.Add(New Ode.SphereGeom(_space, 1.0F)) - End Sub - - 'Private Sub button_Cancel_Click(ByVal sender As Object, ByVal e As EventArgs) - 'End Sub - -End Class diff --git a/trunk/managed/Warp3D/TestWarpVB/My Project/Application.Designer.vb b/trunk/managed/Warp3D/TestWarpVB/My Project/Application.Designer.vb deleted file mode 100644 index c9313c6b..00000000 --- a/trunk/managed/Warp3D/TestWarpVB/My Project/Application.Designer.vb +++ /dev/null @@ -1,38 +0,0 @@ -'------------------------------------------------------------------------------ -' -' This code was generated by a tool. -' Runtime Version:2.0.50727.42 -' -' Changes to this file may cause incorrect behavior and will be lost if -' the code is regenerated. -' -'------------------------------------------------------------------------------ - -Option Strict On -Option Explicit On - - -Namespace My - - 'NOTE: This file is auto-generated; do not modify it directly. To make changes, - ' or if you encounter build errors in this file, go to the Project Designer - ' (go to Project Properties or double-click the My Project node in - ' Solution Explorer), and make changes on the Application tab. - ' - Partial Friend Class MyApplication - - _ - Public Sub New() - MyBase.New(Global.Microsoft.VisualBasic.ApplicationServices.AuthenticationMode.Windows) - Me.IsSingleInstance = false - Me.EnableVisualStyles = true - Me.SaveMySettingsOnExit = true - Me.ShutDownStyle = Global.Microsoft.VisualBasic.ApplicationServices.ShutdownMode.AfterMainFormCloses - End Sub - - _ - Protected Overrides Sub OnCreateMainForm() - Me.MainForm = Global.TestWarpVB.MainForm - End Sub - End Class -End Namespace diff --git a/trunk/managed/Warp3D/TestWarpVB/My Project/Application.myapp b/trunk/managed/Warp3D/TestWarpVB/My Project/Application.myapp deleted file mode 100644 index dc92cd6e..00000000 --- a/trunk/managed/Warp3D/TestWarpVB/My Project/Application.myapp +++ /dev/null @@ -1,10 +0,0 @@ - - - true - MainForm - false - 0 - true - 0 - true - \ No newline at end of file diff --git a/trunk/managed/Warp3D/TestWarpVB/My Project/AssemblyInfo.vb b/trunk/managed/Warp3D/TestWarpVB/My Project/AssemblyInfo.vb deleted file mode 100644 index b71c34f6..00000000 --- a/trunk/managed/Warp3D/TestWarpVB/My Project/AssemblyInfo.vb +++ /dev/null @@ -1,35 +0,0 @@ -Imports System -Imports System.Reflection -Imports System.Runtime.InteropServices - -' General Information about an assembly is controlled through the following -' set of attributes. Change these attribute values to modify the information -' associated with an assembly. - -' Review the values of the assembly attributes - - - - - - - - - - -'The following GUID is for the ID of the typelib if this project is exposed to COM - - -' Version information for an assembly consists of the following four values: -' -' Major Version -' Minor Version -' Build Number -' Revision -' -' You can specify all the values or you can default the Build and Revision Numbers -' by using the '*' as shown below: -' - - - diff --git a/trunk/managed/Warp3D/TestWarpVB/My Project/Resources.Designer.vb b/trunk/managed/Warp3D/TestWarpVB/My Project/Resources.Designer.vb deleted file mode 100644 index 65e85e4d..00000000 --- a/trunk/managed/Warp3D/TestWarpVB/My Project/Resources.Designer.vb +++ /dev/null @@ -1,63 +0,0 @@ -'------------------------------------------------------------------------------ -' -' This code was generated by a tool. -' Runtime Version:2.0.50727.42 -' -' Changes to this file may cause incorrect behavior and will be lost if -' the code is regenerated. -' -'------------------------------------------------------------------------------ - -Option Strict On -Option Explicit On - -Imports System - -Namespace My.Resources - - 'This class was auto-generated by the StronglyTypedResourceBuilder - 'class via a tool like ResGen or Visual Studio. - 'To add or remove a member, edit your .ResX file then rerun ResGen - 'with the /str option, or rebuild your VS project. - ''' - ''' A strongly-typed resource class, for looking up localized strings, etc. - ''' - _ - Friend Module Resources - - Private resourceMan As Global.System.Resources.ResourceManager - - Private resourceCulture As Global.System.Globalization.CultureInfo - - ''' - ''' Returns the cached ResourceManager instance used by this class. - ''' - _ - Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager - Get - If Object.ReferenceEquals(resourceMan, Nothing) Then - Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("TestWarpVB.Resources", GetType(Resources).Assembly) - resourceMan = temp - End If - Return resourceMan - End Get - End Property - - ''' - ''' Overrides the current thread's CurrentUICulture property for all - ''' resource lookups using this strongly typed resource class. - ''' - _ - Friend Property Culture() As Global.System.Globalization.CultureInfo - Get - Return resourceCulture - End Get - Set - resourceCulture = value - End Set - End Property - End Module -End Namespace diff --git a/trunk/managed/Warp3D/TestWarpVB/My Project/Resources.resx b/trunk/managed/Warp3D/TestWarpVB/My Project/Resources.resx deleted file mode 100644 index ffecec85..00000000 --- a/trunk/managed/Warp3D/TestWarpVB/My Project/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/trunk/managed/Warp3D/TestWarpVB/My Project/Settings.Designer.vb b/trunk/managed/Warp3D/TestWarpVB/My Project/Settings.Designer.vb deleted file mode 100644 index e0da83e3..00000000 --- a/trunk/managed/Warp3D/TestWarpVB/My Project/Settings.Designer.vb +++ /dev/null @@ -1,73 +0,0 @@ -'------------------------------------------------------------------------------ -' -' This code was generated by a tool. -' Runtime Version:2.0.50727.42 -' -' Changes to this file may cause incorrect behavior and will be lost if -' the code is regenerated. -' -'------------------------------------------------------------------------------ - -Option Strict On -Option Explicit On - - -Namespace My - - _ - Partial Friend NotInheritable Class MySettings - Inherits Global.System.Configuration.ApplicationSettingsBase - - Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings),MySettings) - -#Region "My.Settings Auto-Save Functionality" -#If _MyType = "WindowsForms" Then - Private Shared addedHandler As Boolean - - Private Shared addedHandlerLockObject As New Object - - _ - Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs) - If My.Application.SaveMySettingsOnExit Then - My.Settings.Save() - End If - End Sub -#End If -#End Region - - Public Shared ReadOnly Property [Default]() As MySettings - Get - -#If _MyType = "WindowsForms" Then - If Not addedHandler Then - SyncLock addedHandlerLockObject - If Not addedHandler Then - AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings - addedHandler = True - End If - End SyncLock - End If -#End If - Return defaultInstance - End Get - End Property - End Class -End Namespace - -Namespace My - - _ - Friend Module MySettingsProperty - - _ - Friend ReadOnly Property Settings() As Global.TestWarpVB.My.MySettings - Get - Return Global.TestWarpVB.My.MySettings.Default - End Get - End Property - End Module -End Namespace diff --git a/trunk/managed/Warp3D/TestWarpVB/My Project/Settings.settings b/trunk/managed/Warp3D/TestWarpVB/My Project/Settings.settings deleted file mode 100644 index 377f56d6..00000000 --- a/trunk/managed/Warp3D/TestWarpVB/My Project/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/trunk/managed/Warp3D/TestWarpVB/OdeWarpHelpers.vb b/trunk/managed/Warp3D/TestWarpVB/OdeWarpHelpers.vb deleted file mode 100644 index 26512efb..00000000 --- a/trunk/managed/Warp3D/TestWarpVB/OdeWarpHelpers.vb +++ /dev/null @@ -1,76 +0,0 @@ -Imports System -Imports Warp3DVB.Rednettle.Warp3D ' Rednettle.Warp3D - -'Namespace Ode -''' -''' Summary description for OdeDxHelpers. -''' -Public NotInheritable Class OdeWarpHelpers - Private Sub New() - End Sub - - Public Shared Function Ode2WarpMatrix(ByVal m As Ode.Matrix3) As warp_Matrix - Dim result As New warp_Matrix() - - result.m11 = m.m11 - result.m12 = m.m12 - result.m13 = m.m13 - - result.m21 = m.m21 - result.m22 = m.m22 - result.m23 = m.m23 - - result.m31 = m.m31 - result.m32 = m.m32 - result.m33 = m.m33 - - Return result - End Function - - Public Shared Function Warp2OdeMatrix3(ByVal m As warp_Matrix) As Ode.Matrix3 - Dim odeM As New Ode.Matrix3() - - odeM.m11 = m.m11 - odeM.m12 = m.m12 - odeM.m13 = m.m13 - - odeM.m21 = m.m21 - odeM.m22 = m.m22 - odeM.m23 = m.m23 - - odeM.m31 = m.m31 - odeM.m32 = m.m32 - odeM.m33 = m.m33 - - Return odeM - End Function - - Public Shared Function Ode2WarpQuaternion(ByVal odeQ As Ode.Quaternion) As warp_Quaternion - Dim q As New warp_Quaternion( _ - odeQ.X, _ - odeQ.Y, _ - odeQ.Z, _ - odeQ.W) - - Return q - End Function - - Public Shared Function Warp2OdeQuaternion(ByVal q As warp_Quaternion) As Ode.Quaternion - Dim odeQ As New Ode.Quaternion() - - odeQ.W = q.W - odeQ.X = q.X - odeQ.Y = q.Y - odeQ.Z = q.Z - - Return odeQ - End Function - - Public Shared Function Ode2DxVector3(ByVal odeV As Ode.Vector3) As warp_Vector - Return New warp_Vector(odeV.X, odeV.Y, odeV.Z) - End Function - - Public Shared Function Dx2OdeVector3(ByVal dxV As warp_Vector) As Ode.Vector3 - Return New Ode.Vector3(dxV.x, dxV.y, dxV.z) - End Function -End Class diff --git a/trunk/managed/Warp3D/TestWarpVB/Program.vb b/trunk/managed/Warp3D/TestWarpVB/Program.vb deleted file mode 100644 index f748c4ba..00000000 --- a/trunk/managed/Warp3D/TestWarpVB/Program.vb +++ /dev/null @@ -1,8 +0,0 @@ -Public Module Program - _ - Sub Main() - Application.EnableVisualStyles() - Application.Run(New MainForm) - End Sub - -End Module diff --git a/trunk/managed/Warp3D/TestWarpVB/TestWarpVB.vbproj b/trunk/managed/Warp3D/TestWarpVB/TestWarpVB.vbproj deleted file mode 100644 index 95c9bde5..00000000 --- a/trunk/managed/Warp3D/TestWarpVB/TestWarpVB.vbproj +++ /dev/null @@ -1,167 +0,0 @@ - - - - Debug - AnyCPU - 8.0.50727 - 2.0 - {6D814868-B5C5-4E0D-B798-71B3945CCBC1} - WinExe - TestWarpVB.My.MyApplication - TestWarpVB - TestWarpVB - WindowsForms - On - SAK - SAK - SAK - SAK - - - true - full - true - true - bin\Debug\ - TestWarpVB.xml - 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 - - - pdbonly - false - true - true - bin\Release\ - TestWarpVB.xml - 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 - - - bin\Original\ - - - bin\64Bit CPU%27s\ - - - x64 - bin\x64\Debug\ - - - x64 - bin\x64\Release\ - - - x64 - bin\x64\Original\ - - - x64 - bin\x64\64Bit CPU%27s\ - - - true - true - true - bin\Slixel Tester\ - TestWarpVB.xml - 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 - full - AnyCPU - \rules - true - GlobalSuppressions.vb - - - true - bin\x64\Slixel Tester\ - x64 - \rules - true - GlobalSuppressions.vb - - - - False - ..\..\..\..\..\..\..\..\RealmForgeGDK-v0.6.2\RealmForgeGDK-v0.6.2\libs\ode.dll - - - - - - - - - - - - - - - - - - - - - Form - - - MainForm.vb - Form - - - - - True - Application.myapp - - - True - True - Resources.resx - - - True - Settings.settings - True - - - - - - - Designer - MainForm.vb - - - VbMyResourcesResXFileCodeGenerator - Resources.Designer.vb - My.Resources - Designer - - - - - MyApplicationCodeGenerator - Application.Designer.vb - - - SettingsSingleFileGenerator - My - Settings.Designer.vb - - - - - {D6F7F49F-4A6F-41CF-9129-C71B66BFC506} - Warp3DVB - - - - - \ No newline at end of file diff --git a/trunk/managed/Warp3D/TestWarpVB/TestWarpVB.vbproj.vspscc b/trunk/managed/Warp3D/TestWarpVB/TestWarpVB.vbproj.vspscc deleted file mode 100644 index feffdeca..00000000 --- a/trunk/managed/Warp3D/TestWarpVB/TestWarpVB.vbproj.vspscc +++ /dev/null @@ -1,10 +0,0 @@ -"" -{ -"FILE_VERSION" = "9237" -"ENLISTMENT_CHOICE" = "NEVER" -"PROJECT_FILE_RELATIVE_PATH" = "" -"NUMBER_OF_EXCLUDED_FILES" = "0" -"ORIGINAL_PROJECT_FILE_PATH" = "" -"NUMBER_OF_NESTED_PROJECTS" = "0" -"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" -} diff --git a/trunk/managed/Warp3D/Warp3D/Properties/AssemblyInfo.cs b/trunk/managed/Warp3D/Warp3D/Properties/AssemblyInfo.cs deleted file mode 100644 index 0fef2279..00000000 --- a/trunk/managed/Warp3D/Warp3D/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; -using System.Security.Permissions; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Warp3D")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Warp3D")] -[assembly: AssemblyCopyright("Copyright © 2005")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -[assembly: AllowPartiallyTrustedCallers] - - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM componenets. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(true)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("20966a70-7851-4a8c-835c-1e7db2f313f9")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/trunk/managed/Warp3D/Warp3D/Warp3D.Designer.cs b/trunk/managed/Warp3D/Warp3D/Warp3D.Designer.cs deleted file mode 100644 index c44533b8..00000000 --- a/trunk/managed/Warp3D/Warp3D/Warp3D.Designer.cs +++ /dev/null @@ -1,48 +0,0 @@ -namespace Warp3D -{ - partial class Warp3D - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Component Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.SuspendLayout(); - // - // Warp3D - // - this.AutoScaleDimensions = new System.Drawing.SizeF( 6F, 13F ); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Name = "Warp3D"; - this.Size = new System.Drawing.Size( 172, 186 ); - this.Load += new System.EventHandler( this.Warp3D_Load ); - this.KeyUp += new System.Windows.Forms.KeyEventHandler( this.Warp3D_KeyUp ); - this.KeyDown += new System.Windows.Forms.KeyEventHandler( this.Warp3D_KeyDown ); - this.ResumeLayout( false ); - - } - - #endregion - } -} diff --git a/trunk/managed/Warp3D/Warp3D/Warp3D.cs b/trunk/managed/Warp3D/Warp3D/Warp3D.cs deleted file mode 100644 index 585ac3df..00000000 --- a/trunk/managed/Warp3D/Warp3D/Warp3D.cs +++ /dev/null @@ -1,1021 +0,0 @@ -/// - -using System; -using System.Collections; -using System.ComponentModel; -using System.Drawing; -using System.Data; -using System.Text; -using System.Windows.Forms; - - -using System.Runtime.InteropServices; - - -using Rednettle.Warp3D; - -namespace Warp3D -{ - [Guid("8DF51A09-E883-4a55-AC8E-00508636BC22")] - public interface ComClass1Interface - { - void Reset(); - void DisplayDefaultScene(); - bool CreateScene(int width, int height); - bool Render(); - bool SetReflectivity(string name, int r); - bool SetTransparency(string name, int t); - bool SetTexture(string name, string path); - bool SetBackgroundTexture(string path); - bool SetBackgroundMaterial( string path ); - bool SetBackgroundColor(int color); - bool SetAmbient(int c); - bool RotateScene(float x, float y, float z); - bool ScaleScene(float x, float y, float z); - bool TranslateScene(float x, float y, float z); - bool RotateObject(string name, float x, float y, float z); - bool RotateSelf( string name, float x, float y, float z ); - bool RotateSelf( string name, warp_Matrix m ); - bool ScaleObject( string name, float s ); - bool SetObjectMaterial(string name, string m); - bool SetEnvMap(string name, string path); - bool AddLight(string name, float x, float y, float z, int color, int d, int s); - Hashtable Import3Ds( string name, string path, bool addtoscene ); - bool NormaliseScene(); - bool AddMaterial(string name); - bool AddMaterial( string name, int color ); - bool AddMaterial( string name, string path ); - bool SetWireframe( string name, bool w ); - bool AddLensFlare( string name ); - bool ProjectFrontal( string name ); - bool ProjectCylindric( string name ); - bool ShiftObject( string name, float x, float y, float z ); - bool AddSphere( string name, float radius, int segments ); - bool AddCube( string name, float size ); - bool AddBox( string name, float x, float y, float z ); - bool AddPlane( string name, float size ); - bool ScaleModel( string name, float scale ); - bool TranslateModel( string name, float x, float y, float z ); - bool RotateModel( string name, float x, float y, float z ); - bool RotateModelSelf( string name, float x, float y, float z ); - bool RotateScene( warp_Quaternion quat, float x, float y, float z ); - void ShiftDefaultCamera( float x, float y, float z ); - bool SetPos( string name, float x, float y, float z ); - } - - [Guid("C0E6A7B1-E5FE-4b48-A310-B05048A925EA"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] - public interface ComClass1Events - { - } - - [Guid("717EA9B1-4E48-4a1d-BCF0-055CAE146598"), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(ComClass1Events))] - public partial class Warp3D : UserControl, ComClass1Interface - { - warp_Scene _scene = null; - string _waiting = "Waiting..."; - - private Hashtable _plugins = new Hashtable(); - private Hashtable _models = new Hashtable(); - - bool _dragging = false; - int _oldx = 0; - int _oldy = 0; - bool _controlkey = false; - public KeyEventArgs _keargs; - - public Warp3D() - { - InitializeComponent(); - - this.MouseUp += new MouseEventHandler(OnMouseUp); - this.MouseDown += new MouseEventHandler(OnMouseDown); - this.MouseMove += new MouseEventHandler(OnMouseMove); - } - - //FIX: Added Scene property so it could be consumed outside of the control. - Created by: X - public warp_Scene Scene - { - get { return _scene; } - set { _scene = value; } - } - // - Created by: X - - protected override void OnPaint(PaintEventArgs e) - { - base.OnPaint(e); - - Graphics g = e.Graphics; - - g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; - g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; - - if (_scene != null) - { - g.DrawImage(_scene.getImage(), 0, 0, this.Width, this.Height); - } - else - { - Font drawFont = new Font("Verdana", 8); - - SolidBrush drawBrush = new SolidBrush(Color.Black); - RectangleF drawRect = new RectangleF(-1, -1, Width + 1, Height + 1); - - e.Graphics.FillRectangle( new SolidBrush(this.BackColor), drawRect); - e.Graphics.DrawString( _waiting, drawFont, drawBrush, drawRect); - } - } - - public void OnMouseMove(object sender, MouseEventArgs e) - { - if (_dragging) - { - float dx = (float)(e.Y - _oldy) / 50; - float dy = (float)(_oldx - e.X) / 50; - - if ( _controlkey == true ) - { - _scene.defaultCamera.shift( 0, 0, dx ); - } - else - { - _scene.rotate( dx, dy, 0 ); - } - - - _scene.render(); - - _oldx = e.X; - _oldy = e.Y; - - Refresh(); - } - } - - public void OnMouseUp(object sender, MouseEventArgs e) - { - _dragging = false; - } - - public void OnMouseDown(object sender, MouseEventArgs e) - { - _oldx = e.X; - _oldy = e.Y; - - _dragging = true; - } - - protected override void OnPaintBackground(PaintEventArgs e) - { - } - - public bool RegisterPlugIN( string name, warp_FXPlugin plugin ) - { - if ( _scene == null ) - { - return false; - } - - _plugins.Add( name, plugin ); - - return true; - } - - public void ShiftDefaultCamera( float x, float y, float z ) - { - _scene.defaultCamera.shift( x, y, z ); - } - - public bool AddSphere( string name, float radius, int segments ) - { - if ( _scene == null ) - { - return false; - } - - warp_Object o = warp_ObjectFactory.SPHERE(radius, segments); - - if( o == null ) - { - return false; - } - - _scene.addObject( name, o ); - _scene.rebuild(); - - return true; - } - - public bool AddPlane( string name, float size ) - { - if ( _scene == null ) - { - return false; - } - - warp_Object o = warp_ObjectFactory.SIMPLEPLANE(size, true); - - if ( o == null ) - { - return false; - } - - _scene.addObject( name, o ); - - return true; - } - - public bool AddCube( string name, float size ) - { - if ( _scene == null ) - { - return false; - } - - warp_Object o = warp_ObjectFactory.CUBE( size ); - - if ( o == null ) - { - return false; - } - - _scene.addObject( name, o ); - _scene.rebuild(); - - return true; - } - - public bool AddBox( string name, float x, float y, float z ) - { - if ( _scene == null ) - { - return false; - } - - warp_Object o = warp_ObjectFactory.BOX( x, y, z ); - - if ( o == null ) - { - return false; - } - - _scene.addObject( name, o ); - _scene.rebuild(); - - return true; - } - - - public bool ProjectFrontal( string name ) - { - if ( _scene == null ) - { - return false; - } - - warp_Object o = _scene.sceneobject(name); - if(o == null) - { - return false; - } - - warp_TextureProjector.projectFrontal( o ); - - return true; - } - - public bool ProjectCylindric( string name ) - { - if ( _scene == null ) - { - return false; - } - - warp_Object o = _scene.sceneobject( name ); - if ( o == null ) - { - return false; - } - - warp_TextureProjector.projectCylindric( o ); - - return true; - } - - public bool ShiftObject( string name, float x, float y, float z ) - { - if ( _scene == null ) - { - return false; - } - - warp_Object o = _scene.sceneobject( name ); - if ( o == null ) - { - return false; - } - - o.shift( x, y, z ); - - return true; - } - - public bool SetPos( string name, float x, float y, float z ) - { - if ( _scene == null ) - { - return false; - } - - warp_Object o = _scene.sceneobject( name ); - if ( o == null ) - { - return false; - } - - o.setPos( x, y, z ); - - return true; - } - - - public bool AddLensFlare( string name ) - { - if ( _scene == null ) - { - return false; - } - - warp_FXLensFlare lensFlare = new warp_FXLensFlare( name, _scene, false ); - lensFlare.preset1(); - - RegisterPlugIN( name, lensFlare ); - - return true; - } - - public bool NormaliseScene() - { - if (_scene == null) - { - return false; - } - - _scene.normalize(); - - return true; - } - - public bool SetAmbient(int c) - { - if (_scene == null) - { - return false; - } - - _scene.setAmbient(c); - - return true; - } - - public bool RotateScene( warp_Quaternion quat, float x, float y, float z ) - { - if ( _scene == null ) - { - return false; - } - - _scene.rotate( quat, x, y, z ); - - return true; - } - - public bool RotateScene(float x, float y, float z) - { - if (_scene == null) - { - return false; - } - - _scene.rotate(x, y, z); - - return true; - } - - public bool RotateScene( warp_Matrix m ) - { - if ( _scene == null ) - { - return false; - } - - _scene.rotate( m ); - - return true; - } - - public bool ScaleScene(float x, float y, float z) - { - if (_scene == null) - { - return false; - } - - _scene.scale(x, y, z); - - return true; - } - - public bool TranslateScene(float x, float y, float z) - { - if (_scene == null) - { - return false; - } - - _scene.shift(x, y, z); - - return true; - } - - - public bool RotateObject(string name, float x, float y, float z) - { - if (_scene == null) - { - return false; - } - - warp_Object o = _scene.sceneobject(name); - if(o == null) - { - return false; - } - - o.rotate(x, y, z); - - return true; - } - - public bool RotateSelf( string name, float x, float y, float z ) - { - if ( _scene == null ) - { - return false; - } - - warp_Object o = _scene.sceneobject( name ); - if ( o == null ) - { - return false; - } - - o.rotateSelf( x, y, z ); - - return true; - } - - public bool RotateSelf( string name, warp_Matrix m ) - { - if ( _scene == null ) - { - return false; - } - - warp_Object o = _scene.sceneobject( name ); - if ( o == null ) - { - return false; - } - - o.rotateSelf( m ); - - return true; - } - - public bool RotateSelf( string name, warp_Quaternion quat ) - { - if ( _scene == null ) - { - return false; - } - - warp_Object o = _scene.sceneobject( name ); - if ( o == null ) - { - return false; - } - - o.rotateSelf( quat ); - - return true; - } - - - public bool ScaleObject( string name, float s ) - { - if ( _scene == null ) - { - return false; - } - - warp_Object o = _scene.sceneobject( name ); - if ( o == null ) - { - return false; - } - - o.scale( s ); - - return true; - } - - public bool SetObjectMaterial(string name, string m) - { - if (_scene == null) - { - return false; - } - - warp_Material material = (warp_Material)_scene.materialData[m]; - if (material == null) - { - return false; - } - - _scene.sceneobject(name).setMaterial(material); - - return true; - } - - public bool SetEnvMap(string name, string path) - { - if (_scene == null) - { - return false; - } - - warp_Texture texture = null; - try - { - texture = new warp_Texture( path ); - } - catch(Exception) - { - return false; - } - - warp_Material material = (warp_Material)_scene.materialData[name]; - if (material == null) - { - return false; - } - - material.setEnvmap(texture); - - return true; - } - - public bool AddLight(string name, float x, float y, float z, int color, int d, int s) - { - if (_scene == null) - { - return false; - } - - _scene.addLight(name,new warp_Light(new warp_Vector(x,y,z),color,d,s)); - - return true; - } - - public bool RotateModelSelf( string name, float x, float y, float z ) - { - if ( _scene == null ) - { - return false; - } - - Hashtable model = ( Hashtable )_models[ name ]; - if ( model == null ) - { - return false; - } - - foreach ( DictionaryEntry myDE in model ) - { - string key = ( string )myDE.Key; - warp_Object o = ( warp_Object )myDE.Value; - - o.rotateSelf( x, y, z ); - } - - return true; - } - - public bool RotateModel( string name, float x, float y, float z ) - { - if ( _scene == null ) - { - return false; - } - - Hashtable model = ( Hashtable )_models[ name ]; - if ( model == null ) - { - return false; - } - - foreach ( DictionaryEntry myDE in model ) - { - string key = ( string )myDE.Key; - warp_Object o = ( warp_Object )myDE.Value; - - o.rotate( x, y, z ); - } - - return true; - } - - public bool TranslateModel( string name, float x, float y, float z ) - { - if ( _scene == null ) - { - return false; - } - - Hashtable model = ( Hashtable )_models[ name ]; - if ( model == null ) - { - return false; - } - - foreach ( DictionaryEntry myDE in model ) - { - string key = ( string )myDE.Key; - warp_Object o = ( warp_Object )myDE.Value; - - o.shift( x, y, z ); - } - - return true; - } - - public bool ScaleModel( string name, float scale ) - { - if ( _scene == null ) - { - return false; - } - - Hashtable model = (Hashtable)_models[ name ]; - if ( model == null ) - { - return false; - } - - foreach ( DictionaryEntry myDE in model ) - { - string key = ( string )myDE.Key; - warp_Object o = ( warp_Object )myDE.Value; - - o.scaleSelf( scale ); - } - - return true; - } - - public Hashtable Import3Ds(string name, string path, bool addtoscene) - { - if (_scene == null) - { - return null; - } - - Hashtable list = null; - warp_3ds_Importer studio = new warp_3ds_Importer(); - try - { - list = studio.importFromFile( name, path ); - - if ( addtoscene ) - { - foreach ( DictionaryEntry myDE in list ) - { - string key = (string)myDE.Key; - warp_Object o = (warp_Object)myDE.Value; - - _scene.addObject( key , o ); - } - } - - _scene.rebuild(); - _models.Add( name, list ); - } - catch(Exception) - { - return null; - } - - return list; - } - - public bool SetBackgroundColor(int c) - { - if (_scene == null) - { - return false; - } - - _scene.environment.bgcolor = c; - - return true; - } - - public bool SetBackgroundTexture(string path) - { - if (_scene == null) - { - return false; - } - - warp_Texture texture = null; - try - { - texture = new warp_Texture(path); - } - catch (Exception) - { - return false; - } - - _scene.environment.setBackground(texture); - - return true; - } - - public bool SetBackgroundMaterial( string path ) - { - if ( _scene == null ) - { - return false; - } - - warp_Material material = null; - try - { - material = new warp_Material( path ); - } - catch ( Exception ) - { - return false; - } - - warp_Texture texture = material.getTexture(); - if ( texture == null ) - { - return false; - } - - _scene.environment.setBackground( texture ); - - return true; - } - - public bool SetWireframe( string name, bool w ) - { - if ( _scene == null ) - { - return false; - } - - warp_Material material = ( warp_Material )_scene.materialData[ name ]; - if ( material == null ) - { - return false; - } - - material.setWireframe( w ); - - return true; - } - - public bool SetTexture(string name, string path) - { - if (_scene == null) - { - return false; - } - - warp_Texture texture = null; - try - { - texture = new warp_Texture( path ); - } - catch(Exception) - { - return false; - } - - warp_Material material = (warp_Material)_scene.materialData[name]; - if (material == null) - { - return false; - } - - material.setTexture(texture); - - return true; - } - - public bool AddMaterial(string name) - { - if (_scene == null) - { - return false; - } - - warp_Material material = new warp_Material(); - _scene.addMaterial(name, material); - - return true; - } - - public bool AddMaterial( string name, int color ) - { - if ( _scene == null ) - { - return false; - } - - warp_Material material = new warp_Material( color ); - _scene.addMaterial( name, material ); - - return true; - } - - public bool AddMaterial( string name, string path ) - { - if ( _scene == null ) - { - return false; - } - - warp_Material material = null; - try - { - material = new warp_Material( path ); - } - catch ( Exception ) - { - return false; - } - - _scene.addMaterial( name, material ); - - return true; - } - - public bool SetReflectivity( string name, int r ) - { - if (_scene == null) - { - return false; - } - - warp_Material material = (warp_Material)_scene.materialData[name]; - if (material == null) - { - return false; - } - - material.setReflectivity(r); - - return true; - } - - public bool SetTransparency(string name, int t) - { - if (_scene == null) - { - return false; - } - - warp_Material material = (warp_Material)_scene.materialData[name]; - if (material == null) - { - return false; - } - - material.setTransparency(t); - - return true; - } - - public bool Render() - { - try - { - _scene.render(); - - foreach ( DictionaryEntry myDE in _plugins ) - { - warp_FXPlugin plugin = ( warp_FXPlugin )myDE.Value; - plugin.apply(); - } - } - catch (Exception) - { - return false; - } - - return true; - } - - public bool CreateScene(int width, int height) - { - try - { - _scene = new warp_Scene(width, height); - - _plugins.Clear(); - _models.Clear(); - } - catch (Exception) - { - Reset(); - return false; - } - - return true; - } - - public void Reset() - { - _scene = null; - System.GC.Collect(); - } - - public void DisplayDefaultScene() - { - _scene = new warp_Scene(512, 512); - - warp_Material crystal = new warp_Material(warp_TextureFactory.MARBLE(128, 128, .15f)); - _scene.addMaterial("crystal", crystal); - - warp_Material c = (warp_Material)_scene.materialData["crystal"]; - c.setReflectivity(255); - c.setTransparency(100); - - _scene.environment.setBackground(warp_TextureFactory.CHECKERBOARD(128,128,3,0x000000,0x999999)); - - _scene.addLight("light1", new warp_Light(new warp_Vector(0.2f, 0.2f, 1f), 0xFFFFFF, 320, 80)); - _scene.addLight("light2", new warp_Light(new warp_Vector(-1f, -1f, 1f), 0xffffff, 100, 40)); - - warp_Vector[] path = new warp_Vector[15]; - - path[0] = new warp_Vector(0.0f, 0.2f, 0); - path[1] = new warp_Vector(0.13f, 0.25f, 0); - path[2] = new warp_Vector(0.33f, 0.3f, 0); - path[3] = new warp_Vector(0.43f, 0.6f, 0); - path[4] = new warp_Vector(0.48f, 0.9f, 0); - path[5] = new warp_Vector(0.5f, 0.9f, 0); - path[6] = new warp_Vector(0.45f, 0.6f, 0); - path[7] = new warp_Vector(0.35f, 0.3f, 0); - path[8] = new warp_Vector(0.25f, 0.2f, 0); - path[9] = new warp_Vector(0.1f, 0.15f, 0); - path[10] = new warp_Vector(0.1f, 0.0f, 0); - path[11] = new warp_Vector(0.1f, -0.5f, 0); - path[12] = new warp_Vector(0.35f, -0.55f, 0); - path[13] = new warp_Vector(0.4f, -0.6f, 0); - path[14] = new warp_Vector(0.0f, -0.6f, 0); - - _scene.addObject("wineglass", warp_ObjectFactory.ROTATIONOBJECT(path, 32)); - _scene.sceneobject("wineglass").setMaterial(_scene.material("crystal")); - - _scene.sceneobject("wineglass").scale(0.8f, 0.8f, 0.8f); - _scene.sceneobject("wineglass").rotate(0.5f, 0f, 0f); - - _scene.render(); - - Refresh(); - } - - private void Warp3D_Load(object sender, EventArgs e) - { - - } - - private void Warp3D_KeyDown( object sender, KeyEventArgs e ) - { - _keargs = e; - _controlkey = e.Control; - } - - private void Warp3D_KeyUp( object sender, KeyEventArgs e ) - { - _keargs = e; - _controlkey = e.Control; - - - } - } -} diff --git a/trunk/managed/Warp3D/Warp3D/Warp3D.csproj b/trunk/managed/Warp3D/Warp3D/Warp3D.csproj deleted file mode 100644 index c6977b82..00000000 --- a/trunk/managed/Warp3D/Warp3D/Warp3D.csproj +++ /dev/null @@ -1,157 +0,0 @@ - - - Debug - AnyCPU - 8.0.50727 - 2.0 - {6E48530B-16AB-4861-9CED-97334739D675} - Library - Properties - Warp3D - Warp3D - true - - - SAK - SAK - SAK - SAK - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - true - true - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - true - - - bin\Original\ - true - true - true - - - bin\64Bit CPU%27s\ - - - true - bin\x64\Debug\ - DEBUG;TRACE - true - true - full - x64 - prompt - - - bin\x64\Release\ - TRACE - true - true - pdbonly - x64 - prompt - - - bin\x64\Original\ - true - true - true - x64 - - - bin\x64\64Bit CPU%27s\ - x64 - true - - - true - bin\Slixel Tester\ - DEBUG;TRACE - true - true - full - AnyCPU - \rules - true - GlobalSuppressions.cs - prompt - - - true - bin\x64\Slixel Tester\ - DEBUG;TRACE - true - true - full - x64 - \rules - true - GlobalSuppressions.cs - prompt - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - UserControl - - - Warp3D.cs - - - - - - - Warp3D.cs - Designer - - - - \ No newline at end of file diff --git a/trunk/managed/Warp3D/Warp3D/Warp3D.csproj.vspscc b/trunk/managed/Warp3D/Warp3D/Warp3D.csproj.vspscc deleted file mode 100644 index feffdeca..00000000 --- a/trunk/managed/Warp3D/Warp3D/Warp3D.csproj.vspscc +++ /dev/null @@ -1,10 +0,0 @@ -"" -{ -"FILE_VERSION" = "9237" -"ENLISTMENT_CHOICE" = "NEVER" -"PROJECT_FILE_RELATIVE_PATH" = "" -"NUMBER_OF_EXCLUDED_FILES" = "0" -"ORIGINAL_PROJECT_FILE_PATH" = "" -"NUMBER_OF_NESTED_PROJECTS" = "0" -"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" -} diff --git a/trunk/managed/Warp3D/Warp3D/Warp3D.resx b/trunk/managed/Warp3D/Warp3D/Warp3D.resx deleted file mode 100644 index 8f95d662..00000000 --- a/trunk/managed/Warp3D/Warp3D/Warp3D.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/trunk/managed/Warp3D/Warp3D/build.mono b/trunk/managed/Warp3D/Warp3D/build.mono deleted file mode 100755 index f4315aee..00000000 --- a/trunk/managed/Warp3D/Warp3D/build.mono +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -gmcs -unsafe -out:Warp3D.dll -target:library *.cs Properties/AssemblyInfo.cs -r:System.Drawing.dll -r:System.Data.dll -r:System.Windows.Forms.dll diff --git a/trunk/managed/Warp3D/Warp3D/warp_3ds_Importer.cs b/trunk/managed/Warp3D/Warp3D/warp_3ds_Importer.cs deleted file mode 100644 index 194f4c57..00000000 --- a/trunk/managed/Warp3D/Warp3D/warp_3ds_Importer.cs +++ /dev/null @@ -1,212 +0,0 @@ -using System; -using System.IO; -using System.Collections; -using System.Net; - -namespace Rednettle.Warp3D -{ - /// - /// Summary description for warp_3ds_Importer. - /// - public class warp_3ds_Importer - { - private int currentJunkId; - private int nextJunkOffset; - - private String currentObjectName = null; - private warp_Object currentObject = null; - private bool endOfStream = false; - - private Hashtable _objects = new Hashtable(); - - public warp_3ds_Importer() - { - } - - public Hashtable importFromFile( string name, String path ) - { - Stream fs = null; - _objects.Clear(); - - if ( path.StartsWith( "http" ) ) - { - WebRequest webrq = WebRequest.Create( path ); - fs = webrq.GetResponse().GetResponseStream() ; - } - else - { - fs = new FileStream( path, FileMode.Open ); - } - - BinaryReader br = new BinaryReader( fs ); - return importFromStream( name, br ); - } - - public Hashtable importFromStream( string name, BinaryReader inStream ) - { - _objects.Clear(); - - readJunkHeader(inStream); - if (currentJunkId != 0x4D4D) - { - return null; - } - - try - { - for (;;) - { - readNextJunk( name, inStream); - } - } - catch(Exception) - { - // ignored - } - - inStream.Close(); - - return _objects; - } - - private void readJunkHeader(BinaryReader inStream) - { - currentJunkId = readShort(inStream); - nextJunkOffset = readInt(inStream); - endOfStream = currentJunkId < 0; - } - - private int readInt(BinaryReader inStream) - { - return inStream.ReadByte() | (inStream.ReadByte() << 8) | (inStream.ReadByte() << 16) | (inStream.ReadByte() << 24); - } - - private int readShort(BinaryReader inStream) - { - return (inStream.ReadByte() | (inStream.ReadByte() << 8)); - } - - private void readNextJunk(string name, BinaryReader inStream) - { - readJunkHeader(inStream); - - if (currentJunkId == 0x3D3D /* mesh block */) - { - return; - } - - if (currentJunkId == 0x4000 /* object block */) - { - currentObjectName = readString(inStream); - return; - } - - if (currentJunkId == 0x4100 /* triangular polygon object */) - { - currentObject = new warp_Object(); - _objects.Add( name+"_"+currentObjectName, currentObject ); - - return; - } - - if (currentJunkId == 0x4110 /* vertex list */) - { - readVertexList(inStream); - return; - } - - if (currentJunkId == 0x4120 /* point list */) - { - readPointList(inStream); - return; - } - - if (currentJunkId == 0x4140 /* mapping coordinates */) - { - readMappingCoordinates(inStream); - return; - } - - skipJunk(inStream); - } - - private string readString(BinaryReader inStream) - { - string result = ""; - byte inByte; - while ( (inByte = (byte) inStream.ReadByte()) != 0) - { - result += (char) inByte; - } - - return result; - } - - private float readFloat(BinaryReader inStream) - { - int bits = readInt(inStream); - - int s = ((bits >> 31) == 0) ? 1 : -1; - int e = ((bits >> 23) & 0xff); - int m = (e == 0) ? (bits & 0x7fffff) << 1 : (bits & 0x7fffff) | 0x800000; - - double v = (double)s*(double)m*(Math.Pow(2, e-150)); - - return (float)v; - } - - private void skipJunk(BinaryReader inStream) - { - try - { - for (int i = 0; (i < nextJunkOffset - 6) && (!endOfStream); i++) - { - endOfStream = inStream.ReadByte() < 0; - } - } - catch(Exception){endOfStream=true;}; - } - - private void readVertexList(BinaryReader inStream) - { - float x, y, z; - int vertices = readShort(inStream); - for (int i = 0; i < vertices; i++) - { - x = readFloat(inStream); - y = readFloat(inStream); - z = readFloat(inStream); - - currentObject.addVertex(x, -y, z); - } - } - - private void readPointList(BinaryReader inStream) - { - int v1, v2, v3; - int triangles = readShort(inStream); - for (int i = 0; i < triangles; i++) - { - v1 = readShort(inStream); - v2 = readShort(inStream); - v3 = readShort(inStream); - - readShort(inStream); - - currentObject.addTriangle(currentObject.vertex(v1), - currentObject.vertex(v2), - currentObject.vertex(v3)); - } - } - - private void readMappingCoordinates(BinaryReader inStream) - { - int vertices = readShort(inStream); - for (int i = 0; i < vertices; i++) - { - currentObject.vertex(i).u = readFloat(inStream); - currentObject.vertex(i).v = readFloat(inStream); - } - } - } -} diff --git a/trunk/managed/Warp3D/Warp3D/warp_Camera.cs b/trunk/managed/Warp3D/Warp3D/warp_Camera.cs deleted file mode 100644 index be46db04..00000000 --- a/trunk/managed/Warp3D/Warp3D/warp_Camera.cs +++ /dev/null @@ -1,166 +0,0 @@ -using System; - -namespace Rednettle.Warp3D -{ - /// - /// Summary description for warp_Camera. - /// - /// - public class warp_Camera - { - public warp_Matrix matrix=new warp_Matrix(); - public warp_Matrix normalmatrix=new warp_Matrix(); - - bool needsRebuild=true; // Flag indicating changes on matrix - - // Camera settings - public warp_Vector pos=new warp_Vector(0f,0f,0f); - public warp_Vector lookat=new warp_Vector(0f,0f,0f); - public float rollfactor=0f; - - public float fovfact; // Field of View factor - public int screenwidth; - public int screenheight; - public int screenscale; - - public warp_Camera() - { - setFov(90f); - } - - public warp_Camera(float fov) - { - setFov(fov); - } - - public warp_Matrix getMatrix() - { - rebuildMatrices(); - return matrix; - } - - public warp_Matrix getNormalMatrix() - { - rebuildMatrices(); - return normalmatrix; - } - - void rebuildMatrices() - { - if (!needsRebuild) return; - needsRebuild=false; - - warp_Vector forward,up,right; - - forward=warp_Vector.sub(lookat,pos); - up=new warp_Vector(0f,1f,0f); - right=warp_Vector.getNormal(up,forward); - up=warp_Vector.getNormal(forward,right); - - forward.normalize(); - up.normalize(); - right.normalize(); - - normalmatrix=new warp_Matrix(right,up,forward); - normalmatrix.rotate(0,0,rollfactor); - matrix=normalmatrix.getClone(); - matrix.shift(pos.x,pos.y,pos.z); - - normalmatrix=normalmatrix.inverse(); - matrix=matrix.inverse(); - } - - public void setFov(float fov) - { - fovfact=(float)Math.Tan(warp_Math.deg2rad(fov)/2); - } - - public void roll(float angle) - { - rollfactor+=angle; - needsRebuild=true; - } - - public void setPos(float px, float py, float pz) - { - pos=new warp_Vector(px,py,pz); - needsRebuild=true; - } - - public void setPos(warp_Vector p) - { - pos=p; - needsRebuild=true; - } - - public void lookAt(float px, float py, float pz) - { - lookat=new warp_Vector(px,py,pz); - needsRebuild=true; - } - - public void lookAt(warp_Vector p) - { - lookat=p; - needsRebuild=true; - } - - public void setScreensize(int w, int h) - { - screenwidth=w; - screenheight=h; - screenscale=(w - /// Summary description for warp_Color. - /// - public class warp_Color - { - public static int ALPHA = unchecked((int)0xFF000000); // alpha mask - public static int RED = unchecked((int)0xFF0000); // red mask - public static int GREEN = unchecked((int)0xFF00); // green mask - public static int BLUE = unchecked((int)0xFF); // blue mask - public static int MASK7Bit = unchecked((int)0xFEFEFF); // mask for additive/subtractive shading - public static int MASK6Bit = unchecked((int)0xFCFCFC); // mask for additive/subtractive shading - public static int RGB = unchecked((int)0xFFFFFF); // rgb mask - - private static int pixel,color,overflow,colorscale,r,g,b; - - private warp_Color() - { - } - - public static int random(int color, int delta) - { - Random rnd = new Random(); - - int r = (color >> 16) & 255; - int g = (color >> 8) & 255; - int b = color & 255; - - r += (int) (rnd.NextDouble() * (float) delta); - g += (int) (rnd.NextDouble() * (float) delta); - b += (int) (rnd.NextDouble() * (float) delta); - - return getCropColor(r, g, b); - } - - public static int random() - { - Random rnd = new Random(); - return (int) (rnd.NextDouble() * 16777216); - } - - public static int getRed(int c) - { - return (c&RED)>>16; - } - - public static int getGreen(int c) - { - return (c&GREEN)>>8; - } - - public static int getBlue(int c) - { - return c&BLUE; - } - - public static int[] makeGradient(int[] colors, int size) - { - int[] pal = new int[size]; - int c1, c2, pos1, pos2, range; - int r, g, b, r1, g1, b1, r2, g2, b2, dr, dg, db; - if (colors.GetLength(0) == 1) - { - c1 = colors[0]; - for (int i = 0; i < size; i++) - { - pal[i] = c1; - } - return pal; - } - - for (int c = 0; c < colors.GetLength(0) - 1; c++) - { - c1 = colors[c]; - c2 = colors[c + 1]; - pos1 = size * c / (colors.GetLength(0) - 1); - pos2 = size * (c + 1) / (colors.GetLength(0) - 1); - range = pos2 - pos1; - r1 = warp_Color.getRed(c1) << 16; - g1 = warp_Color.getGreen(c1) << 16; - b1 = warp_Color.getBlue(c1) << 16; - r2 = warp_Color.getRed(c2) << 16; - g2 = warp_Color.getGreen(c2) << 16; - b2 = warp_Color.getBlue(c2) << 16; - dr = (r2 - r1) / range; - dg = (g2 - g1) / range; - db = (b2 - b1) / range; - r = r1; - g = g1; - b = b1; - for (int i = pos1; i < pos2; i++) - { - pal[i] = getColor(r >> 16, g >> 16, b >> 16); - r += dr; - g += dg; - b += db; - } - } - - return pal; - } - - public static int add(int color1, int color2) - { - pixel = (color1 & MASK7Bit) + (color2 & MASK7Bit); - overflow = pixel & 0x1010100; - overflow = overflow - (overflow >> 8); - - return ALPHA | overflow | pixel; - } - - public static int sub(int color1, int color2) - // Substracts color2 from color1 - { - pixel = (color1 & MASK7Bit) + (~color2 & MASK7Bit); - overflow = ~pixel & 0x1010100; - overflow = overflow - (overflow >> 8); - return ALPHA | (~overflow & pixel); - } - - public static int subneg(int color1, int color2) - // Substracts the negative of color2 from color1 - { - pixel = (color1 & MASK7Bit) + (color2 & MASK7Bit); - overflow = ~pixel & 0x1010100; - overflow = overflow - (overflow >> 8); - return ALPHA | (~overflow & pixel); - } - - public static int inv(int color) - // returns the inverse of the given color - { - return ALPHA | (~color); - } - - public static int mix(int color1, int color2) - // Returns the averidge color from 2 colors - { - return ALPHA | ( ( (color1 & MASK7Bit) >> 1) + ( (color2 & MASK7Bit) >> 1)); - } - - public static int scale(int color, int factor) - { - if (factor == 0) - { - return 0; - } - if (factor == 255) - { - return color; - } - if (factor == 127) - { - return (color & 0xFEFEFE) >> 1; - } - - r = ( ( (color >> 16) & 255) * factor) >> 8; - g = ( ( (color >> 8) & 255) * factor) >> 8; - b = ( (color & 255) * factor) >> 8; - return ALPHA | (r << 16) | (g << 8) | b; - } - - public static int multiply(int color1, int color2) - { - if ( (color1 & RGB) == 0) - { - return 0; - } - if ( (color2 & RGB) == 0) - { - return 0; - } - r = ( ( (color1 >> 16) & 255) * ( (color2 >> 16) & 255)) >> 8; - g = ( ( (color1 >> 8) & 255) * ( (color2 >> 8) & 255)) >> 8; - b = ( (color1 & 255) * (color2 & 255)) >> 8; - return ALPHA | (r << 16) | (g << 8) | b; - } - - public static int transparency(int bkgrd, int color, int alpha) - // alpha=0 : opaque , alpha=255: full transparent - { - if (alpha == 0) - { - return color; - } - if (alpha == 255) - { - return bkgrd; - } - if (alpha == 127) - { - return mix(bkgrd, color); - } - - r = (alpha * ( ( (bkgrd >> 16) & 255) - ( (color >> 16) & 255)) >> 8) + - ( (color >> 16) & 255); - g = (alpha * ( ( (bkgrd >> 8) & 255) - ( (color >> 8) & 255)) >> 8) + - ( (color >> 8) & 255); - b = (alpha * ( (bkgrd & 255) - (color & 255)) >> 8) + (color & 255); - - return ALPHA | (r << 16) | (g << 8) | b; - - } - - public static int getCropColor(int r, int g, int b) - { - return ALPHA | (warp_Math.crop(r, 0, 255) << 16) | (warp_Math.crop(g, 0, 255) << 8) | warp_Math.crop(b, 0, 255); - } - - - public static int getColor(int r, int g, int b) - { - return ALPHA|(r<<16)|(g<<8)|b; - } - - public static int getGray(int color) - { - int r=((color&RED)>>16); - int g=((color&GREEN)>>8); - int b=(color&BLUE); - int Y=(r*3+g*6+b)/10; - return ALPHA|(Y<<16)|(Y<<8)|Y; - } - - public static int getAverage(int color) - { - return (((color&RED)>>16)+((color&GREEN)>>8)+(color&BLUE))/3; - } - } -} diff --git a/trunk/managed/Warp3D/Warp3D/warp_CoreObject.cs b/trunk/managed/Warp3D/Warp3D/warp_CoreObject.cs deleted file mode 100644 index 37e02228..00000000 --- a/trunk/managed/Warp3D/Warp3D/warp_CoreObject.cs +++ /dev/null @@ -1,115 +0,0 @@ -using System; - -namespace Rednettle.Warp3D -{ - /// - /// Summary description for warp_CoreObject. - /// - /// - - public class warp_CoreObject - { - public warp_Matrix matrix=new warp_Matrix(); - public warp_Matrix normalmatrix=new warp_Matrix(); - - public void transform(warp_Matrix m) - { - matrix.transform(m); - normalmatrix.transform(m); - } - - public void shift(float dx, float dy, float dz) - { - matrix.shift(dx,dy,dz); - } - - public void shift( warp_Vector v ) - { - matrix.shift(v.x,v.y,v.z); - } - - public void scale(float d) - { - matrix.scale(d); - } - - public void scale(float dx, float dy, float dz) - { - matrix.scale(dx,dy,dz); - } - - public void scaleSelf(float d) - { - matrix.scaleSelf(d); - } - - public void scaleSelf(float dx, float dy, float dz) - { - matrix.scaleSelf(dx,dy,dz); - } - - public void rotate(warp_Vector d) - { - rotateSelf(d.x,d.y,d.z); - } - - public void rotateSelf(warp_Vector d) - { - rotateSelf(d.x,d.y,d.z); - } - - public void rotate(float dx, float dy, float dz) - { - matrix.rotate(dx,dy,dz); - normalmatrix.rotate(dx,dy,dz); - } - - public void rotate( warp_Quaternion quat, float x, float y, float z ) - { - matrix.rotate( quat , x, y, z); - normalmatrix.rotate( quat , x, y, z); - } - - public void rotate( warp_Matrix m ) - { - matrix.rotate( m ); - normalmatrix.rotate( m ); - } - - - public void rotateSelf(float dx, float dy, float dz) - { - matrix.rotateSelf(dx,dy,dz); - normalmatrix.rotateSelf(dx,dy,dz); - } - - public void rotateSelf( warp_Quaternion quat ) - { - matrix.rotateSelf( quat ); - normalmatrix.rotateSelf( quat ); - } - - public void rotateSelf( warp_Matrix m ) - { - matrix.rotateSelf( m ); - normalmatrix.rotateSelf( m ); - } - - public void setPos( float x, float y, float z ) - { - matrix.m03=x; - matrix.m13=y; - matrix.m23=z; - } - - public void setPos(warp_Vector v) - { - setPos(v.x,v.y,v.z); - } - - public warp_Vector getPos() - { - return new warp_Vector(matrix.m03,matrix.m13,matrix.m23); - } - } -} diff --git a/trunk/managed/Warp3D/Warp3D/warp_Edge.cs b/trunk/managed/Warp3D/Warp3D/warp_Edge.cs deleted file mode 100644 index cf5ec88a..00000000 --- a/trunk/managed/Warp3D/Warp3D/warp_Edge.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; - -namespace Rednettle.Warp3D -{ - /// - /// Summary description for warp_Edge. - /// - /// - public class warp_Edge - { - warp_Vertex a,b; - - public warp_Edge() - { - } - - public warp_Edge(warp_Vertex v1, warp_Vertex v2) - { - a=v1; - b=v2; - } - - public warp_Vertex start() - { - return a; - } - - public warp_Vertex end() - { - return b; - } - } -} diff --git a/trunk/managed/Warp3D/Warp3D/warp_Environment.cs b/trunk/managed/Warp3D/Warp3D/warp_Environment.cs deleted file mode 100644 index 587f5a1c..00000000 --- a/trunk/managed/Warp3D/Warp3D/warp_Environment.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; - -namespace Rednettle.Warp3D -{ - /// - /// Summary description for warp_Environment. - /// - public class warp_Environment - { - public int ambient=0; - public int fogcolor=0; - public int fogfact=0; - public int bgcolor=unchecked((int)0xffffffff); - - public warp_Texture background=null; - - public void setBackground(warp_Texture t) - { - background=t; - } - } -} diff --git a/trunk/managed/Warp3D/Warp3D/warp_FXLensFlare .cs b/trunk/managed/Warp3D/Warp3D/warp_FXLensFlare .cs deleted file mode 100644 index 7b550d2c..00000000 --- a/trunk/managed/Warp3D/Warp3D/warp_FXLensFlare .cs +++ /dev/null @@ -1,352 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Rednettle.Warp3D -{ - public class warp_FXLensFlare : warp_FXPlugin - { - public warp_Object flareObject; - - private int flares=0; - private bool zBufferSensitive=true; - private warp_Texture[] flare; - private float[] flareDist; - - private warp_FXLensFlare(warp_Scene scene) : base( scene ) - { - } - - public warp_FXLensFlare( String name, warp_Scene scene, bool zBufferSensitive ) : base( scene ) - { - this.zBufferSensitive = zBufferSensitive; - - flareObject=new warp_Object(); - flareObject.addVertex(new warp_Vertex(1f,1f,1f)); - flareObject.rebuild(); - - scene.addObject(name, flareObject); - } - - public void preset1() - { - clear(); - - addGlow(144,0x330099); - addStrike(320,48,0x003366); - addStrike(48,240,0x660033); - addRing(120,0x660000); - addRays(320, 32, 20, 0x111111); - addSecs(12,100,64,0x6633cc,64); - } - - public void preset2() - { - clear(); - addGlow(144,0x995500); - addStrike(640,64,0xCC0000); - addStrike(32,480,0x0000FF); - addStrike(64,329,0x330099); - addRing(160,0x990000); - addRays(320, 24, 32, 0x332211); - addSecs(12,100,64,0x333333,100); - addSecs(12,60,40,0x336699,80); - } - - public void preset3() - { - clear(); - addGlow(144,0x993322); - addStrike(400,200,0xCC00FF); - addStrike(480,32,0x0000FF); - addRing(180,0x990000); - addRays(240, 32, 48, 0x332200); - addSecs(12,80,64,0x555555,50); - addSecs(12,60,40,0x336699,80); - } - - public void setPos(warp_Vector pos) - { - flareObject.fastvertex[0].pos=pos; - } - - public void clear() - { - flares=0; - flare=null; - flareDist=null; - } - - public void addGlow(int size, int color) - { - addFlare(createGlow(size,size,color,256),0f); - } - - public void addStrike(int width, int height, int color) - { - addFlare(createGlow(width,height,color,48),0f); - } - - public void addRing(int size, int color) - { - addFlare(createRing(size,color),0f); - } - - public void addRays(int size, int num, int rad, int color) - { - addFlare(createRays(size, num, rad, color),0f); - } - - public void addSecs( int count, int averidgeSize, int sizeDelta, int averidgeColor, int colorDelta ) - { - for ( int i = 0; i < count; i++ ) - { - addFlare( createSec( averidgeSize, sizeDelta, averidgeColor, colorDelta ), warp_Math.random( -0.5f, 3f ) ); - - } - } - - override public void apply() - { - int px = flareObject.fastvertex[ 0 ].x; - int py = flareObject.fastvertex[ 0 ].y; - - if ( !flareObject.fastvertex[ 0 ].visible ) - { - return; - } - if ( zBufferSensitive && ( flareObject.fastvertex[ 0 ].z > scene.renderPipeline.zBuffer[ px + py * screen.width ] ) ) - { - return; - } - - int cx=screen.width/2; - int cy=screen.height/2; - - float dx=(float)(cx-px); - float dy=(float)(cy-py); - int posx,posy,xsize,ysize; - float zoom; - - for (int i=0; i=0;y--) - { - offset=y*w; - for (int x=w-1;x>=0;x--) - { - relX=(float)(x-(w>>1))/(float)(w>>1); - relY=(float)(y-(h>>1))/(float)(h>>1); - newTexture.pixel[offset+x]=palette[warp_Math.crop((int)(255*Math.Sqrt(relX*relX+relY*relY)),0,255)]; - } - } - - return newTexture; - } - - private int[] getPalette(int[] color, int[] alpha) - { - int r,g,b; - int[] palette=new int[256]; - for (int i=255;i>=0;i--) - { - r=(((color[i]>>16)&255)*alpha[i])>>8; - g=(((color[i]>>8)&255)*alpha[i])>>8; - b=((color[i]&255)*alpha[i])>>8; - palette[i]=warp_Color.getColor(r,g,b); - } - return palette; - } - - private warp_Texture createGlow(int w, int h, int color, int alpha) - { - return createRadialTexture(w,h,getGlowPalette(color),getConstantAlpha(alpha)); - } - - private warp_Texture createRing(int size, int color) - { - return createRadialTexture(size,size,getColorPalette(color,color),getRingAlpha(40)); - } - - private warp_Texture createSec(int size, int sizedelta, int color, int colordelta) - { - int s=(int)warp_Math.randomWithDelta(size,sizedelta); - int c1=warp_Color.random(color,colordelta); - int c2=warp_Color.random(color,colordelta); - return createRadialTexture(s,s,getColorPalette(c1,c2),getSecAlpha()); - } - - private warp_Texture createRays(int size, int rays, int rad, int color) - { - int pos; - float relPos; - warp_Texture texture=new warp_Texture(size,size); - int[] radialMap=new int [1024]; - warp_Math.clearBuffer(radialMap, 0); - - for (int i=0;i=0;y--) - { - offset=y*size; - for (int x=size-1;x>=0;x--) - { - xrel=(float)(2*x-size)/(float)size; - yrel=(float)(2*y-size)/(float)size; - angle=(int)(1023*Math.Atan2(xrel,yrel)/3.14159/2)&1023; - reldist=Math.Max((int)(255-255*warp_Math.pythagoras(xrel,yrel)),0); - texture.pixel[x+offset]=warp_Color.scale(color, radialMap[angle]*reldist/255); - } - } - - return texture; - } - - private int[] getGlowPalette(int color) - { - int r,g,b; - float relDist,diffuse,specular; - int[] palette=new int[256]; - int cr=(color>>16)&255; - int cg=(color>>8)&255; - int cb=color&255; - for (int i=255;i>=0;i--) - { - relDist=(float)i/255; - diffuse=(float)Math.Cos(relDist*1.57); - specular=(float)(255/Math.Pow(2.718,relDist*2.718)-(float)i/16); - r=(int)((float)cr*diffuse+specular); - g=(int)((float)cg*diffuse+specular); - b=(int)((float)cb*diffuse+specular); - palette[i]=warp_Color.getCropColor(r,g,b); - } - - return palette; - } - - private int[] getConstantAlpha(int alpha) - { - int[] alphaPalette=new int[256]; - for (int i=255;i>=0;i--) alphaPalette[i]=alpha; - - return alphaPalette; - } - - private int[] getLinearAlpha() - { - int[] alphaPalette=new int[256]; - for ( int i = 255; i >= 0; i-- ) - { - alphaPalette[ i ] = 255 - i; - } - - return alphaPalette; - } - - private int[] getRingAlpha(int ringsize) - { - int[] alphaPalette=new int[256]; - float angle; - for ( int i = 0; i < 256; i++ ) - { - alphaPalette[ i ] = 0; - } - - for (int i=0;i> 2; - } - - return alphaPalette; - } - - - private int[] getColorPalette(int color1, int color2) - { - int[] palette=new int[256]; - - int r1=(color1>>16)&255; - int g1=(color1>>8)&255; - int b1=color1&255; - int r2=(color2>>16)&255; - int g2=(color2>>8)&255; - int b2=color2&255; - int dr=r2-r1; - int dg=g2-g1; - int db=b2-b1; - int r=r1<<8; - int g=g1<<8; - int b=b1<<8; - - for (int i=0;i<256;i++) - { - palette[i]=warp_Color.getColor(r>>8,g>>8,b>>8); - r+=dr; g+=dg; b+=db; - } - return palette; - } - } -} diff --git a/trunk/managed/Warp3D/Warp3D/warp_FXPlugin.cs b/trunk/managed/Warp3D/Warp3D/warp_FXPlugin.cs deleted file mode 100644 index 97a33d2e..00000000 --- a/trunk/managed/Warp3D/Warp3D/warp_FXPlugin.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Rednettle.Warp3D -{ - public abstract class warp_FXPlugin - { - public warp_Scene scene = null; - public warp_Screen screen = null; - - public warp_FXPlugin( warp_Scene scene ) - { - this.scene = scene; - screen = scene.renderPipeline.screen; - } - - public abstract void apply(); - } -} diff --git a/trunk/managed/Warp3D/Warp3D/warp_Light.cs b/trunk/managed/Warp3D/Warp3D/warp_Light.cs deleted file mode 100644 index 7c4ebc95..00000000 --- a/trunk/managed/Warp3D/Warp3D/warp_Light.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; - -namespace Rednettle.Warp3D -{ - /// - /// Summary description for warp_Light. - /// - public class warp_Light - { - // F I E L D S - - public warp_Vector v; //Light direction - public warp_Vector v2; //projected Light direction - public int diffuse = 0; - public int specular = 0; - public int highlightSheen = 0; - public int highlightSpread = 0; - - warp_Matrix matrix2; - - private warp_Light() - // Default constructor not accessible - { - } - - public warp_Light(warp_Vector direction) - { - v = direction.getClone(); - v.normalize(); - } - - public warp_Light(warp_Vector direction, int diffuse) - { - v = direction.getClone(); - v.normalize(); - this.diffuse = diffuse; - } - - public warp_Light(warp_Vector direction, int color, int highlightSheen, int highlightSpread) - { - v = direction.getClone(); - v.normalize(); - this.diffuse = color; - this.specular = color; - this.highlightSheen = highlightSheen; - this.highlightSpread = highlightSpread; - } - - public warp_Light(warp_Vector direction, int diffuse, int specular,int highlightSheen, int highlightSpread) - { - v = direction.getClone(); - v.normalize(); - this.diffuse = diffuse; - this.specular = specular; - this.highlightSheen = highlightSheen; - this.highlightSpread = highlightSpread; - } - - public void project(warp_Matrix m) - { - matrix2 = m.getClone(); - matrix2.transform(m); - v2 = v.transform(matrix2); - } - } -} diff --git a/trunk/managed/Warp3D/Warp3D/warp_Lightmap.cs b/trunk/managed/Warp3D/Warp3D/warp_Lightmap.cs deleted file mode 100644 index ffb74d01..00000000 --- a/trunk/managed/Warp3D/Warp3D/warp_Lightmap.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System; - -namespace Rednettle.Warp3D -{ - /// - /// Summary description for warp_Lightmap. - /// - public class warp_Lightmap - { - public int[] diffuse = new int[65536]; - public int[] specular = new int[65536]; - private float[] sphere = new float[65536]; - private warp_Light[] light; - private int lights; - private int ambient; - private int temp, overflow, color, pos, r, g, b; - - public warp_Lightmap(warp_Scene scene) - { - scene.rebuild(); - - light = scene.light; - lights = scene.lights; - ambient = scene.environment.ambient; - - buildSphereMap(); - rebuildLightmap(); - } - - private void buildSphereMap() - { - float fnx, fny, fnz; - int pos; - for (int ny = -128; ny < 128; ny++) - { - fny = (float) ny / 128; - for (int nx = -128; nx < 128; nx++) - { - pos = nx + 128 + ( (ny + 128) << 8); - fnx = (float) nx / 128; - fnz = (float) (1 - Math.Sqrt(fnx * fnx + fny * fny)); - sphere[pos] = (fnz > 0) ? fnz : 0; - } - } - } - - public void rebuildLightmap() - { - System.Console.WriteLine(">> Rebuilding Light Map ... [" + lights + " light sources]"); - warp_Vector l; - float fnx, fny, phongfact, sheen, spread; - int diffuse, specular, cos, dr, dg, db, sr, sg, sb; - for (int ny = -128; ny < 128; ny++) - { - fny = (float) ny / 128; - for (int nx = -128; nx < 128; nx++) - { - pos = nx + 128 + ( (ny + 128) << 8); - fnx = (float) nx / 128; - sr = sg = sb = 0; - - dr = warp_Color.getRed(ambient); - dg = warp_Color.getGreen(ambient); - db = warp_Color.getBlue(ambient); - - for (int i = 0; i < lights; i++) - { - l = light[i].v; - diffuse = light[i].diffuse; - specular = light[i].specular; - sheen = (float) light[i].highlightSheen / 255f; - spread = (float) light[i].highlightSpread / 4096; - spread = (spread < 0.01f) ? 0.01f : spread; - cos = (int) (255 * warp_Vector.angle(light[i].v,new warp_Vector(fnx, fny, sphere[pos]))); - cos = (cos > 0) ? cos : 0; - dr += (warp_Color.getRed(diffuse) * cos) >> 8; - dg += (warp_Color.getGreen(diffuse) * cos) >> 8; - db += (warp_Color.getBlue(diffuse) * cos) >> 8; - phongfact = sheen * (float) Math.Pow( (float) cos / 255f, 1 / spread); - sr += (int) ( (float) warp_Color.getRed(specular) * phongfact); - sg += (int) ( (float) warp_Color.getGreen(specular) * phongfact); - sb += (int) ( (float) warp_Color.getBlue(specular) * phongfact); - } - this.diffuse[pos] = warp_Color.getCropColor(dr, dg, db); - this.specular[pos] = warp_Color.getCropColor(sr, sg, sb); - } - } - } - } -} diff --git a/trunk/managed/Warp3D/Warp3D/warp_Material.cs b/trunk/managed/Warp3D/Warp3D/warp_Material.cs deleted file mode 100644 index 13471919..00000000 --- a/trunk/managed/Warp3D/Warp3D/warp_Material.cs +++ /dev/null @@ -1,244 +0,0 @@ -using System; -using System.Drawing; -using System.IO; - -namespace Rednettle.Warp3D -{ - /// - /// Summary description for warp_Material. - /// - public class warp_Material - { - public int color=0; - public int transparency=0; - public int reflectivity=255; - public int type=0; - public warp_Texture texture=null; - public warp_Texture envmap=null; - public bool flat=false; - public bool wireframe=false; - public bool opaque=true; - public String texturePath=null; - public String envmapPath=null; - public warp_TextureSettings textureSettings=null; - public warp_TextureSettings envmapSettings=null; - public double rwx = 500.00; - public double rwy = 500.00; - public Point pt = new Point(0,0); - public int offset = 0; - - public warp_Material() - { - // - // TODO: Add constructor logic here - // - } - public warp_Material(int color) - { - setColor(color); - } - - public warp_Material(warp_Texture t) - { - setTexture(t); - reflectivity=255; - } - - public warp_Material(String path) - { - - FileStream fs = new FileStream(path,FileMode.Open); - BinaryReader br = new BinaryReader(fs); - - importFromStream(br); - } - - private void importFromStream(BinaryReader inStream) - { - readSettings(inStream); - readTexture(inStream, true); - readTexture(inStream, false); - } - - private void readSettings(BinaryReader inStream) - { - setColor(readInt(inStream)); - setTransparency(inStream.ReadByte()); - setReflectivity(inStream.ReadByte()); - setFlat(inStream.ReadBoolean()); - } - - private int readInt(BinaryReader inStream) - { - return (inStream.ReadByte() << 24) | (inStream.ReadByte() << 16) | (inStream.ReadByte() << 8) | inStream.ReadByte(); - } - - private string readString(BinaryReader inStream) - { - string result = ""; - byte inByte; - while ( (inByte = (byte) inStream.ReadByte()) != 60) - { - result += (char) inByte; - } - - return result; - } - - - - private void readTexture(BinaryReader inStream, bool textureId) - { - warp_Texture t = null; - int id = inStream.ReadSByte(); - if (id == 1) - { - t = new warp_Texture( "c:/source/warp3d/materials/skymap.jpg" ); - - if (t != null && textureId) - { - texturePath = t.path; - textureSettings = null; - setTexture(t); - } - if (t != null && !textureId) - { - envmapPath = t.path; - envmapSettings = null; - setEnvmap(t); - } - } - - if (id == 2) - { - int w = readInt(inStream); - int h = readInt(inStream); - int type = inStream.ReadSByte(); - - float persistency = readInt(inStream); - float density = readInt(inStream); - - persistency = .5f; - density = .5f; - - int samples = inStream.ReadByte(); - int numColors = inStream.ReadByte(); - int[] colors = new int[numColors]; - for (int i = 0; i < numColors; i++) - { - colors[i] = readInt(inStream); - - } - if (type == 1) - { - t = warp_TextureFactory.PERLIN(w, h, persistency, density, samples, 1024).colorize(warp_Color.makeGradient(colors, 1024)); - } - if (type == 2) - { - t = warp_TextureFactory.WAVE(w, h, persistency, density, samples, 1024).colorize(warp_Color.makeGradient(colors, 1024)); - } - if (type == 3) - { - t = warp_TextureFactory.GRAIN(w, h, persistency, density, samples, 20, 1024).colorize(warp_Color.makeGradient(colors, 1024)); - - } - - if (textureId) - { - texturePath = null; - textureSettings = new warp_TextureSettings(t, w, h, type, persistency, density, samples, colors); - setTexture(t); - } - else - { - envmapPath = null; - envmapSettings = new warp_TextureSettings(t, w, h, type, persistency, density, samples, colors); - setEnvmap(t); - } - } - } - - public void setTexture(warp_Texture t) - { - texture=t; - if (texture!=null) texture.resize(); - } - - public void setEnvmap(warp_Texture env) - { - envmap=env; - env.resize(256,256); - } - - public void setColor(int c) - { - color=c; - } - - public void setTransparency(int factor) - { - transparency=warp_Math.crop(factor,0,255); - opaque=(transparency==0); - } - - public void setReflectivity(int factor) - { - reflectivity=warp_Math.crop(factor,0,255); - } - - public void setFlat(bool flat) - { - this.flat=flat; - } - - public void setWireframe(bool wireframe) - { - this.wireframe=wireframe; - } - - public void setType(int type) - { - this.type = type; - } - - public warp_Texture getTexture() - { - return texture; - } - - public warp_Texture getEnvmap() - { - return envmap; - } - - public int getColor() - { - return color; - } - - public int getTransparency() - { - return transparency; - } - - public int getReflectivity() - { - return reflectivity; - } - - public int getType() - { - return type; - } - - public bool isFlat() - { - return flat; - } - - public bool isWireframe() - { - return wireframe; - } - } -} diff --git a/trunk/managed/Warp3D/Warp3D/warp_Math.cs b/trunk/managed/Warp3D/Warp3D/warp_Math.cs deleted file mode 100644 index 2521b4bf..00000000 --- a/trunk/managed/Warp3D/Warp3D/warp_Math.cs +++ /dev/null @@ -1,215 +0,0 @@ -using System; - -namespace Rednettle.Warp3D -{ - /// - /// Summary description for warp_Math. - /// - public class warp_Math - { - private static float[] sinus; - private static float[] cosinus; - private static bool trig=false; - public static float pi=3.1415926535f; - private static float rad2scale=4096f/3.14159265f/2f; - private static float pad=256*3.14159265f; - - private static int[] fastRandoms; - private static int fastRndPointer=0; - private static bool fastRndInit=false; - - private static Random _rnd = new Random(); - - - public warp_Math() - { - // - // TODO: Add constructor logic here - // - } - - public static float interpolate(float a, float b, float d) - { - float f = (1 - cos(d * pi)) * 0.5f; - return a + f * (b - a); - } - - - public static float random() - { - Random rnd = new Random(); - return (float) (rnd.NextDouble() * 2 - 1); - } - - public static float random(float min, float max) - { - //Random rnd = new Random(); - return (float) (_rnd.NextDouble() * (max - min) + min); - } - - public static float randomWithDelta(float averidge, float delta) - { - return averidge + random() * delta; - } - - public static int fastRnd(int bits) - { - if (bits < 1) - { - return 0; - } - fastRndPointer = (fastRndPointer + 1) & 31; - if (!fastRndInit) - { - fastRandoms = new int[32]; - for (int i = 0; i < 32; i++) - { - fastRandoms[i] = (int) random(0, 0xFFFFFF); - } - fastRndInit = true; - } - return fastRandoms[fastRndPointer] & (1 << (bits - 1)); - } - - public static int fastRndBit() - { - return fastRnd(1); - } - - public static float deg2rad(float deg) - { - return deg*0.0174532925194f; - } - - public static float rad2deg(float rad) - { - return rad*57.295779514719f; - } - - public static float sin(float angle) - { - if(!trig) buildTrig(); - return sinus[(int)((angle+pad)*rad2scale)&0xFFF]; - } - - public static float cos(float angle) - { - if(!trig) buildTrig(); - return cosinus[(int)((angle+pad)*rad2scale)&0xFFF]; - } - - private static void buildTrig() - { - System.Console.WriteLine(">> Building warp_Math LUT"); - - sinus=new float[4096]; - cosinus=new float[4096]; - - for (int i=0;i<4096;i++) - { - sinus[i]=(float)Math.Sin((float)i/rad2scale); - cosinus[i]=(float)Math.Cos((float)i/rad2scale); - } - - trig=true; - } - - public static float pythagoras(float a, float b) - { - return (float)Math.Sqrt(a*a+b*b); - } - - public static int pythagoras(int a, int b) - { - return (int)Math.Sqrt(a*a+b*b); - } - - public static int crop(int num, int min, int max) - { - return (nummax)?max:num; - } - - public static float crop(float num, float min, float max) - { - return (nummax)?max:num; - } - - public static bool inrange(int num, int min, int max) - { - return ((num>=min)&&(num=0;i--) buffer[i]=crop(buffer[i],min,max); - } - - public static void copyBuffer(int[] source, int[] target) - { - System.Array.Copy(source,0,target,0,crop(source.GetLength(0),0,target.GetLength(0))); - } - - /* - public static float random() - { - return (float)(Math.r.random()*2-1); - } - - public static float random(float min, float max) - { - return (float)(Math.random()*(max-min)+min); - } - - public static float randomWithDelta(float averidge, float delta) - { - return averidge+random()*delta; - } - */ - } -} diff --git a/trunk/managed/Warp3D/Warp3D/warp_Matrix.cs b/trunk/managed/Warp3D/Warp3D/warp_Matrix.cs deleted file mode 100644 index abaff0fb..00000000 --- a/trunk/managed/Warp3D/Warp3D/warp_Matrix.cs +++ /dev/null @@ -1,362 +0,0 @@ -using System; - -namespace Rednettle.Warp3D -{ - public class warp_Matrix - { - public float m00=1, m01=0, m02=0, m03=0; - public float m10=0, m11=1, m12=0, m13=0; - public float m20=0, m21=0, m22=1, m23=0; - public float m30=0, m31=0, m32=0, m33=1; - - public warp_Matrix(warp_Vector right, warp_Vector up, warp_Vector forward) - { - m00=right.x; - m10=right.y; - m20=right.z; - m01=up.x; - m11=up.y; - m21=up.z; - m02=forward.x; - m12=forward.y; - m22=forward.z; - } - - - - public float this[ int column, int row ] - { - get - { - switch ( row ) - { - case 0: - if ( column == 0 ) return m00; - if ( column == 1 ) return m01; - if ( column == 2 ) return m02; - if ( column == 3 ) return m03; - break; - case 1: - if ( column == 0 ) return m11; - if ( column == 1 ) return m11; - if ( column == 2 ) return m12; - if ( column == 3 ) return m13; - break; - case 2: - if ( column == 0 ) return m20; - if ( column == 1 ) return m21; - if ( column == 2 ) return m22; - if ( column == 3 ) return m23; - break; - case 3: - if ( column == 0 ) return m30; - if ( column == 1 ) return m31; - if ( column == 2 ) return m32; - if ( column == 3 ) return m33; - break; - - default: - return 0; - } - - return 0; - } - } - - public warp_Matrix() - { - // - // TODO: Add constructor logic here - // - } - - public static warp_Matrix shiftMatrix(float dx, float dy, float dz) - // matrix for shifting - { - warp_Matrix m=new warp_Matrix(); - m.m03=dx; - m.m13=dy; - m.m23=dz; - return m; - } - - public static warp_Matrix quaternionMatrix( warp_Quaternion quat ) - { - warp_Matrix m = new warp_Matrix(); - - - float xx = quat.X * quat.X; - float xy = quat.X * quat.Y; - float xz = quat.X * quat.Z; - float xw = quat.X * quat.W; - float yy = quat.Y * quat.Y; - float yz = quat.Y * quat.Z; - float yw = quat.Y * quat.W; - float zz = quat.Z * quat.Z; - float zw = quat.Z * quat.W; - - m.m00 = 1 - 2 * ( yy + zz ); - m.m01 = 2 * ( xy - zw) ; - m.m02 = 2*(xz + yw); - m.m10 = 2*(xy + zw); - m.m11 = 1 - 2* ( xx + zz ); - m.m12 = 2*(yz - xw); - m.m20 = 2*(xz - yw); - m.m21 = 2*(yz + xw); - m.m22 = 1 - 2 * ( xx + yy ); - - m.m03 = m.m13 = m.m23 = m.m30 = m.m31 = m.m32 = 0; - m.m33 = 1; - - return m; - } - - public warp_Matrix rotateMatrix( warp_Quaternion quat ) - { - - reset(); - - warp_Matrix temp = warp_Matrix.quaternionMatrix( quat ); - warp_Matrix result = warp_Matrix.multiply( this, temp ); - - return result; - } - - public static warp_Matrix scaleMatrix(float dx, float dy, float dz) - { - warp_Matrix m=new warp_Matrix(); - - m.m00=dx; - m.m11=dy; - m.m22=dz; - - return m; - } - - public static warp_Matrix scaleMatrix(float d) - { - return warp_Matrix.scaleMatrix(d,d,d); - } - - public static warp_Matrix rotateMatrix(float dx, float dy, float dz) - { - warp_Matrix res=new warp_Matrix(); - - float SIN; - float COS; - - if (dx!=0) - { - warp_Matrix m =new warp_Matrix(); - SIN=warp_Math.sin(dx); - COS=warp_Math.cos(dx); - m.m11=COS; - m.m12=SIN; - m.m21=-SIN; - m.m22=COS; - - res.transform(m); - } - if (dy!=0) - { - warp_Matrix m =new warp_Matrix(); - SIN=warp_Math.sin(dy); - COS=warp_Math.cos(dy); - m.m00=COS; - m.m02=SIN; - m.m20=-SIN; - m.m22=COS; - - res.transform(m); - } - if (dz!=0) - { - warp_Matrix m =new warp_Matrix(); - SIN=warp_Math.sin(dz); - COS=warp_Math.cos(dz); - m.m00=COS; - m.m01=SIN; - m.m10=-SIN; - m.m11=COS; - - res.transform(m); - } - - return res; - } - - public void shift(float dx, float dy, float dz) - { - - transform( shiftMatrix( dx, dy, dz ) ); - } - - public void scale(float dx, float dy, float dz) - { - transform(scaleMatrix(dx,dy,dz)); - } - - public void scale(float d) - { - transform(scaleMatrix(d)); - } - - public void rotate(float dx, float dy, float dz) - { - transform(rotateMatrix(dx,dy,dz)); - } - - public void rotate( warp_Quaternion quat, float x, float y, float z ) - { - transform( rotateMatrix( quat ) ); - } - - public void rotate( warp_Matrix m ) - { - transform( m ); - } - - public void scaleSelf( float dx, float dy, float dz ) - { - preTransform(scaleMatrix(dx,dy,dz)); - } - - public void scaleSelf(float d) - { - preTransform(scaleMatrix(d)); - } - - public void shiftSelf( float dx, float dy, float dz ) - { - preTransform( shiftMatrix( dx, dy, dz ) ); - } - - public void rotateSelf( float dx, float dy, float dz ) - { - preTransform( rotateMatrix( dx, dy, dz ) ); - } - public void rotateSelf( warp_Matrix m ) - { - preTransform( m ); - } - - public void rotateSelf( warp_Quaternion quat ) - { - preTransform(rotateMatrix( quat) ); - } - - - public void transform(warp_Matrix n) - { - warp_Matrix m=this.getClone(); - - m00 = n.m00*m.m00 + n.m01*m.m10 + n.m02*m.m20; - m01 = n.m00*m.m01 + n.m01*m.m11 + n.m02*m.m21; - m02 = n.m00*m.m02 + n.m01*m.m12 + n.m02*m.m22; - m03 = n.m00*m.m03 + n.m01*m.m13 + n.m02*m.m23 + n.m03; - m10 = n.m10*m.m00 + n.m11*m.m10 + n.m12*m.m20; - m11 = n.m10*m.m01 + n.m11*m.m11 + n.m12*m.m21; - m12 = n.m10*m.m02 + n.m11*m.m12 + n.m12*m.m22; - m13 = n.m10*m.m03 + n.m11*m.m13 + n.m12*m.m23 + n.m13; - m20 = n.m20*m.m00 + n.m21*m.m10 + n.m22*m.m20; - m21 = n.m20*m.m01 + n.m21*m.m11 + n.m22*m.m21; - m22 = n.m20*m.m02 + n.m21*m.m12 + n.m22*m.m22; - m23 = n.m20*m.m03 + n.m21*m.m13 + n.m22*m.m23 + n.m23; - } - - public void preTransform(warp_Matrix n) - { - warp_Matrix m=this.getClone(); - - m00 = m.m00*n.m00 + m.m01*n.m10 + m.m02*n.m20; - m01 = m.m00*n.m01 + m.m01*n.m11 + m.m02*n.m21; - m02 = m.m00*n.m02 + m.m01*n.m12 + m.m02*n.m22; - m03 = m.m00*n.m03 + m.m01*n.m13 + m.m02*n.m23 + m.m03; - m10 = m.m10*n.m00 + m.m11*n.m10 + m.m12*n.m20; - m11 = m.m10*n.m01 + m.m11*n.m11 + m.m12*n.m21; - m12 = m.m10*n.m02 + m.m11*n.m12 + m.m12*n.m22; - m13 = m.m10*n.m03 + m.m11*n.m13 + m.m12*n.m23 + m.m13; - m20 = m.m20*n.m00 + m.m21*n.m10 + m.m22*n.m20; - m21 = m.m20*n.m01 + m.m21*n.m11 + m.m22*n.m21; - m22 = m.m20*n.m02 + m.m21*n.m12 + m.m22*n.m22; - m23 = m.m20*n.m03 + m.m21*n.m13 + m.m22*n.m23 + m.m23; - } - - public static warp_Matrix multiply(warp_Matrix m1, warp_Matrix m2) - { - warp_Matrix m=new warp_Matrix(); - - m.m00 = m1.m00*m2.m00 + m1.m01*m2.m10 + m1.m02*m2.m20; - m.m01 = m1.m00*m2.m01 + m1.m01*m2.m11 + m1.m02*m2.m21; - m.m02 = m1.m00*m2.m02 + m1.m01*m2.m12 + m1.m02*m2.m22; - m.m03 = m1.m00*m2.m03 + m1.m01*m2.m13 + m1.m02*m2.m23 + m1.m03; - m.m10 = m1.m10*m2.m00 + m1.m11*m2.m10 + m1.m12*m2.m20; - m.m11 = m1.m10*m2.m01 + m1.m11*m2.m11 + m1.m12*m2.m21; - m.m12 = m1.m10*m2.m02 + m1.m11*m2.m12 + m1.m12*m2.m22; - m.m13 = m1.m10*m2.m03 + m1.m11*m2.m13 + m1.m12*m2.m23 + m1.m13; - m.m20 = m1.m20*m2.m00 + m1.m21*m2.m10 + m1.m22*m2.m20; - m.m21 = m1.m20*m2.m01 + m1.m21*m2.m11 + m1.m22*m2.m21; - m.m22 = m1.m20*m2.m02 + m1.m21*m2.m12 + m1.m22*m2.m22; - m.m23 = m1.m20*m2.m03 + m1.m21*m2.m13 + m1.m22*m2.m23 + m1.m23; - - return m; - } - -/* - public string toString() - { - // todo - } -*/ - public warp_Matrix getClone() - { - warp_Matrix m=new warp_Matrix(); - - m.m00=m00; m.m01=m01; m.m02=m02; m.m03=m03; - m.m10=m10; m.m11=m11; m.m12=m12; m.m13=m13; - m.m20=m20; m.m21=m21; m.m22=m22; m.m23=m23; - m.m30=m30; m.m31=m31; m.m32=m32; m.m33=m33; - - return m; - } - - public warp_Matrix inverse() - { - warp_Matrix m=new warp_Matrix(); - - float q1 = m12; float q6 = m10*m01; float q7 = m10*m21; float q8 = m02; - float q13 = m20*m01; float q14 = m20*m11; float q21 = m02*m21; float q22 = m03*m21; - float q25 = m01*m12; float q26 = m01*m13; float q27 = m02*m11; float q28 = m03*m11; - float q29 = m10*m22; float q30 = m10*m23; float q31 = m20*m12; float q32 = m20*m13; - float q35 = m00*m22; float q36 = m00*m23; float q37 = m20*m02; float q38 = m20*m03; - float q41 = m00*m12; float q42 = m00*m13; float q43 = m10*m02; float q44 = m10*m03; - float q45 = m00*m11; float q48 = m00*m21; - float q49 = q45*m22-q48*q1-q6*m22+q7*q8; - float q50 = q13*q1-q14*q8; - float q51 = 1/(q49+q50); - - m.m00 = (m11*m22*m33-m11*m23*m32-m21*m12*m33+m21*m13*m32+m31*m12*m23-m31*m13*m22)*q51; - m.m01 = -(m01*m22*m33-m01*m23*m32-q21*m33+q22*m32)*q51; - m.m02 = (q25*m33-q26*m32-q27*m33+q28*m32)*q51; - m.m03 = -(q25*m23-q26*m22-q27*m23+q28*m22+q21*m13-q22*m12)*q51; - m.m10 = -(q29*m33-q30*m32-q31*m33+q32*m32)*q51; - m.m11 = (q35*m33-q36*m32-q37*m33+q38*m32)*q51; - m.m12 = -(q41*m33-q42*m32-q43*m33+q44*m32)*q51; - m.m13 = (q41*m23-q42*m22-q43*m23+q44*m22+q37*m13-q38*m12)*q51; - m.m20 = (q7*m33-q30*m31-q14*m33+q32*m31)*q51; - m.m21 = -(q48*m33-q36*m31-q13*m33+q38*m31)*q51; - m.m22 = (q45*m33-q42*m31-q6*m33+q44*m31)*q51; - m.m23 = -(q45*m23-q42*m21-q6*m23+q44*m21+q13*m13-q38*m11)*q51; - - return m; - } - - public void reset() - { - m00=1; m01=0; m02=0; m03=0; - m10=0; m11=1; m12=0; m13=0; - m20=0; m21=0; m22=1; m23=0; - m30=0; m31=0; m32=0; m33=1; - } - } -} diff --git a/trunk/managed/Warp3D/Warp3D/warp_Object.cs b/trunk/managed/Warp3D/Warp3D/warp_Object.cs deleted file mode 100644 index e4e97e87..00000000 --- a/trunk/managed/Warp3D/Warp3D/warp_Object.cs +++ /dev/null @@ -1,378 +0,0 @@ -using System; -using System.Collections; - -namespace Rednettle.Warp3D -{ - /// - /// Summary description for warp_Object. - /// - public class warp_Object : warp_CoreObject - { - public Object userData=null; // Can be freely used - public String user=null; // Can be freely used - - public ArrayList vertexData=new ArrayList(); - public ArrayList triangleData=new ArrayList(); - - - public int id; // This object's index - public String name=""; // This object's name - public bool visible=true; // Visibility tag - public bool projected=false; - public warp_Scene parent=null; - private bool dirty=true; // Flag for dirty handling - - public warp_Vertex[] fastvertex; - public warp_Triangle[] fasttriangle; - - public int vertices=0; - public int triangles=0; - - public warp_Material material = null; - public int index; - public int offset = 0; - public int split = 0; - - public warp_Object() - { - } - - public warp_Vertex vertex(int id) - { - return (warp_Vertex) vertexData[id]; - } - - public warp_Triangle triangle(int id) - { - return (warp_Triangle) triangleData[id]; - } - - public void addVertex(warp_Vertex newVertex) - { - newVertex.parent=this; - vertexData.Add(newVertex); - dirty=true; - } - - public void addTriangle(warp_Triangle newTriangle) - { - newTriangle.parent=this; - triangleData.Add(newTriangle); - dirty=true; - } - - public void addTriangle(int v1, int v2, int v3) - { - addTriangle(vertex(v1),vertex(v2),vertex(v3)); - } - - public void removeVertex(warp_Vertex v) - { - vertexData.Remove(v); - } - - public void removeTriangle(warp_Triangle t) - { - triangleData.Remove(t); - } - - public void removeVertexAt(int pos) - { - vertexData.Remove(pos); - } - - public void removeTriangleAt(int pos) - { - triangleData.Remove(pos); - } - - public void setMaterial(warp_Material m) - { - material = m; - } - - public void rebuild() - { - if (!dirty) return; - dirty=false; - - // Generate faster structure for vertices - vertices=vertexData.Count; - fastvertex=new warp_Vertex[vertices]; - - IEnumerator enumerator=vertexData.GetEnumerator(); - for (int i=vertices-1;i>=0;i--) - { - enumerator.MoveNext(); - fastvertex[i]=(warp_Vertex)enumerator.Current; - } - - // Generate faster structure for triangles - triangles=triangleData.Count; - fasttriangle=new warp_Triangle[triangles]; - - enumerator=triangleData.GetEnumerator(); - for (int i=triangles-1;i>=0;i--) - { - enumerator.MoveNext(); - fasttriangle[i]=(warp_Triangle)enumerator.Current; - fasttriangle[i].id=i; - } - - for (int i=vertices-1;i>=0;i--) - { - fastvertex[i].id=i; - fastvertex[i].resetNeighbors(); - } - - warp_Triangle tri; - for (int i=triangles-1;i>=0;i--) - { - tri=fasttriangle[i]; - tri.p1.registerNeighbor(tri); - tri.p2.registerNeighbor(tri); - tri.p3.registerNeighbor(tri); - } - - regenerate(); - } - - /* - public void rebuild() - { - if (!dirty) return; - dirty=false; - - Enumeration enum; - - // Generate faster structure for vertices - vertices=vertexData.size(); - vertex=new warp_Vertex[vertices]; - enum=vertexData.elements(); - for (int i=vertices-1;i>=0;i--) vertex[i]=(warp_Vertex)enum.nextElement(); - - // Generate faster structure for triangles - triangles=triangleData.size(); - triangle=new warp_Triangle[triangles]; - enum=triangleData.elements(); - for (int i=triangles-1;i>=0;i--) - { - triangle[i]=(warp_Triangle)enum.nextElement(); - triangle[i].id=i; - } - - for (int i=vertices-1;i>=0;i--) - { - vertex[i].id=i; - vertex[i].resetNeighbors(); - } - - warp_Triangle tri; - for (int i=triangles-1;i>=0;i--) - { - tri=triangle[i]; - tri.p1.registerNeighbor(tri); - tri.p2.registerNeighbor(tri); - tri.p3.registerNeighbor(tri); - } - - regenerate(); - } - */ - - public void addVertex(float x, float y, float z) - { - addVertex(new warp_Vertex(x,y,z)); - } - - - public void addVertex(float x, float y, float z, float u, float v) - { - warp_Vertex vert=new warp_Vertex(x,y,z); - vert.setUV(u,v); - addVertex(vert); - } - - public void addTriangle(warp_Vertex a, warp_Vertex b, warp_Vertex c) - { - addTriangle(new warp_Triangle(a,b,c)); - } - - public void regenerate() - // Regenerates the vertex normals - { - for (int i=0;imaxX) maxX=fastvertex[i].pos.x; - if(fastvertex[i].pos.y>maxY) maxY=fastvertex[i].pos.y; - if(fastvertex[i].pos.z>maxZ) maxZ=fastvertex[i].pos.z; - } - return new warp_Vector(maxX,maxY,maxZ); - } - - - public void detach() - // Centers the object in its coordinate system - // The offset from origin to object center will be transfered to the matrix, - // so your object actually does not move. - // Usefull if you want prepare objects for self rotation. - { - warp_Vector center=getCenter(); - - for (int i=0;i=0;i--) - fastvertex[i].pos=fastvertex[i].pos.transform(matrix); - - regenerate(); - matrix.reset(); - normalmatrix.reset(); - } - - public warp_Object getClone() - { - warp_Object obj=new warp_Object(); - rebuild(); - for(int i=0;i - /// Summary description for warp_ObjectFactory. - /// - public class warp_ObjectFactory - { - public static double pi = 3.1415926535; - public static double deg2rad = pi / 180; - - public static warp_Object SIMPLEPLANE(float size, bool doubleSided) - { - warp_Object newObject = new warp_Object(); - - newObject.addVertex( new warp_Vertex( -size, 0f, size, 0, 0 ) ); - newObject.addVertex( new warp_Vertex( size, 0f, size, 4f, 0 ) ); - newObject.addVertex( new warp_Vertex( size, 0f, -size, 4f, 4f ) ); - newObject.addVertex( new warp_Vertex( -size, 0f, -size, 0, 4f ) ); - - newObject.addTriangle(0, 3, 2); - newObject.addTriangle(0, 2, 1); - - if(doubleSided) - { - newObject.addTriangle(0, 2, 3); - newObject.addTriangle(0, 1, 2); - } - - return newObject; - } - - public static warp_Object CUBE(float size) - { - return BOX(size, size, size); - } - - public static warp_Object BOX(warp_Vector size) - { - return BOX(size.x, size.y, size.z); - } - - public static warp_Object BOX(float xsize, float ysize, float zsize) - { - float x = (float) Math.Abs(xsize / 2); - float y = (float) Math.Abs(ysize / 2); - float z = (float) Math.Abs(zsize / 2); - - float xx, yy, zz; - - warp_Object n = new warp_Object(); - int[] xflag = new int[6]; - int[] yflag = new int[6]; - int[] zflag = new int[6]; - - xflag[0] = 10; - yflag[0] = 3; - zflag[0] = 0; - xflag[1] = 10; - yflag[1] = 15; - zflag[1] = 3; - xflag[2] = 15; - yflag[2] = 3; - zflag[2] = 10; - xflag[3] = 10; - yflag[3] = 0; - zflag[3] = 12; - xflag[4] = 0; - yflag[4] = 3; - zflag[4] = 5; - xflag[5] = 5; - yflag[5] = 3; - zflag[5] = 15; - - for (int side = 0; side < 6; side++) - { - for (int i = 0; i < 4; i++) - { - xx = ( (xflag[side] & (1 << i)) > 0) ? x : -x; - yy = ( (yflag[side] & (1 << i)) > 0) ? y : -y; - zz = ( (zflag[side] & (1 << i)) > 0) ? z : -z; - n.addVertex(xx, yy, zz, i & 1, (i & 2) >> 1); - } - int t = side << 2; - n.addTriangle(t, t + 2, t + 3); - n.addTriangle(t, t + 3, t + 1); - } - - return n; - } - - public static warp_Object CONE(float height, float radius, int segments) - { - warp_Vector[] path = new warp_Vector[4]; - float h = height / 2; - path[0] = new warp_Vector(0, h, 0); - path[1] = new warp_Vector(radius, -h, 0); - path[2] = new warp_Vector(radius, -h, 0); - path[3] = new warp_Vector(0, -h, 0); - - return ROTATIONOBJECT(path, segments); - } - - public static warp_Object CYLINDER(float height, float radius,int segments) - { - warp_Vector[] path = new warp_Vector[6]; - float h = height / 2; - path[0] = new warp_Vector(0, h, 0); - path[1] = new warp_Vector(radius, h, 0); - path[2] = new warp_Vector(radius, h, 0); - path[3] = new warp_Vector(radius, -h, 0); - path[4] = new warp_Vector(radius, -h, 0); - path[5] = new warp_Vector(0, -h, 0); - - return ROTATIONOBJECT(path, segments); - } - - public static warp_Object SPHERE(float radius, int segments) - { - warp_Vector[] path = new warp_Vector[segments]; - - float x, y, angle; - - path[0] = new warp_Vector(0, radius, 0); - path[segments - 1] = new warp_Vector(0, -radius, 0); - - for (int i = 1; i < segments - 1; i++) - { - angle = - ( ( (float) i / (float) (segments - 2)) - 0.5f) * - 3.14159265f; - x = (float) Math.Cos(angle) * radius; - y = (float) Math.Sin(angle) * radius; - path[i] = new warp_Vector(x, y, 0); - } - - return ROTATIONOBJECT(path, segments); - } - - public static warp_Object ROTATIONOBJECT(warp_Vector[] path, int sides) - { - int steps = sides + 1; - warp_Object newObject = new warp_Object(); - double alpha = 2 * pi / ( (double) steps - 1); - float qx, qz; - int nodes = path.GetLength(0); - warp_Vertex vertex = null; - float u, v; // Texture coordinates - - for (int j = 0; j < steps; j++) - { - u = (float) (steps - j - 1) / (float) (steps - 1); - for (int i = 0; i < nodes; i++) - { - v = (float) i / (float) (nodes - 1); - qx = (float) (path[i].x * Math.Cos(j * alpha) + - path[i].z * Math.Sin(j * alpha)); - qz = (float) (path[i].z * Math.Cos(j * alpha) - - path[i].x * Math.Sin(j * alpha)); - vertex = new warp_Vertex(qx, path[i].y, qz); - vertex.u = u; - vertex.v = v; - newObject.addVertex(vertex); - } - } - - for (int j = 0; j < steps - 1; j++) - { - for (int i = 0; i < nodes - 1; i++) - { - newObject.addTriangle(i + nodes * j, i + nodes * (j + 1), - i + 1 + nodes * j); - newObject.addTriangle(i + nodes * (j + 1), - i + 1 + nodes * (j + 1), - i + 1 + nodes * j); - - } - } - - for (int i = 0; i < nodes - 1; i++) - { - newObject.addTriangle(i + nodes * (steps - 1), i, - i + 1 + nodes * (steps - 1)); - newObject.addTriangle(i, i + 1, i + 1 + nodes * (steps - 1)); - } - return newObject; - - } - - public static warp_Object TORUSKNOT(float p, float q, float r_tube,float r_out, float r_in, float h,int segments, int steps) - { - float x, y, z, r, t, theta; - - warp_Vector[] path = new warp_Vector[segments + 1]; - for (int i = 0; i < segments + 1; i++) - { - t = 2 * 3.14159265f * i / (float) segments; - r = r_out + r_in * warp_Math.cos(p * t); - z = h * warp_Math.sin(p * t); - theta = q * t; - x = r * warp_Math.cos(theta); - y = r * warp_Math.sin(theta); - path[i] = new warp_Vector(x, y, z); - } - return TUBE(path, r_tube, steps, true); - } - - public static warp_Object SPIRAL(float h, float r_out, float r_in, - float r_tube, float w, float f, - int segments, int steps) - { - float x, y, z, r, t, theta; - - warp_Vector[] path = new warp_Vector[segments + 1]; - for (int i = 0; i < segments + 1; i++) - { - t = (float) i / (float) segments; - r = r_out + r_in * warp_Math.sin(2 * 3.14159265f * f * t); - z = (h / 2) + h * t; - theta = 2 * 3.14159265f * w * t; - x = r * warp_Math.cos(theta); - y = r * warp_Math.sin(theta); - path[i] = new warp_Vector(x, y, z); - } - return TUBE(path, r_tube, steps, false); - } - - public static warp_Object TUBE(warp_Vector[] path, float r, int steps, bool closed) - { - warp_Vector[] circle = new warp_Vector[steps]; - float angle; - for (int i = 0; i < steps; i++) - { - angle = 2 * 3.14159265f * (float) i / (float) steps; - circle[i] = new warp_Vector(r * warp_Math.cos(angle), - r * warp_Math.sin(angle), 0f); - } - - warp_Object newObject = new warp_Object(); - int segments = path.GetLength(0); - warp_Vector forward, up, right; - warp_Matrix frenetmatrix; - warp_Vertex tempvertex; - float relx, rely; - int a, b, c, d; - - for (int i = 0; i < segments; i++) - { - // Calculate frenet frame matrix - - if (i != segments - 1) - { - forward = warp_Vector.sub(path[i + 1], path[i]); - } - else - { - if (!closed) - { - forward = warp_Vector.sub(path[i], path[i - 1]); - } - else - { - forward = warp_Vector.sub(path[1], path[0]); - } - } - - forward.normalize(); - up = new warp_Vector(0f, 0f, 1f); - right = warp_Vector.getNormal(forward, up); - up = warp_Vector.getNormal(forward, right); - frenetmatrix = new warp_Matrix(right, up, forward); - frenetmatrix.shift(path[i].x, path[i].y, path[i].z); - - // Add nodes - - relx = (float) i / (float) (segments - 1); - for (int k = 0; k < steps; k++) - { - rely = (float) k / (float) steps; - tempvertex = new warp_Vertex(circle[k].transform(frenetmatrix)); - tempvertex.u = relx; - tempvertex.v = rely; - newObject.addVertex(tempvertex); - } - } - - for (int i = 0; i < segments - 1; i++) - { - for (int k = 0; k < steps - 1; k++) - { - a = i * steps + k; - b = a + 1; - c = a + steps; - d = b + steps; - newObject.addTriangle(a, c, b); - newObject.addTriangle(b, c, d); - } - a = (i + 1) * steps - 1; - b = a + 1 - steps; - c = a + steps; - d = b + steps; - newObject.addTriangle(a, c, b); - newObject.addTriangle(b, c, d); - } - - return newObject; - } - } -} diff --git a/trunk/managed/Warp3D/Warp3D/warp_Quaternion.cs b/trunk/managed/Warp3D/Warp3D/warp_Quaternion.cs deleted file mode 100644 index ed31ea74..00000000 --- a/trunk/managed/Warp3D/Warp3D/warp_Quaternion.cs +++ /dev/null @@ -1,123 +0,0 @@ -using System; -using System.Collections; -using System.Text; -using System.Diagnostics; - -namespace Rednettle.Warp3D -{ - public class warp_Quaternion - { - public float X; - public float Y; - public float Z; - public float W; - - public warp_Quaternion() - { - } - - public warp_Quaternion( float x, float y, float z, float w ) - { - this.X = x; - this.Y = y; - this.Z = z; - this.W = w; - } - - public warp_Quaternion getClone() - { - return new warp_Quaternion( this.X, this.Y, this.Z, this.W ); - } - - static public warp_Quaternion matrix( warp_Matrix xfrm ) - { - warp_Quaternion quat = new warp_Quaternion(); - // Check the sum of the diagonal - float tr = xfrm[ 0, 0 ] + xfrm[ 1, 1 ] + xfrm[ 2, 2 ]; - if ( tr > 0.0f ) - { - // The sum is positive - // 4 muls, 1 div, 6 adds, 1 trig function call - float s = ( float )Math.Sqrt( tr + 1.0f ); - quat.W = s * 0.5f; - s = 0.5f / s; - quat.X = ( xfrm[ 1, 2 ] - xfrm[ 2, 1 ] ) * s; - quat.Y = ( xfrm[ 2, 0 ] - xfrm[ 0, 2 ] ) * s; - quat.Z = ( xfrm[ 0, 1 ] - xfrm[ 1, 0 ] ) * s; - } - else - { - // The sum is negative - // 4 muls, 1 div, 8 adds, 1 trig function call - int[] nIndex = { 1, 2, 0 }; - int i, j, k; - i = 0; - if ( xfrm[ 1, 1 ] > xfrm[ i, i ] ) - i = 1; - if ( xfrm[ 2, 2 ] > xfrm[ i, i ] ) - i = 2; - j = nIndex[ i ]; - k = nIndex[ j ]; - - float s = ( float )Math.Sqrt( ( xfrm[ i, i ] - ( xfrm[ j, j ] + xfrm[ k, k ] ) ) + 1.0f ); - quat[ i ] = s * 0.5f; - if ( s != 0.0 ) - { - s = 0.5f / s; - } - quat[ j ] = ( xfrm[ i, j ] + xfrm[ j, i ] ) * s; - quat[ k ] = ( xfrm[ i, k ] + xfrm[ k, i ] ) * s; - quat[ 3 ] = ( xfrm[ j, k ] - xfrm[ k, j ] ) * s; - } - - return quat; - } - - public float this[ int index ] - { - get - { - Debug.Assert( 0 <= index && index <= 3 ); - if ( index <= 1 ) - { - if ( index == 0 ) - { - return this.X; - } - return this.Y; - } - if ( index == 2 ) - { - return this.Z; - } - return this.W; - } - set - { - Debug.Assert( 0 <= index && index <= 3 ); - if ( index <= 1 ) - { - if ( index == 0 ) - { - this.X = value; - } - else - { - this.Y = value; - } - } - else - { - if ( index == 2 ) - { - this.Z = value; - } - else - { - this.W = value; - } - } - } - } - } -} diff --git a/trunk/managed/Warp3D/Warp3D/warp_Rasterizer.cs b/trunk/managed/Warp3D/Warp3D/warp_Rasterizer.cs deleted file mode 100644 index 957e9e37..00000000 --- a/trunk/managed/Warp3D/Warp3D/warp_Rasterizer.cs +++ /dev/null @@ -1,614 +0,0 @@ -using System; - -namespace Rednettle.Warp3D -{ - /// - /// Summary description for warp_Rasterizer. - /// - public class warp_Rasterizer - { - private bool materialLoaded=false; - private bool lightmapLoaded=false; - public bool ready=false; - - // Current material settings - private int color=0; - private int currentColor=0; - private int transparency=0; - private int reflectivity=0; - private int refraction=0; - private warp_Texture texture=null; - private int[] envmap=null; - private int[] diffuse=null; - private int[] specular=null; - private short[] refractionMap=null; - private int tw=0; - private int th=0; - private int tbitW=0; - private int tbitH=0; - - // Rasterizer hints - private int mode=0; - private int F=0; // FLAT - private int W=1; // WIREFRAME - private int P=2; // PHONG - private int E=4; // ENVMAP - private int T=8; // TEXTURED - private int SHADED = 0; - - warp_Vertex p1, p2, p3, tempVertex; - - private int - bkgrd, c, s, lutID, r, //lutID is position in LUT (diffuse,envmap,specular) - x1, x2, x3, x4, y1, y2, y3, z1, z2, z3, z4, - x, y, z, k, dx, dy, dz, offset, pos, temp, - xL, xR, xBase, zBase, xMax, yMax, dxL, dxR, dzBase, - - nx1, nx2, nx3, nx4, ny1, ny2, ny3, ny4, - nxBase, nyBase, - dnx4, dny4, - dnx, dny, nx, ny, - dnxBase, dnyBase, - dtx4, dty4; - - private float - tx1, tx2, tx3, tx4, ty1, ty2, ty3, ty4, - txBase, tyBase, - tx, ty, sw, - dtxBase, dtyBase, - dtx, dty, - sw1, sw2, sw3, sw4, swBase, dsw, dswBase; - - warp_Screen screen; - int[] zBuffer; - int[] idBuffer; - int width,height; - bool useIdBuffer; - int zFar=0xffffff; - int currentId=0; - - // Constructor - public warp_Rasterizer(warp_RenderPipeline pipeline) - { - SHADED = P | E | T; - - rebuildReferences(pipeline); - loadLightmap(pipeline.lightmap); - } - - // References - public void rebuildReferences(warp_RenderPipeline pipeline) - { - screen=pipeline.screen; - zBuffer=pipeline.zBuffer; - idBuffer=pipeline.idBuffer; - width=screen.width; - height=screen.height; - useIdBuffer=pipeline.useId; - } - - // Lightmap loader - public void loadLightmap(warp_Lightmap lm) - { - if (lm==null) return; - diffuse=lm.diffuse; - specular=lm.specular; - lightmapLoaded=true; - ready=lightmapLoaded&&materialLoaded; - } - - // Material loader - public void loadMaterial(warp_Material material) - { - color=material.color; - transparency=material.transparency; - reflectivity=material.reflectivity; - texture=material.texture; - if (material.envmap!=null) envmap=material.envmap.pixel; - else envmap=null; - - if (texture!=null) - { - tw=texture.width-1; - th=texture.height-1; - tbitW=texture.bitWidth; - tbitH=texture.bitHeight; - } - - mode=0; - if (!material.flat) mode|=P; - if (envmap!=null) mode|=E; - if (texture!=null) mode|=T; - if (material.wireframe) mode|=W; - materialLoaded=true; - ready=lightmapLoaded&&materialLoaded; - } - - public void render(warp_Triangle tri) - { - if (!ready) {return;} - if (tri.parent == null){return;} - if ( (mode & W) != 0) - { - drawWireframe(tri, color); - if ( (mode & W) == 0){return;} - } - - p1 = tri.p1; - p2 = tri.p2; - p3 = tri.p3; - - if (p1.y > p2.y){tempVertex = p1;p1 = p2;p2 = tempVertex;} - if (p2.y > p3.y){tempVertex = p2;p2 = p3;p3 = tempVertex;} - if (p1.y > p2.y){tempVertex = p1;p1 = p2;p2 = tempVertex;} - - if (p1.y >= height){return;} - if (p3.y < 0){return;} - if (p1.y == p3.y){return;} - - if (mode == F) - { - lutID = (int) (tri.n2.x * 127 + 127) +( (int) (tri.n2.y * 127 + 127) << 8); - c = warp_Color.multiply(color, diffuse[lutID]); - s = warp_Color.scale(specular[lutID], reflectivity); - currentColor = warp_Color.add(c, s); - } - - currentId = (tri.parent.id << 16) | tri.id; - - x1 = p1.x << 8; - x2 = p2.x << 8; - x3 = p3.x << 8; - y1 = p1.y; - y2 = p2.y; - y3 = p3.y; - - x4 = x1 + (x3 - x1) * (y2 - y1) / (y3 - y1); - x1 <<= 8; - x2 <<= 8; - x3 <<= 8; - x4 <<= 8; - - z1 = p1.z; - z2 = p2.z; - z3 = p3.z; - nx1 = p1.nx << 16; - nx2 = p2.nx << 16; - nx3 = p3.nx << 16; - ny1 = p1.ny << 16; - ny2 = p2.ny << 16; - ny3 = p3.ny << 16; - - sw1 = 1.0f / p1.sw; - sw2 = 1.0f / p2.sw; - sw3 = 1.0f / p3.sw; - - tx1 = p1.tx * sw1; - tx2 = p2.tx * sw2; - tx3 = p3.tx * sw3; - ty1 = p1.ty * sw1; - ty2 = p2.ty * sw2; - ty3 = p3.ty * sw3; - - dx = (x4 - x2) >> 16; - if (dx == 0) - { - return; - } - - temp = 256 * (y2 - y1) / (y3 - y1); - - z4 = z1 + ( (z3 - z1) >> 8) * temp; - nx4 = nx1 + ( (nx3 - nx1) >> 8) * temp; - ny4 = ny1 + ( (ny3 - ny1) >> 8) * temp; - - float tf = (float)(y2 - y1) / (float)(y3 - y1); - - tx4 = tx1 + ( (tx3 - tx1) * tf); - ty4 = ty1 + ( (ty3 - ty1) * tf); - - sw4 = sw1 + ( (sw3 - sw1) * tf) ; - - dz = (z4 - z2) / dx; - dnx = (nx4 - nx2) / dx; - dny = (ny4 - ny2) / dx; - dtx = (tx4 - tx2) / dx; - dty = (ty4 - ty2) / dx; - dsw = (sw4 - sw2) / dx; - - if (dx < 0) - { - temp = x2; - x2 = x4; - x4 = temp; - z2 = z4; - tx2 = tx4; - ty2 = ty4; - sw2 = sw4; - nx2 = nx4; - ny2 = ny4; - } - if (y2 >= 0) - { - dy = y2 - y1; - if (dy != 0) - { - dxL = (x2 - x1) / dy; - dxR = (x4 - x1) / dy; - dzBase = (z2 - z1) / dy; - dnxBase = (nx2 - nx1) / dy; - dnyBase = (ny2 - ny1) / dy; - dtxBase = (tx2 - tx1) / dy; - dtyBase = (ty2 - ty1) / dy; - dswBase = (sw2 - sw1) / dy; - } - - xBase = x1; - xMax = x1; - zBase = z1; - nxBase = nx1; - nyBase = ny1; - txBase = tx1; - tyBase = ty1; - swBase = sw1; - - if (y1 < 0) - { - xBase -= y1 * dxL; - xMax -= y1 * dxR; - zBase -= y1 * dzBase; - nxBase -= y1 * dnxBase; - nyBase -= y1 * dnyBase; - txBase -= y1 * dtxBase; - tyBase -= y1 * dtyBase; - swBase -= y1 * dswBase; - y1 = 0; - } - - y2 = (y2 < height) ? y2 : height; - offset = y1 * width; - for (y = y1; y < y2; y++) - { - renderLine(); - } - } - - if (y2 < height) - { - dy = y3 - y2; - if (dy != 0) - { - dxL = (x3 - x2) / dy; - dxR = (x3 - x4) / dy; - dzBase = (z3 - z2) / dy; - dnxBase = (nx3 - nx2) / dy; - dnyBase = (ny3 - ny2) / dy; - dtxBase = (tx3 - tx2) / dy; - dtyBase = (ty3 - ty2) / dy; - dswBase = (sw3 - sw2) / dy; - } - - xBase = x2; - xMax = x4; - zBase = z2; - nxBase = nx2; - nyBase = ny2; - txBase = tx2; - tyBase = ty2; - swBase = sw2; - - if (y2 < 0) - { - xBase -= y2 * dxL; - xMax -= y2 * dxR; - zBase -= y2 * dzBase; - nxBase -= y2 * dnxBase; - nyBase -= y2 * dnyBase; - txBase -= y2 * dtxBase; - tyBase -= y2 * dtyBase; - swBase -= y2 * dswBase; - y2 = 0; - } - - y3 = (y3 < height) ? y3 : height; - offset = y2 * width; - - for (y = y2; y < y3; y++) - { - renderLine(); - } - } - } - - private void renderLine() - { - xL=xBase>>16; - xR=xMax>>16; - z=zBase; - nx=nxBase; - ny=nyBase; - tx=txBase; - ty=tyBase; - sw = swBase; - - if (xL<0) - { - z-=xL*dz; - nx-=xL*dnx; - ny-=xL*dny; - tx-=xL*dtx; - ty-=xL*dty; - sw -= xL * dsw; - xL=0; - } - xR=(xR> 16 ) & 255 ) + ( ( ( ny >> 16 ) & 255 ) << 8 ); - bkgrd = screen.pixels[ pos ]; - c = warp_Color.multiply( color, diffuse[ lutID ] ); - s = specular[ lutID ]; - s = warp_Color.scale( s, reflectivity ); - c = warp_Color.transparency( bkgrd, c, transparency ); - c = warp_Color.add( c, s ); - screen.pixels[ pos ] = c; - zBuffer[ pos ] = z; - - if ( useIdBuffer ) idBuffer[ pos ] = currentId; - } - z += dz; - nx += dnx; - ny += dny; - } - - } - - private void renderLineE() - { - for ( x = xL; x < xR; x++ ) - { - pos = x + offset; - if ( z < zBuffer[ pos ] ) - { - lutID = ( ( nx >> 16 ) & 255 ) + ( ( ( ny >> 16 ) & 255 ) << 8 ); - bkgrd = screen.pixels[ pos ]; - s = warp_Color.add( specular[ lutID ], envmap[ lutID ] ); - s = warp_Color.scale( s, reflectivity ); - c = warp_Color.transparency( bkgrd, s, transparency ); - screen.pixels[ pos ] = c; - zBuffer[ pos ] = z; - - if ( useIdBuffer ) idBuffer[ pos ] = currentId; - } - z += dz; - nx += dnx; - ny += dny; - } - } - - private void renderLineT() - { - for ( x = xL; x < xR; x++ ) - { - pos = x + offset; - if ( z < zBuffer[ pos ] ) - { - bkgrd = screen.pixels[ pos ]; - c = texture.pixel[ ( ( ( int )( tx / sw ) ) & tw ) + ( ( ( ( int )( ty / sw ) ) & th ) << tbitW ) ]; - c = warp_Color.transparency( bkgrd, c, transparency ); - screen.pixels[ pos ] = c; - zBuffer[ pos ] = z; - - if ( useIdBuffer ) idBuffer[ pos ] = currentId; - } - z += dz; - tx += dtx; - ty += dty; - sw += dsw; - } - } - - private void renderLinePE() - { - for ( x = xL; x < xR; x++ ) - { - pos = x + offset; - if ( z < zBuffer[ pos ] ) - { - lutID = ( ( nx >> 16 ) & 255 ) + ( ( ( ny >> 16 ) & 255 ) << 8 ); - - bkgrd = screen.pixels[ pos ]; - c = warp_Color.multiply( color, diffuse[ lutID ] ); - s = warp_Color.add( specular[ lutID ], envmap[ lutID ] ); - s = warp_Color.scale( s, reflectivity ); - c = warp_Color.transparency( bkgrd, c, transparency ); - c = warp_Color.add( c, s ); - screen.pixels[ pos ] = c; - zBuffer[ pos ] = z; - - if ( useIdBuffer ) idBuffer[ pos ] = currentId; - } - z += dz; - nx += dnx; - ny += dny; - } - } - - private void renderLinePT() - { - for (x=xL;x>16)&255)+(((ny>>16)&255)<<8); - - bkgrd = screen.pixels[ pos ]; - c = texture.pixel[ ( ( (int)(tx / sw) ) & tw) + ( ( ( (int)(ty / sw) ) & th) << tbitW)]; - c = warp_Color.multiply(c,diffuse[lutID]); - s = warp_Color.scale(specular[lutID],reflectivity); - c = warp_Color.transparency(bkgrd, c, transparency); - c=warp_Color.add(c,s); - screen.pixels[ pos ] = c; - zBuffer[ pos ] = z; - - if (useIdBuffer) idBuffer[pos]=currentId; - } - - z+=dz; - nx+=dnx; - ny+=dny; - tx+=dtx; - ty+=dty; - sw += dsw; - } - } - - private void renderLinePET() - { - for (x=xL;x>16)&255)+(((ny>>16)&255)<<8); - bkgrd = screen.pixels[ pos ]; - c = texture.pixel[ ( ( (int)(tx / sw) ) & tw) + ( ( ( (int)(ty / sw) ) & th) << tbitW)]; - c=warp_Color.multiply(c,diffuse[lutID]); - s=warp_Color.add(specular[lutID],envmap[lutID]); - s=warp_Color.scale(s,reflectivity); - c=warp_Color.transparency(bkgrd,c,transparency); - c=warp_Color.add(c,s); - - screen.pixels[ pos ] = c; - zBuffer[ pos ] = z; - if (useIdBuffer) idBuffer[pos]=currentId; - } - z+=dz; - nx+=dnx; - ny+=dny; - tx+=dtx; - ty+=dty; - sw += dsw; - } - } - - private void drawWireframe(warp_Triangle tri, int defaultcolor) - { - drawLine(tri.p1,tri.p2,defaultcolor); - drawLine(tri.p2,tri.p3,defaultcolor); - drawLine(tri.p3,tri.p1,defaultcolor); - } - - private void drawLine(warp_Vertex a, warp_Vertex b ,int color) - { - warp_Vertex temp; - if ((a.clipcode&b.clipcode)!=0) return; - - dx=(int)Math.Abs(a.x-b.x); - dy=(int)Math.Abs(a.y-b.y); - dz=0; - - if (dx>dy) - { - if (a.x>b.x){temp=a; a=b; b=temp;} - if (dx>0) - { - dz=(b.z-a.z)/dx; - dy=((b.y-a.y)<<16)/dx; - } - z=a.z; - y=a.y<<16; - for(x=a.x;x<=b.x;x++) - { - y2=y>>16; - if (warp_Math.inrange(x,0,width-1)&&warp_Math.inrange(y2,0,height-1)) - { - offset=y2*width; - if (zb.y){ temp=a; a=b; b=temp; } - if (dy>0) - { - dz=(b.z-a.z)/dy; - dx=((b.x-a.x)<<16)/dy; - } - z=a.z; - x=a.x<<16; - for(y=a.y;y<=b.y;y++) - { - x2=x>>16; - if (warp_Math.inrange(x2,0,width-1)&&warp_Math.inrange(y,0,height-1)) - { - offset=y*width; - if (z - /// Summary description for warp_RenderPipeline. - /// - public class warp_RenderPipeline : IDisposable - { - public warp_Screen screen; - warp_Scene scene; - public warp_Lightmap lightmap; - - private bool resizingRequested = false; - private int requestedWidth; - private int requestedHeight; - private double splitOffset; - public bool useId = false; - - warp_Rasterizer rasterizer; - - ArrayList opaqueQueue = new ArrayList(); - ArrayList transparentQueue = new ArrayList(); - - int zFar = 0xffffff; - - public int[] zBuffer; - public int[] idBuffer; - - public warp_RenderPipeline(warp_Scene scene, int w, int h) - { - this.scene=scene; - - screen=new warp_Screen(w,h); - zBuffer = new int[screen.width * screen.height]; - rasterizer=new warp_Rasterizer(this); - } - - public float getFPS() - { - return (float)((int)(screen.FPS*100))/100; - } - - public void buildLightMap() - { - if (lightmap == null) - { - lightmap = new warp_Lightmap(scene); - } - else - { - lightmap.rebuildLightmap(); - } - - rasterizer.loadLightmap(lightmap); - } - - public void useIdBuffer(bool useId) - { - this.useId = useId; - if (useId) - { - idBuffer = new int[screen.width * screen.height]; - } - else - { - idBuffer = null; - } - } - - public void render(warp_Camera cam) - { - rasterizer.rebuildReferences(this); - - warp_Math.clearBuffer( zBuffer, zFar ); - //System.Array.Copy(screen.zBuffer,0,zBuffer,0,zBuffer.Length); - - if (useId) - { - warp_Math.clearBuffer(idBuffer, -1); - } - if (scene.environment.background != null) - { - screen.drawBackground(scene.environment.background, 0, 0, screen.width, screen.height); - } - else - { - screen.clear(scene.environment.bgcolor); - } - - cam.setScreensize(screen.width, screen.height); - scene.prepareForRendering(); - emptyQueues(); - - // Project - warp_Matrix m = warp_Matrix.multiply(cam.getMatrix(), scene.matrix); - warp_Matrix nm = warp_Matrix.multiply(cam.getNormalMatrix(),scene.normalmatrix); - warp_Matrix vertexProjection, normalProjection; - warp_Object obj; - warp_Triangle t; - warp_Vertex v; - int w = screen.width; - int h = screen.height; - for (int id = scene.objects - 1; id >= 0; id--) - { - obj = scene.wobject[id]; - if (obj.visible) - { - vertexProjection = obj.matrix.getClone(); - normalProjection = obj.normalmatrix.getClone(); - vertexProjection.transform(m); - normalProjection.transform(nm); - - for (int i = obj.vertices - 1; i >= 0; i--) - { - v = obj.fastvertex[i]; - v.project(vertexProjection, normalProjection, cam); - v.clipFrustrum(w, h); - } - for (int i = obj.triangles - 1; i >= 0; i--) - { - t = obj.fasttriangle[i]; - t.project(normalProjection); - t.clipFrustrum(w, h); - enqueueTriangle(t); - } - } - } - - //screen.lockImage(); - - warp_Triangle[] tri; - tri = getOpaqueQueue(); - if (tri != null) - { - for (int i = tri.GetLength(0) - 1; i >= 0; i--) - { - rasterizer.loadMaterial(tri[i].parent.material); - rasterizer.render(tri[i]); - } - } - - tri = getTransparentQueue(); - if (tri != null) - { - for (int i = 0; i < tri.GetLength(0); i++) - { - rasterizer.loadMaterial(tri[i].parent.material); - rasterizer.render(tri[i]); - } - } - - //screen.unlockImage(); - } - - private void performResizing() - { - resizingRequested = false; - //screen.resize(requestedWidth, requestedHeight); - - zBuffer = new int[screen.width * screen.height]; - if (useId) - { - idBuffer = new int[screen.width * screen.height]; - } - } - - // Triangle sorting - private void emptyQueues() - { - opaqueQueue.Clear(); - transparentQueue.Clear(); - } - - private void enqueueTriangle(warp_Triangle tri) - { - if (tri.parent.material == null) - { - return; - } - if (tri.visible == false) - { - return; - } - if ( (tri.parent.material.transparency == 255) && - (tri.parent.material.reflectivity == 0)) - { - return; - } - - if (tri.parent.material.transparency > 0) - { - transparentQueue.Add(tri); - } - else - { - opaqueQueue.Add(tri); - } - } - - private warp_Triangle[] getOpaqueQueue() - { - if (opaqueQueue.Count==0) return null; - - IEnumerator enumerator=opaqueQueue.GetEnumerator(); - warp_Triangle[] tri=new warp_Triangle[opaqueQueue.Count]; - - int id=0; - while (enumerator.MoveNext()) - tri[id++]=(warp_Triangle)enumerator.Current; - - return sortTriangles(tri,0,tri.GetLength(0)-1); - } - - private warp_Triangle[] getTransparentQueue() - { - if (transparentQueue.Count==0) return null; - IEnumerator enumerator=transparentQueue.GetEnumerator(); - warp_Triangle[] tri=new warp_Triangle[transparentQueue.Count]; - - int id=0; - while (enumerator.MoveNext()) - tri[id++]=(warp_Triangle)enumerator.Current; - - return sortTriangles(tri,0,tri.GetLength(0)-1); - } - - private warp_Triangle[] sortTriangles(warp_Triangle[] tri, int L, int R) - { - //FIX: Added Index bounds checking. (Was causing random exceptions) - Created by: X - if (L < 0) L = 0; - if (L > tri.GetLength(0)) L = tri.GetLength(0); - if (R < 0) R = 0; - if (R > tri.GetLength(0)) R = tri.GetLength(0); - // - Created by: X - - float m = (tri[L].dist + tri[R].dist) / 2; - int i=L; - int j=R; - warp_Triangle temp; - - do - { - while (tri[i].dist>m) i++; - while (tri[j].dist=i); - - if (Li) sortTriangles(tri,i,R); - - return tri; - } - - public void Dispose() - { - - } - } -} diff --git a/trunk/managed/Warp3D/Warp3D/warp_Scene.cs b/trunk/managed/Warp3D/Warp3D/warp_Scene.cs deleted file mode 100644 index ad1fb96b..00000000 --- a/trunk/managed/Warp3D/Warp3D/warp_Scene.cs +++ /dev/null @@ -1,363 +0,0 @@ -using System; -using System.Collections; -using System.Drawing; -using System.Timers; - -namespace Rednettle.Warp3D -{ - /// - /// Summary description for warp_Scene. - /// - public class warp_Scene : warp_CoreObject - { - public static String version="1.0.0"; - public static String release="0010"; - - public warp_RenderPipeline renderPipeline; - public int width,height; - - public warp_Environment environment=new warp_Environment(); - public warp_Camera defaultCamera=warp_Camera.FRONT(); - - public warp_Object[] wobject; - public warp_Light[] light; - - public int objects=0; - public int lights=0; - - private bool objectsNeedRebuild=true; - private bool lightsNeedRebuild=true; - - protected bool preparedForRendering=false; - - public warp_Vector normalizedOffset=new warp_Vector(0f,0f,0f); - public float normalizedScale=1f; - private static bool instancesRunning=false; - - public Hashtable objectData=new Hashtable(); - public Hashtable lightData=new Hashtable(); - public Hashtable materialData=new Hashtable(); - public Hashtable cameraData=new Hashtable(); - - int probes = 0; - int perf = 0; - - public String fps = "0"; - - public int rendertime = 500; - - public warp_Scene() - { - } - - public warp_Scene(int w, int h) - { - showInfo(); - width=w; - height=h; - renderPipeline = new warp_RenderPipeline(this,w,h); - } - - public void showInfo() - { - if (instancesRunning) return; - - System.Console.WriteLine(); - System.Console.WriteLine("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); - System.Console.WriteLine("WARP 3D Kernel "+version+" [Build "+release+"]"); - System.Console.WriteLine("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); - - instancesRunning=true; - } - - public void removeAllObjects() - { - objectData=new Hashtable(); - objectsNeedRebuild=true; - rebuild(); - } - - public void rebuild() - { - if (objectsNeedRebuild) - { - objectsNeedRebuild=false; - - objects=objectData.Count; - wobject=new warp_Object[objects]; - IDictionaryEnumerator enumerator = objectData.GetEnumerator(); - - for (int i=objects-1;i>=0;i--) - { - enumerator.MoveNext(); - wobject[i]=(warp_Object)enumerator.Value; - - wobject[i].id=i; - wobject[i].rebuild(); - } - } - - if (lightsNeedRebuild) - { - lightsNeedRebuild = false; - lights = lightData.Count; - light = new warp_Light[lights]; - IDictionaryEnumerator enumerator = lightData.GetEnumerator(); - for (int i = lights - 1; i >= 0; i--) - { - enumerator.MoveNext(); - light[i] = (warp_Light) enumerator.Value; - - } - } - } - - public warp_Object sceneobject(String key) - { - return (warp_Object) objectData[key]; - } - - public warp_Material material(String key) - { - return (warp_Material) materialData[key]; - } - - public warp_Camera camera(String key) - { - return (warp_Camera) cameraData[key]; - } - - public void addObject(String key, warp_Object obj) - { - obj.name=key; - objectData.Add(key, obj); - obj.parent=this; - objectsNeedRebuild=true; - } - - public void removeObject(String key) - { - objectData.Remove(key); - objectsNeedRebuild=true; - preparedForRendering=false; - } - - public void addMaterial(String key, warp_Material m) - { - materialData.Add(key, m); - } - - public void removeMaterial(String key) - { - materialData.Remove(key); - } - - public void addCamera(String key, warp_Camera c) - { - cameraData.Add(key, c); - } - - public void removeCamera(String key) - { - cameraData.Remove(key); - } - - public void addLight(String key, warp_Light l) - { - lightData.Add(key, l); - lightsNeedRebuild = true; - } - - public void removeLight(String key) - { - lightData.Remove(key); - lightsNeedRebuild = true; - preparedForRendering = false; - } - - public void prepareForRendering() - { - if (preparedForRendering) return; - preparedForRendering=true; - - System.Console.WriteLine("warp_Scene| prepareForRendering : Preparing for realtime rendering ..."); - rebuild(); - renderPipeline.buildLightMap(); - printSceneInfo(); - } - - public void printSceneInfo() - { - System.Console.WriteLine("warp_Scene| Objects : "+objects); - System.Console.WriteLine("warp_Scene| Vertices : "+countVertices()); - System.Console.WriteLine("warp_Scene| Triangles : "+countTriangles()); - } - - public void render() - { - DateTime n = DateTime.Now; - renderPipeline.render(this.defaultCamera); - - TimeSpan s = DateTime.Now-n; - - perf+=s.Milliseconds; - - if(probes++==32) - { - probes=0; - fps = (float)perf/32+","+(float)1000/ (float)(perf/32); - - perf=0; - } - - } - - public Bitmap getImage() - { - return renderPipeline.screen.getImage(); - } - - public String getFPS() - { - return fps; - } - - /* - public java.awt.Dimension size() - { - return new java.awt.Dimension(width,height); - } - */ - - public void setBackgroundColor(int bgcolor) - { - environment.bgcolor = bgcolor; - } - - public void setBackground(warp_Texture t) - { - environment.setBackground(t); - } - - public void setAmbient(int ambientcolor) - { - environment.ambient=ambientcolor; - } - - public int countVertices() - { - int counter=0; - for (int i=0;i= width) - { - return null; - } - if (ypos < 0 || ypos >= height) - { - return null; - } - - int pos = xpos + renderPipeline.screen.width * ypos; - int idCode = renderPipeline.idBuffer[pos]; - if (idCode < 0) - { - return null; - } - return wobject[idCode >> 16].fasttriangle[idCode & 0xFFFF]; - } - - public warp_Object identifyObjectAt(int xpos, int ypos) - { - warp_Triangle tri = identifyTriangleAt(xpos, ypos); - if (tri == null) - { - return null; - } - return tri.parent; - } - - public void normalize() - { - objectsNeedRebuild = true; - rebuild(); - - warp_Vector min, max, tempmax, tempmin; - if (objects == 0) - { - return; - } - - matrix = new warp_Matrix(); - normalmatrix = new warp_Matrix(); - - max = wobject[0].maximum(); - min = wobject[0].maximum(); - - for (int i = 0; i < objects; i++) - { - tempmax = wobject[i].maximum(); - tempmin = wobject[i].maximum(); - if (tempmax.x > max.x) - { - max.x = tempmax.x; - } - if (tempmax.y > max.y) - { - max.y = tempmax.y; - } - if (tempmax.z > max.z) - { - max.z = tempmax.z; - } - if (tempmin.x < min.x) - { - min.x = tempmin.x; - } - if (tempmin.y < min.y) - { - min.y = tempmin.y; - } - if (tempmin.z < min.z) - { - min.z = tempmin.z; - } - } - float xdist = max.x - min.x; - float ydist = max.y - min.y; - float zdist = max.z - min.z; - float xmed = (max.x + min.x) / 2; - float ymed = (max.y + min.y) / 2; - float zmed = (max.z + min.z) / 2; - - float diameter = (xdist > ydist) ? xdist : ydist; - diameter = (zdist > diameter) ? zdist : diameter; - - normalizedOffset = new warp_Vector(xmed, ymed, zmed); - normalizedScale = 2 / diameter; - - shift(normalizedOffset.reverse()); - scale(normalizedScale); - } - } -} diff --git a/trunk/managed/Warp3D/Warp3D/warp_Screen.cs b/trunk/managed/Warp3D/Warp3D/warp_Screen.cs deleted file mode 100644 index 3decf219..00000000 --- a/trunk/managed/Warp3D/Warp3D/warp_Screen.cs +++ /dev/null @@ -1,168 +0,0 @@ -using System; -using System.Drawing; -using System.Drawing.Imaging; -using System.Runtime.InteropServices; - -namespace Rednettle.Warp3D -{ - /// - /// Summary description for warp_Screen. - /// - unsafe public class warp_Screen : IDisposable - { - public int width; - public int height; - - // benchmark stuff - private DateTime timestamp; - private DateTime time; - private int probes=32; - public float FPS=0; - - Bitmap image = null; - public int[] pixels; - private GCHandle handle; - - public warp_Screen(int w, int h) - { - width=w; - height=h; - - pixels = new int[ w * h ]; - - handle = GCHandle.Alloc( pixels, GCHandleType.Pinned ); - IntPtr pointer = Marshal.UnsafeAddrOfPinnedArrayElement( pixels, 0 ); - - image = new Bitmap( w, h, w * 4, PixelFormat.Format32bppPArgb, pointer ); - } - - public void clear(int c) - { - warp_Math.clearBuffer( pixels, unchecked( ( int )0xff000000 ) | c ); - } - - public void draw(warp_Texture texture, int posx, int posy, int xsize,int ysize) - { - draw(width, height, texture, posx, posy, xsize, ysize); - } - - public void drawBackground(warp_Texture texture, int posx, int posy,int xsize, int ysize) - { - draw(width, height, texture, posx, posy, xsize, ysize); - } - - public Bitmap getImage() - { - return image; - } - - private void draw(int width, int height, warp_Texture texture, int posx, int posy, int xsize, int ysize) - { - if (texture == null) - { - return; - } - - int w = xsize; - int h = ysize; - int xBase = posx; - int yBase = posy; - int tx = texture.width * 255; - int ty = texture.height * 255; - int tw = texture.width; - int dtx = tx / w; - int dty = ty / h; - int txBase = warp_Math.crop( -xBase * dtx, 0, 255 * tx); - int tyBase = warp_Math.crop( -yBase * dty, 0, 255 * ty); - int xend = warp_Math.crop(xBase + w, 0, width); - int yend = warp_Math.crop(yBase + h, 0, height); - int offset1, offset2; - xBase = warp_Math.crop(xBase, 0, width); - yBase = warp_Math.crop(yBase, 0, height); - - ty = tyBase; - for (int j = yBase; j < yend; j++) - { - tx = txBase; - offset1 = j * width; - offset2 = (ty >> 8) * tw; - for (int i = xBase; i < xend; i++) - { - pixels[ i + offset1 ] = unchecked( (int)0xff000000) | texture.pixel[ ( tx >> 8 ) + offset2 ]; - tx += dtx; - } - ty += dty; - } - } - - public void add( warp_Texture texture, int posx, int posy, int xsize, int ysize ) - { - add( width, height, texture, posx, posy, xsize, ysize ); - } - - private void add( int width, int height, warp_Texture texture, int posx, int posy, int xsize, int ysize ) - { - if ( texture == null ) - { - return; - } - - int w = xsize; - int h = ysize; - int xBase = posx; - int yBase = posy; - int tx = texture.width * 255; - int ty = texture.height * 255; - int tw = texture.width; - int dtx = tx / w; - int dty = ty / h; - int txBase = warp_Math.crop( -xBase * dtx, 0, 255 * tx ); - int tyBase = warp_Math.crop( -yBase * dty, 0, 255 * ty ); - int xend = warp_Math.crop( xBase + w, 0, width ); - int yend = warp_Math.crop( yBase + h, 0, height ); - int pos, offset1, offset2; - xBase = warp_Math.crop( xBase, 0, width ); - yBase = warp_Math.crop( yBase, 0, height ); - - ty = tyBase; - for ( int j = yBase; j < yend; j++ ) - { - tx = txBase; - offset1 = j * width; - offset2 = ( ty >> 8 ) * tw; - for ( int i = xBase; i < xend; i++ ) - { - pixels[ i + offset1 ] = unchecked( (int)0xff000000) | warp_Color.add( texture.pixel[ ( tx >> 8 ) + offset2 ], pixels[ i + offset1 ] ); - tx += dtx; - } - ty += dty; - } - } - - public void performBench() - { - probes+=1; - if (probes>32) - { - time=DateTime.Now; - TimeSpan span = time-timestamp; - - FPS=32f/((float)(span.Milliseconds)/1000); - - timestamp=time; - probes=0; - } - } - - public void Dispose() - { - if ( image != null ) - { - handle.Free(); - image.Dispose(); - image = null; - pixels = null; - } - } - } -} diff --git a/trunk/managed/Warp3D/Warp3D/warp_Texture.cs b/trunk/managed/Warp3D/Warp3D/warp_Texture.cs deleted file mode 100644 index baae834c..00000000 --- a/trunk/managed/Warp3D/Warp3D/warp_Texture.cs +++ /dev/null @@ -1,217 +0,0 @@ -using System; -using System.Drawing; -using System.Drawing.Imaging; -using System.Net; - -namespace Rednettle.Warp3D -{ - /// - /// Summary description for warp_Texture. - /// - - public class warp_Texture - { - public int width; - public int height; - public int bitWidth; - public int bitHeight; - public int[] pixel; - public String path=null; - - public static int ALPHA = unchecked((int)0xFF000000); // alpha mask - - public warp_Texture(int w, int h) - { - height=h; - width=w; - pixel=new int[w*h]; - cls(); - } - - public warp_Texture(int w, int h, int[] data) - { - height=h; - width=w; - pixel=new int[width*height]; - - System.Array.Copy(data, pixel, pixel.Length); - } - - public warp_Texture(string path) - { - Bitmap map; - - if( path.StartsWith( "http" ) ) - { - WebRequest webrq = WebRequest.Create( path ); - map = ( Bitmap )Bitmap.FromStream(webrq.GetResponse().GetResponseStream()); - } - else - { - map = new Bitmap( path, false); - } - - loadTexture( map ); - } - - public void resize() - { - double log2inv=1/Math.Log(2); - - int w = ( int )Math.Pow( 2, bitWidth = ( int )Math.Ceiling( ( Math.Log( width ) * log2inv ) ) ); - int h = ( int )Math.Pow( 2, bitHeight = ( int )Math.Ceiling( ( Math.Log( height ) * log2inv ) ) ); - - if(!(w==width && h==height)) - resize(w,h); - } - - public void resize(int w, int h) - { - System.Console.WriteLine("warp_Texture| resize :"+w+","+h); - setSize(w,h); - } - - public void cls() - { - warp_Math.clearBuffer(pixel, 0); - } - - public warp_Texture toAverage() - { - for (int i=width*height-1;i>=0;i--) - pixel[i]=warp_Color.getAverage(pixel[i]); - - return this; - } - - public warp_Texture toGray() - { - for (int i=width*height-1;i>=0;i--) - pixel[i]=warp_Color.getGray(pixel[i]); - - return this; - } - - public warp_Texture valToGray() - { - int intensity; - for (int i=width*height-1;i>=0;i--) - { - intensity=warp_Math.crop(pixel[i],0,255); - pixel[i]=warp_Color.getColor(intensity,intensity,intensity); - } - - return this; - } - - public warp_Texture colorize(int[] pal) - { - int range=pal.GetLength(0)-1; - for (int i=width*height-1;i>=0;i--) - pixel[i]=pal[warp_Math.crop(pixel[i],0,range)]; - - return this; - } - - private void loadTexture(Bitmap map) - { - width = map.Width; - height = map.Height; - - pixel=new int[width*height]; - - BitmapData bmData = map.LockBits(new Rectangle(0, 0, map.Width, map.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); - int scanline = bmData.Stride; - - System.IntPtr Scan0 = bmData.Scan0; -/* - // Declare an array to hold the bytes of the bitmap. - // This code is specific to a bitmap with 24 bits per pixels. - byte[] bytes = new byte[(map.Width * map.Height) * 3]; - - // Copy the RGB values into the array. - System.Runtime.InteropServices.Marshal.Copy ( Scan0, bytes, 0, bytes.Length ); - - int nOffset = bmData.Stride - map.Width * 3; - int nPixel = 0; - int p =0; - for (int i = 0; i < map.Height; i++) - { - for (int j = 0; j < map.Width; j++) - { - int blue = bytes[p]; - int green = bytes[p+1]; - int red = bytes[p+2]; - - pixel[nPixel++] = ALPHA | red << 16 | green << 8 | blue; - p += 3; - } - - p += nOffset; - } -*/ - // Copy the RGB values back to the bitmap - // System.Runtime.InteropServices.Marshal.Copy(bytes, 0, ptr, bytes.Length); - - unsafe - { - byte *p = (byte *)(void *)Scan0; - - - int nOffset = bmData.Stride - map.Width*3; - int nPixel = 0; - - for(int i=0;i=0;j--) - { - offset-=w; - offset2=(j*height/h)*width; - for (int i=w-1;i>=0;i--) - newpixels[i+offset]=pixel[(i*width/w)+offset2]; - } - - width=w; - height=h; - pixel=newpixels; - } - } - - private bool inrange(int a, int b, int c) - { - return (a>=b)&(a - /// Summary description for warp_TextureFactory. - /// - public class warp_TextureFactory - { - public static float pi = 3.1415926535f; - public static float deg2rad = pi / 180; - private static float[,] noiseBuffer; - private static bool noiseBufferInitialized = false; - static int minx, maxx, miny, maxy; - public static int ALPHA = unchecked((int)0xFF000000); // alpha mask - - private warp_TextureFactory() - { - } - - public static warp_Texture SKY(int w, int h, float density) - { - int[] colors = new int[2]; - colors[0] = 0x003399; - colors[1] = 0xFFFFFF; - return PERLIN(w, h, 0.5f, 2.8f * density, 8, 1024).colorize(warp_Color.makeGradient(colors, 1024)); - } - - public static warp_Texture MARBLE(int w, int h, float density) - { - int[] colors = new int[3]; - colors[0] = 0x111111; - colors[1] = 0x696070; - colors[2] = 0xFFFFFF; - return WAVE(w, h, 0.5f, 0.64f * density, 6, 1024).colorize(warp_Color.makeGradient(colors, 1024)); - } - - public static warp_Texture WOOD(int w, int h, float density) - { - int[] colors = new int[3]; - colors[0] = 0x332211; - colors[1] = 0x523121; - colors[2] = 0x996633; - - return GRAIN(w, h, 0.5f, 3f * density, 3, 8, 1024).colorize(warp_Color.makeGradient(colors, 1024)); - } - - public static warp_Texture PERLIN(int w, int h, float persistency, - float density, int samples, int scale) - { - initNoiseBuffer(); - warp_Texture t = new warp_Texture(w, h); - int pos = 0; - float wavelength = (float) ( (w > h) ? w : h) / density; - - for (int y = 0; y < h; y++) - { - for (int x = 0; x < w; x++) - { - t.pixel[pos++] = (int) ( (float) scale * - perlin2d(x, y, wavelength, persistency, - samples)); - } - } - return t; - } - - public static warp_Texture WAVE(int w, int h, float persistency, - float density, int samples, int scale) - { - initNoiseBuffer(); - warp_Texture t = new warp_Texture(w, h); - int pos = 0; - float wavelength = (float) ( (w > h) ? w : h) / density; - - for (int y = 0; y < h; y++) - { - for (int x = 0; x < w; x++) - { - t.pixel[pos++] = (int) ( (double) scale * - (Math.Sin(32 * - perlin2d(x, y, wavelength, - persistency, samples)) * 0.5 + 0.5)); - } - } - return t; - } - - public static warp_Texture GRAIN(int w, int h, float persistency, - float density, int samples, int levels, - int scale) - // TIP: For wooden textures - { - initNoiseBuffer(); - warp_Texture t = new warp_Texture(w, h); - int pos = 0; - float wavelength = (float) ( (w > h) ? w : h) / density; - float perlin; - - for (int y = 0; y < h; y++) - { - for (int x = 0; x < w; x++) - { - perlin = (float) levels * - perlin2d(x, y, wavelength, persistency, samples); - t.pixel[pos++] = (int) ( (float) scale * - (perlin - (float) (int) perlin)); - } - } - return t; - } - - // Perlin noise functions - - private static float perlin2d(float x, float y, float wavelength, - float persistence, int samples) - { - float sum = 0; - float freq = 1f / wavelength; - float amp = persistence; - float range = 0; - - for (int i = 0; i < samples; i++) - { - sum += amp * interpolatedNoise(x * freq, y * freq, i); - range += amp; - amp *= persistence; - freq *= 2; - } - return warp_Math.crop(sum / persistence * 0.5f + 0.5f, 0, 1); - } - - // Helper methods - - private static float interpolatedNoise(float x, float y, int octave) - { - int intx = (int) x; - int inty = (int) y; - float fracx = x - (float) intx; - float fracy = y - (float) inty; - - float i1 = warp_Math.interpolate(noise(intx, inty, octave), - noise(intx + 1, inty, octave), fracx); - float i2 = warp_Math.interpolate(noise(intx, inty + 1, octave), - noise(intx + 1, inty + 1, octave), - fracx); - - return warp_Math.interpolate(i1, i2, fracy); - } - - private static float smoothNoise(int x, int y, int o) - { - return (noise(x - 1, y - 1, o) + noise(x + 1, y - 1, o) + - noise(x - 1, y + 1, o) + noise(x + 1, y + 1, o)) / 16 - + - (noise(x - 1, y, o) + noise(x + 1, y, o) + noise(x, y - 1, o) + - noise(x, y + 1, o)) / 8 - + noise(x, y, o) / 4; - } - - private static float noise(int x, int y, int octave) - { - return noiseBuffer[octave & 3, (x + y * 57) & 8191]; - } - - private static float noise(int seed, int octave) - { - int id = octave & 3; - int n = (seed << 13) ^ seed; - - if (id == 0) - { - return (float) (1f - - ( (n * (n * n * 15731 + 789221) + 1376312589) & - 0x7FFFFFFF) * - 0.000000000931322574615478515625f); - } - if (id == 1) - { - return (float) (1f - - ( (n * (n * n * 12497 + 604727) + 1345679039) & - 0x7FFFFFFF) * - 0.000000000931322574615478515625f); - } - if (id == 2) - { - return (float) (1f - - ( (n * (n * n * 19087 + 659047) + 1345679627) & - 0x7FFFFFFF) * - 0.000000000931322574615478515625f); - } - return (float) (1f - - ( (n * (n * n * 16267 + 694541) + 1345679501) & - 0x7FFFFFFF) * - 0.000000000931322574615478515625f); - } - - private static void initNoiseBuffer() - { - if (noiseBufferInitialized) - { - return; - } - - noiseBuffer = new float[4,8192]; - for (int octave = 0; octave < 4; octave++) - { - for (int i = 0; i < 8192; i++) - { - noiseBuffer[octave,i] = noise(i, octave); - } - } - noiseBufferInitialized = true; - } - - public static warp_Texture CHECKERBOARD(int w, int h, int cellbits, int oddColor, int evenColor) - { - warp_Texture t = new warp_Texture(w, h); - - int pos = 0; - for (int y = 0; y < h; y++) - { - for (int x = 0; x < w; x++) - { - int c = ( ( (x >> cellbits) + (y >> cellbits)) & 1) == 0 ? evenColor : oddColor; - t.pixel[pos++] = c; - } - } - - return t; - } - } -} diff --git a/trunk/managed/Warp3D/Warp3D/warp_TextureProjector.cs b/trunk/managed/Warp3D/Warp3D/warp_TextureProjector.cs deleted file mode 100644 index 6e9eb3bb..00000000 --- a/trunk/managed/Warp3D/Warp3D/warp_TextureProjector.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; - -namespace Rednettle.Warp3D -{ - /// - /// Summary description for warp_TextureProjector. - /// - public class warp_TextureProjector - { - public static void projectFrontal(warp_Object obj) - { - obj.rebuild(); - warp_Vector min = obj.minimum(); - warp_Vector max = obj.maximum(); - float du = 1 / (max.x - min.x); - float dv = 1 / (max.y - min.y); - - for (int i = 0; i < obj.vertices; i++) - { - obj.fastvertex[i].u = (obj.fastvertex[i].pos.x - min.x) * du; - obj.fastvertex[i].v = 1 - (obj.fastvertex[i].pos.y - min.y) * dv; - } - } - - public static void projectTop(warp_Object obj) - { - obj.rebuild(); - warp_Vector min = obj.minimum(); - warp_Vector max = obj.maximum(); - float du = 1 / (max.x - min.x); - float dv = 1 / (max.z - min.z); - for (int i = 0; i < obj.vertices; i++) - { - obj.fastvertex[i].u = (obj.fastvertex[i].pos.x - min.x) * du; - obj.fastvertex[i].v = (obj.fastvertex[i].pos.z - min.z) * dv; - } - } - - public static void projectCylindric(warp_Object obj) - { - obj.rebuild(); - warp_Vector min = obj.minimum(); - warp_Vector max = obj.maximum(); - float dz = 1 / (max.z - min.z); - for (int i = 0; i < obj.vertices; i++) - { - obj.fastvertex[i].pos.buildCylindric(); - obj.fastvertex[i].u = obj.fastvertex[i].pos.theta / (2 * 3.14159265f); - obj.fastvertex[i].v = (obj.fastvertex[i].pos.z - min.z) * dz; - } - } - } -} diff --git a/trunk/managed/Warp3D/Warp3D/warp_TextureSettings.cs b/trunk/managed/Warp3D/Warp3D/warp_TextureSettings.cs deleted file mode 100644 index 13a88898..00000000 --- a/trunk/managed/Warp3D/Warp3D/warp_TextureSettings.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; - -namespace Rednettle.Warp3D -{ - /// - /// Summary description for warp_TextureSettings. - /// - /// - public class warp_TextureSettings - { - public warp_Texture texture; - public int width; - public int height; - public int type; - public float persistency; - public float density; - public int samples; - public int numColors; - public int[] colors; - - public warp_TextureSettings(warp_Texture tex, int w, int h, int t, float p, float d, int s, int[] c) - { - texture=tex; - width=w; - height=h; - type=t; - persistency=p; - density=d; - samples=s; - colors=c; - } - } -} diff --git a/trunk/managed/Warp3D/Warp3D/warp_Triangle.cs b/trunk/managed/Warp3D/Warp3D/warp_Triangle.cs deleted file mode 100644 index d52600ce..00000000 --- a/trunk/managed/Warp3D/Warp3D/warp_Triangle.cs +++ /dev/null @@ -1,98 +0,0 @@ -using System; - -namespace Rednettle.Warp3D -{ - /// - /// Summary description for warp_Triangle. - /// - public class warp_Triangle - { - public warp_Object parent; // the object which obtains this triangle - public bool visible=true; //visibility tag for clipping - public bool outOfFrustrum=false; //visibility tag for frustrum clipping - - public warp_Vertex p1; // first vertex - public warp_Vertex p2; // second vertex - public warp_Vertex p3; // third vertex - - public warp_Vector n; // Normal vector of flat triangle - public warp_Vector n2; // Projected Normal vector - - private int minx,maxx,miny,maxy; // for clipping - private warp_Vector triangleCenter=new warp_Vector(); - public float dist=0; - - public int id=0; - - public warp_Triangle(warp_Vertex a, warp_Vertex b, warp_Vertex c) - { - p1=a; - p2=b; - p3=c; - } - - public void clipFrustrum(int w, int h) - { - if (parent.material==null) {visible=false; return; } - outOfFrustrum=(p1.clipcode&p2.clipcode&p3.clipcode)!=0; - if (outOfFrustrum) {visible=false; return; } - if (n2.z>0.5) {visible=true; return; } - - triangleCenter.x=(p1.pos2.x+p2.pos2.x+p3.pos2.x); - triangleCenter.y=(p1.pos2.y+p2.pos2.y+p3.pos2.y); - triangleCenter.z=(p1.pos2.z+p2.pos2.z+p3.pos2.z); - - visible=warp_Vector.angle(triangleCenter,n2)>0; - - } - - public void project(warp_Matrix normalProjection) - { - n2=n.transform(normalProjection); - dist=getDist(); - } - - public void regenerateNormal() - { - n=warp_Vector.getNormal(p1.pos,p2.pos,p3.pos); - } - - public warp_Vector getWeightedNormal() - { - return warp_Vector.vectorProduct(p1.pos,p2.pos,p3.pos); - } - - public warp_Vertex getMedium() - { - float cx=(p1.pos.x+p2.pos.x+p3.pos.x)/3; - float cy=(p1.pos.y+p2.pos.y+p3.pos.y)/3; - float cz=(p1.pos.z+p2.pos.z+p3.pos.z)/3; - float cu=(p1.u+p2.u+p3.u)/3; - float cv=(p1.v+p2.v+p3.v)/3; - return new warp_Vertex(cx,cy,cz,cu,cv); - } - - public warp_Vector getCenter() - { - float cx=(p1.pos.x+p2.pos.x+p3.pos.x)/3; - float cy=(p1.pos.y+p2.pos.y+p3.pos.y)/3; - float cz=(p1.pos.z+p2.pos.z+p3.pos.z)/3; - return new warp_Vector(cx,cy,cz); - } - - public float getDist() - { - return p1.z+p2.z+p3.z; - } - - public bool degenerated() - { - return p1.equals(p2)||p2.equals(p3)||p3.equals(p1); - } - - public warp_Triangle getClone() - { - return new warp_Triangle(p1,p2,p3); - } - } -} diff --git a/trunk/managed/Warp3D/Warp3D/warp_Vector.cs b/trunk/managed/Warp3D/Warp3D/warp_Vector.cs deleted file mode 100644 index 8a3b51c0..00000000 --- a/trunk/managed/Warp3D/Warp3D/warp_Vector.cs +++ /dev/null @@ -1,148 +0,0 @@ -using System; - -namespace Rednettle.Warp3D -{ - public class warp_Vector - { - public float x=0; //Cartesian (default) - public float y=0; //Cartesian (default) - public float z=0; //Cartesian (default),Cylindric - public float r=0; //Cylindric - public float theta=0; //Cylindric - - public warp_Vector() - { - } - - public warp_Vector (float xpos, float ypos, float zpos) - { - x=xpos; - y=ypos; - z=zpos; - } - public warp_Vector normalize() - // Normalizes the vector - { - float dist=length(); - if (dist==0) return this; - float invdist=1/dist; - x*=invdist; - y*=invdist; - z*=invdist; - return this; - } - - public warp_Vector reverse() - // Reverses the vector - { - x=-x; - y=-y; - z=-z; - return this; - } - - public float length() - // Lenght of this vector - { - return (float)Math.Sqrt(x*x+y*y+z*z); - } - - public warp_Vector transform(warp_Matrix m) - // Modifies the vector by matrix m - { - float newx = x*m.m00 + y*m.m01 + z*m.m02+ m.m03; - float newy = x*m.m10 + y*m.m11 + z*m.m12+ m.m13; - float newz = x*m.m20 + y*m.m21 + z*m.m22+ m.m23; - - return new warp_Vector(newx,newy,newz); - } - - public void buildCylindric() - // Builds the cylindric coordinates out of the given cartesian coordinates - { - r=(float)Math.Sqrt(x*x+y*y); - theta=(float)Math.Atan2(x,y); - } - - public void buildCartesian() - // Builds the cartesian coordinates out of the given cylindric coordinates - { - x=r*warp_Math.cos(theta); - y=r*warp_Math.sin(theta); - } - - public static warp_Vector getNormal(warp_Vector a, warp_Vector b) - // returns the normal vector of the plane defined by the two vectors - { - return vectorProduct(a,b).normalize(); - } - - public static warp_Vector getNormal(warp_Vector a, warp_Vector b, warp_Vector c) - // returns the normal vector of the plane defined by the two vectors - { - return vectorProduct(a,b,c).normalize(); - } - - public static warp_Vector vectorProduct(warp_Vector a, warp_Vector b) - // returns a x b - { - return new warp_Vector(a.y*b.z-b.y*a.z,a.z*b.x-b.z*a.x,a.x*b.y-b.x*a.y); - } - - public static warp_Vector vectorProduct(warp_Vector a, warp_Vector b, warp_Vector c) - // returns (b-a) x (c-a) - { - return vectorProduct(sub(b,a),sub(c,a)); - } - - public static float angle(warp_Vector a, warp_Vector b) - // returns the angle between 2 vectors - { - a.normalize(); - b.normalize(); - return (a.x*b.x+a.y*b.y+a.z*b.z); - } - - public static warp_Vector add(warp_Vector a, warp_Vector b) - // adds 2 vectors - { - return new warp_Vector(a.x+b.x,a.y+b.y,a.z+b.z); - } - - public static warp_Vector sub(warp_Vector a, warp_Vector b) - // substracts 2 vectors - { - return new warp_Vector(a.x-b.x,a.y-b.y,a.z-b.z); - } - - public static warp_Vector scale(float f, warp_Vector a) - // substracts 2 vectors - { - return new warp_Vector(f*a.x,f*a.y,f*a.z); - } - - public static float len(warp_Vector a) - // length of vector - { - return (float)Math.Sqrt(a.x*a.x+a.y*a.y+a.z*a.z); - } - - /* - public static warp_Vector random(float fact) - // returns a random vector - { - return new warp_Vector(fact*warp_Math.random(),fact*warp_Math.random(),fact*warp_Math.random()); - } - - public String toString() - { - return new String ("\r\n"); - } -*/ - - public warp_Vector getClone() - { - return new warp_Vector(x,y,z); - } - } -} diff --git a/trunk/managed/Warp3D/Warp3D/warp_Vertex.cs b/trunk/managed/Warp3D/Warp3D/warp_Vertex.cs deleted file mode 100644 index 152a1f53..00000000 --- a/trunk/managed/Warp3D/Warp3D/warp_Vertex.cs +++ /dev/null @@ -1,194 +0,0 @@ -using System; -using System.Collections; - -namespace Rednettle.Warp3D -{ - /// - /// Summary description for warp_Vertex. - /// - public class warp_Vertex - { - public warp_Object parent; - - public warp_Vector pos=new warp_Vector(); //(x,y,z) Coordinate of vertex - public warp_Vector pos2; //Transformed vertex coordinate - public warp_Vector n=new warp_Vector(); //Normal Vector at vertex - public warp_Vector n2; //Transformed normal vector (camera space) - - public int x; //Projected x coordinate - public int y; //Projected y coordinate - public int z; //Projected z coordinate for z-Buffer - - public float u=0; // Texture x-coordinate (relative) - public float v=0; // Texture y-coordinate (relative) - - public int nx=0; // Normal x-coordinate for envmapping - public int ny=0; // Normal y-coordinate for envmapping - public int tx=0; // Texture x-coordinate (absolute) - public int ty=0; // Texture y-coordinate (absolute) - - public float sw = 1.0f; - - - public bool visible=true; //visibility tag for clipping - public int clipcode=0; - public int id; // Vertex index - - private float fact; - //private Vector neighbor=new Vector(); //Neighbor triangles of vertex - private ArrayList neighbor=new ArrayList(); - - - public warp_Vertex() - { - pos=new warp_Vector(0f,0f,0f); - } - - public warp_Vertex(float xpos, float ypos, float zpos) - { - pos=new warp_Vector(xpos,ypos,zpos); - } - - public warp_Vertex(float xpos, float ypos, float zpos, float u, float v) - { - pos=new warp_Vector(xpos,ypos,zpos); - this.u=u; - this.v=v; - } - - public warp_Vertex(warp_Vector ppos) - { - pos=ppos.getClone(); - } - - public warp_Vertex(warp_Vector ppos, float u, float v) - { - pos=ppos.getClone(); - this.u=u; - this.v=v; - } - - public void project(warp_Matrix vertexProjection,warp_Matrix normalProjection, warp_Camera camera) - // Projects this vertex into camera space - { - pos2=pos.transform(vertexProjection); - n2=n.transform(normalProjection); - - fact=camera.screenscale/camera.fovfact/((pos2.z>0.1)?pos2.z:0.1f); - x=(int)(pos2.x*fact+(camera.screenwidth>>1)); - y=(int)(-pos2.y*fact+(camera.screenheight>>1)); - z=(int)(65536f*pos2.z); - sw = - (pos2.z); - nx=(int)(n2.x*127+127); - ny=(int)(n2.y*127+127); - if (parent.material==null) return; - if (parent.material.texture==null) return; - tx=(int)((float)parent.material.texture.width*u); - ty=(int)((float)parent.material.texture.height*v); - } - - public void setUV(float u, float v) - { - this.u=u; - this.v=v; - } - - public void clipFrustrum(int w, int h) - { - // View plane clipping - clipcode=0; - if (x<0) clipcode|=1; - if (x>=w) clipcode|=2; - if (y<0) clipcode|=4; - if (y>=h) clipcode|=8; - if (pos2.z<0) clipcode|=16; - visible=(clipcode==0); - } - - public void registerNeighbor(warp_Triangle triangle) - { - if (!neighbor.Contains(triangle)) neighbor.Add(triangle); - } - - public void resetNeighbors() - { - neighbor.Clear(); - } - - public void regenerateNormal() - { - float nx=0; - float ny=0; - float nz=0; - IEnumerator enumerator=neighbor.GetEnumerator(); - - warp_Triangle tri; - warp_Vector wn; - while (enumerator.MoveNext()) - { - tri=(warp_Triangle)enumerator.Current; - wn=tri.getWeightedNormal(); - nx+=wn.x; - ny+=wn.y; - nz+=wn.z; - } - - n=new warp_Vector(nx,ny,nz).normalize(); - } - -/* - public void regenerateNormal() - { - float nx=0; - float ny=0; - float nz=0; - Enumeration enum=neighbor.elements(); - warp_Triangle tri; - warp_Vector wn; - while (enum.hasMoreElements()) - { - tri=(warp_Triangle)enum.nextElement(); - wn=tri.getWeightedNormal(); - nx+=wn.x; - ny+=wn.y; - nz+=wn.z; - } - - n=new warp_Vector(nx,ny,nz).normalize(); - } -*/ - public void scaleTextureCoordinates(float fx, float fy) - { - u*=fx; - v*=fy; - } - - public void moveTextureCoordinates(float fx, float fy) - { - u+=fx; - v+=fy; - } - - public warp_Vertex getClone() - { - warp_Vertex newVertex=new warp_Vertex(); - newVertex.pos=pos.getClone(); - newVertex.n=n.getClone(); - newVertex.u=u; - newVertex.v=v; - - return newVertex; - } - - public bool equals(warp_Vertex v) - { - return ((pos.x==v.pos.x)&&(pos.y==v.pos.y)&&(pos.z==v.pos.z)); - } - - public bool equals(warp_Vertex v,float tolerance) - { - return Math.Abs(warp_Vector.sub(pos,v.pos).length()) - '/ Summary description for warp_Color. - '/ - Partial Public Class warp_Color - - Public Shared Function Modulate(ByVal color1 As Integer, ByVal color2 As Integer) As Integer - Dim R1 As Integer = (color1 And RED) >> 16 - Dim G1 As Integer = (color1 And GREEN) >> 8 - Dim B1 As Integer = color1 And BLUE - Dim R2 As Integer = (color2 And RED) >> 16 - Dim G2 As Integer = (color2 And GREEN) >> 8 - Dim B2 As Integer = color2 And BLUE - Dim R, G, B As Integer - R = (R1 * R2) '* 2 - G = (G1 * G2) '* 2 - B = (B1 * B2) '* 2 - Return ALPHA Or (R << 16) Or (G << 8) Or B - - End Function - - End Class -End Namespace diff --git a/trunk/managed/Warp3D/Warp3DVB/Custom/warp_Screen.vb b/trunk/managed/Warp3D/Warp3DVB/Custom/warp_Screen.vb deleted file mode 100644 index 3549043d..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/Custom/warp_Screen.vb +++ /dev/null @@ -1,254 +0,0 @@ -' Created by: X -' http://www.createdbyx.com/ -' ---------------------- -' C# to VB.NET conversion of this code was done by hand and with the assistance of the -' Convert C# to VB .NET application availible at http://www.kamalpatel.net/ConvertCSharp2VB.aspx -' ConvertCSharp2VB utility was developed by: Kamal Patel (http://www.KamalPatel.net) -' ---------------------- -' Thanks to Alan Simes ( http://alansimes.blogdns.net/ ) for creating the Warp3D library. -' http://alansimes.blogdns.net/cs/files/default.aspx -' ---------------------- - -Imports System -Imports System.Drawing -Imports System.Drawing.Imaging -Imports System.Runtime.InteropServices - -Namespace Rednettle.Warp3D - Partial Public Class warp_Screen - - Public Sub Subtract(ByVal texture As warp_Texture, ByVal posx As Integer, ByVal posy As Integer, ByVal xsize As Integer, ByVal ysize As Integer) - Subtract(width, height, texture, posx, posy, xsize, ysize) - End Sub - - Private Sub Subtract(ByVal width As Integer, ByVal height As Integer, ByVal texture As warp_Texture, ByVal posx As Integer, ByVal posy As Integer, ByVal xsize As Integer, ByVal ysize As Integer) - If texture Is Nothing Then Return - - Dim w As Integer = xsize - Dim h As Integer = ysize - Dim xBase As Integer = posx - Dim yBase As Integer = posy - Dim tx As Integer = texture.width * 255 - Dim ty As Integer = texture.height * 255 - Dim tw As Integer = texture.width - Dim dtx As Integer = CInt(tx / w) - Dim dty As Integer = CInt(ty / h) - Dim txBase As Integer = warp_Math.crop(-xBase * dtx, 0, 255 * tx) - Dim tyBase As Integer = warp_Math.crop(-yBase * dty, 0, 255 * ty) - Dim xend As Integer = warp_Math.crop(xBase + w, 0, width) - Dim yend As Integer = warp_Math.crop(yBase + h, 0, height) - Dim pos As Integer, offset1 As Integer, offset2 As Integer - xBase = warp_Math.crop(xBase, 0, width) - yBase = warp_Math.crop(yBase, 0, height) - - ty = tyBase - Dim j As Integer - For j = yBase To yend - 1 'Step j + 1 - tx = txBase - offset1 = j * width - offset2 = (ty >> 8) * tw - Dim i As Integer - For i = xBase To xend - 1 'Step i + 1 - pixels(i + offset1) = &HFF000000 Or warp_Color.sub(texture.pixel((tx >> 8) + offset2), pixels(i + offset1)) - tx += dtx - Next - ty += dty - Next - End Sub - - Public Sub Mix(ByVal texture As warp_Texture, ByVal posx As Integer, ByVal posy As Integer, ByVal xsize As Integer, ByVal ysize As Integer) - Mix(width, height, texture, posx, posy, xsize, ysize) - End Sub - - Private Sub Mix(ByVal width As Integer, ByVal height As Integer, ByVal texture As warp_Texture, ByVal posx As Integer, ByVal posy As Integer, ByVal xsize As Integer, ByVal ysize As Integer) - If texture Is Nothing Then Return - - Dim w As Integer = xsize - Dim h As Integer = ysize - Dim xBase As Integer = posx - Dim yBase As Integer = posy - Dim tx As Integer = texture.width * 255 - Dim ty As Integer = texture.height * 255 - Dim tw As Integer = texture.width - Dim dtx As Integer = CInt(tx / w) - Dim dty As Integer = CInt(ty / h) - Dim txBase As Integer = warp_Math.crop(-xBase * dtx, 0, 255 * tx) - Dim tyBase As Integer = warp_Math.crop(-yBase * dty, 0, 255 * ty) - Dim xend As Integer = warp_Math.crop(xBase + w, 0, width) - Dim yend As Integer = warp_Math.crop(yBase + h, 0, height) - Dim pos As Integer, offset1 As Integer, offset2 As Integer - xBase = warp_Math.crop(xBase, 0, width) - yBase = warp_Math.crop(yBase, 0, height) - - ty = tyBase - Dim j As Integer - For j = yBase To yend - 1 'Step j + 1 - tx = txBase - offset1 = j * width - offset2 = (ty >> 8) * tw - Dim i As Integer - For i = xBase To xend - 1 'Step i + 1 - pixels(i + offset1) = &HFF000000 Or warp_Color.mix(texture.pixel((tx >> 8) + offset2), pixels(i + offset1)) - tx += dtx - Next - ty += dty - Next - End Sub - - Public Sub Multiply(ByVal texture As warp_Texture, ByVal posx As Integer, ByVal posy As Integer, ByVal xsize As Integer, ByVal ysize As Integer) - multiply(width, height, texture, posx, posy, xsize, ysize) - End Sub - - Private Sub Multiply(ByVal width As Integer, ByVal height As Integer, ByVal texture As warp_Texture, ByVal posx As Integer, ByVal posy As Integer, ByVal xsize As Integer, ByVal ysize As Integer) - If texture Is Nothing Then Return - - Dim w As Integer = xsize - Dim h As Integer = ysize - Dim xBase As Integer = posx - Dim yBase As Integer = posy - Dim tx As Integer = texture.width * 255 - Dim ty As Integer = texture.height * 255 - Dim tw As Integer = texture.width - Dim dtx As Integer = CInt(tx / w) - Dim dty As Integer = CInt(ty / h) - Dim txBase As Integer = warp_Math.crop(-xBase * dtx, 0, 255 * tx) - Dim tyBase As Integer = warp_Math.crop(-yBase * dty, 0, 255 * ty) - Dim xend As Integer = warp_Math.crop(xBase + w, 0, width) - Dim yend As Integer = warp_Math.crop(yBase + h, 0, height) - Dim pos As Integer, offset1 As Integer, offset2 As Integer - xBase = warp_Math.crop(xBase, 0, width) - yBase = warp_Math.crop(yBase, 0, height) - - ty = tyBase - Dim j As Integer - For j = yBase To yend - 1 'Step j + 1 - tx = txBase - offset1 = j * width - offset2 = (ty >> 8) * tw - Dim i As Integer - For i = xBase To xend - 1 'Step i + 1 - pixels(i + offset1) = &HFF000000 Or warp_Color.multiply(texture.pixel((tx >> 8) + offset2), pixels(i + offset1)) - tx += dtx - Next - ty += dty - Next - End Sub - - Public Sub SubNegative(ByVal texture As warp_Texture, ByVal posx As Integer, ByVal posy As Integer, ByVal xsize As Integer, ByVal ysize As Integer) - SubNegative(width, height, texture, posx, posy, xsize, ysize) - End Sub - - Private Sub SubNegative(ByVal width As Integer, ByVal height As Integer, ByVal texture As warp_Texture, ByVal posx As Integer, ByVal posy As Integer, ByVal xsize As Integer, ByVal ysize As Integer) - If texture Is Nothing Then Return - - Dim w As Integer = xsize - Dim h As Integer = ysize - Dim xBase As Integer = posx - Dim yBase As Integer = posy - Dim tx As Integer = texture.width * 255 - Dim ty As Integer = texture.height * 255 - Dim tw As Integer = texture.width - Dim dtx As Integer = CInt(tx / w) - Dim dty As Integer = CInt(ty / h) - Dim txBase As Integer = warp_Math.crop(-xBase * dtx, 0, 255 * tx) - Dim tyBase As Integer = warp_Math.crop(-yBase * dty, 0, 255 * ty) - Dim xend As Integer = warp_Math.crop(xBase + w, 0, width) - Dim yend As Integer = warp_Math.crop(yBase + h, 0, height) - Dim pos As Integer, offset1 As Integer, offset2 As Integer - xBase = warp_Math.crop(xBase, 0, width) - yBase = warp_Math.crop(yBase, 0, height) - - ty = tyBase - Dim j As Integer - For j = yBase To yend - 1 'Step j + 1 - tx = txBase - offset1 = j * width - offset2 = (ty >> 8) * tw - Dim i As Integer - For i = xBase To xend - 1 'Step i + 1 - pixels(i + offset1) = &HFF000000 Or warp_Color.subneg(texture.pixel((tx >> 8) + offset2), pixels(i + offset1)) - tx += dtx - Next - ty += dty - Next - End Sub - - Public Sub Invert(ByVal texture As warp_Texture, ByVal posx As Integer, ByVal posy As Integer, ByVal xsize As Integer, ByVal ysize As Integer) - Invert(width, height, texture, posx, posy, xsize, ysize) - End Sub - - Private Sub Invert(ByVal width As Integer, ByVal height As Integer, ByVal texture As warp_Texture, ByVal posx As Integer, ByVal posy As Integer, ByVal xsize As Integer, ByVal ysize As Integer) - If texture Is Nothing Then Return - - Dim w As Integer = xsize - Dim h As Integer = ysize - Dim xBase As Integer = posx - Dim yBase As Integer = posy - Dim tx As Integer = texture.width * 255 - Dim ty As Integer = texture.height * 255 - Dim tw As Integer = texture.width - Dim dtx As Integer = CInt(tx / w) - Dim dty As Integer = CInt(ty / h) - Dim txBase As Integer = warp_Math.crop(-xBase * dtx, 0, 255 * tx) - Dim tyBase As Integer = warp_Math.crop(-yBase * dty, 0, 255 * ty) - Dim xend As Integer = warp_Math.crop(xBase + w, 0, width) - Dim yend As Integer = warp_Math.crop(yBase + h, 0, height) - Dim pos As Integer, offset1 As Integer, offset2 As Integer - xBase = warp_Math.crop(xBase, 0, width) - yBase = warp_Math.crop(yBase, 0, height) - - ty = tyBase - Dim j As Integer - For j = yBase To yend - 1 'Step j + 1 - tx = txBase - offset1 = j * width - offset2 = (ty >> 8) * tw - Dim i As Integer - For i = xBase To xend - 1 'Step i + 1 - pixels(i + offset1) = &HFF000000 Or warp_Color.inv(pixels(i + offset1)) ', texture.pixel((tx >> 8) + offset2) - tx += dtx - Next - ty += dty - Next - End Sub - - Public Sub Modulate(ByVal texture As warp_Texture, ByVal posx As Integer, ByVal posy As Integer, ByVal xsize As Integer, ByVal ysize As Integer) - Modulate(width, height, texture, posx, posy, xsize, ysize) - End Sub - - Private Sub Modulate(ByVal width As Integer, ByVal height As Integer, ByVal texture As warp_Texture, ByVal posx As Integer, ByVal posy As Integer, ByVal xsize As Integer, ByVal ysize As Integer) - If texture Is Nothing Then Return - - Dim w As Integer = xsize - Dim h As Integer = ysize - Dim xBase As Integer = posx - Dim yBase As Integer = posy - Dim tx As Integer = texture.width * 255 - Dim ty As Integer = texture.height * 255 - Dim tw As Integer = texture.width - Dim dtx As Integer = CInt(tx / w) - Dim dty As Integer = CInt(ty / h) - Dim txBase As Integer = warp_Math.crop(-xBase * dtx, 0, 255 * tx) - Dim tyBase As Integer = warp_Math.crop(-yBase * dty, 0, 255 * ty) - Dim xend As Integer = warp_Math.crop(xBase + w, 0, width) - Dim yend As Integer = warp_Math.crop(yBase + h, 0, height) - Dim pos As Integer, offset1 As Integer, offset2 As Integer - xBase = warp_Math.crop(xBase, 0, width) - yBase = warp_Math.crop(yBase, 0, height) - - ty = tyBase - Dim j As Integer - For j = yBase To yend - 1 'Step j + 1 - tx = txBase - offset1 = j * width - offset2 = (ty >> 8) * tw - Dim i As Integer - For i = xBase To xend - 1 'Step i + 1 - pixels(i + offset1) = &HFF000000 Or warp_Color.Modulate(texture.pixel((tx >> 8) + offset2), pixels(i + offset1)) - tx += dtx - Next - ty += dty - Next - End Sub - End Class -End Namespace diff --git a/trunk/managed/Warp3D/Warp3DVB/My Project/Application.Designer.vb b/trunk/managed/Warp3D/Warp3DVB/My Project/Application.Designer.vb deleted file mode 100644 index eea40cc1..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/My Project/Application.Designer.vb +++ /dev/null @@ -1,13 +0,0 @@ -'------------------------------------------------------------------------------ -' -' This code was generated by a tool. -' Runtime Version:2.0.50727.42 -' -' Changes to this file may cause incorrect behavior and will be lost if -' the code is regenerated. -' -'------------------------------------------------------------------------------ - -Option Strict On -Option Explicit On - diff --git a/trunk/managed/Warp3D/Warp3DVB/My Project/Application.myapp b/trunk/managed/Warp3D/Warp3DVB/My Project/Application.myapp deleted file mode 100644 index 0167050e..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/My Project/Application.myapp +++ /dev/null @@ -1,10 +0,0 @@ - - - false - false - 0 - true - 0 - 1 - true - diff --git a/trunk/managed/Warp3D/Warp3DVB/My Project/AssemblyInfo.vb b/trunk/managed/Warp3D/Warp3DVB/My Project/AssemblyInfo.vb deleted file mode 100644 index 9cda5532..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/My Project/AssemblyInfo.vb +++ /dev/null @@ -1,35 +0,0 @@ -Imports System -Imports System.Reflection -Imports System.Runtime.InteropServices - -' General Information about an assembly is controlled through the following -' set of attributes. Change these attribute values to modify the information -' associated with an assembly. - -' Review the values of the assembly attributes - - - - - - - - - - -'The following GUID is for the ID of the typelib if this project is exposed to COM - - -' Version information for an assembly consists of the following four values: -' -' Major Version -' Minor Version -' Build Number -' Revision -' -' You can specify all the values or you can default the Build and Revision Numbers -' by using the '*' as shown below: -' - - - diff --git a/trunk/managed/Warp3D/Warp3DVB/My Project/Resources.Designer.vb b/trunk/managed/Warp3D/Warp3DVB/My Project/Resources.Designer.vb deleted file mode 100644 index 09d4d2d3..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/My Project/Resources.Designer.vb +++ /dev/null @@ -1,63 +0,0 @@ -'------------------------------------------------------------------------------ -' -' This code was generated by a tool. -' Runtime Version:2.0.50727.42 -' -' Changes to this file may cause incorrect behavior and will be lost if -' the code is regenerated. -' -'------------------------------------------------------------------------------ - -Option Strict On -Option Explicit On - -Imports System - -Namespace My.Resources - - 'This class was auto-generated by the StronglyTypedResourceBuilder - 'class via a tool like ResGen or Visual Studio. - 'To add or remove a member, edit your .ResX file then rerun ResGen - 'with the /str option, or rebuild your VS project. - ''' - ''' A strongly-typed resource class, for looking up localized strings, etc. - ''' - _ - Friend Module Resources - - Private resourceMan As Global.System.Resources.ResourceManager - - Private resourceCulture As Global.System.Globalization.CultureInfo - - ''' - ''' Returns the cached ResourceManager instance used by this class. - ''' - _ - Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager - Get - If Object.ReferenceEquals(resourceMan, Nothing) Then - Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("Warp3DVB.Resources", GetType(Resources).Assembly) - resourceMan = temp - End If - Return resourceMan - End Get - End Property - - ''' - ''' Overrides the current thread's CurrentUICulture property for all - ''' resource lookups using this strongly typed resource class. - ''' - _ - Friend Property Culture() As Global.System.Globalization.CultureInfo - Get - Return resourceCulture - End Get - Set - resourceCulture = value - End Set - End Property - End Module -End Namespace diff --git a/trunk/managed/Warp3D/Warp3DVB/My Project/Resources.resx b/trunk/managed/Warp3D/Warp3DVB/My Project/Resources.resx deleted file mode 100644 index ffecec85..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/My Project/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/trunk/managed/Warp3D/Warp3DVB/My Project/Settings.Designer.vb b/trunk/managed/Warp3D/Warp3DVB/My Project/Settings.Designer.vb deleted file mode 100644 index 56af2d71..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/My Project/Settings.Designer.vb +++ /dev/null @@ -1,73 +0,0 @@ -'------------------------------------------------------------------------------ -' -' This code was generated by a tool. -' Runtime Version:2.0.50727.42 -' -' Changes to this file may cause incorrect behavior and will be lost if -' the code is regenerated. -' -'------------------------------------------------------------------------------ - -Option Strict On -Option Explicit On - - -Namespace My - - _ - Partial Friend NotInheritable Class MySettings - Inherits Global.System.Configuration.ApplicationSettingsBase - - Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings),MySettings) - -#Region "My.Settings Auto-Save Functionality" -#If _MyType = "WindowsForms" Then - Private Shared addedHandler As Boolean - - Private Shared addedHandlerLockObject As New Object - - _ - Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs) - If My.Application.SaveMySettingsOnExit Then - My.Settings.Save() - End If - End Sub -#End If -#End Region - - Public Shared ReadOnly Property [Default]() As MySettings - Get - -#If _MyType = "WindowsForms" Then - If Not addedHandler Then - SyncLock addedHandlerLockObject - If Not addedHandler Then - AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings - addedHandler = True - End If - End SyncLock - End If -#End If - Return defaultInstance - End Get - End Property - End Class -End Namespace - -Namespace My - - _ - Friend Module MySettingsProperty - - _ - Friend ReadOnly Property Settings() As Global.Warp3DVB.My.MySettings - Get - Return Global.Warp3DVB.My.MySettings.Default - End Get - End Property - End Module -End Namespace diff --git a/trunk/managed/Warp3D/Warp3DVB/My Project/Settings.settings b/trunk/managed/Warp3D/Warp3DVB/My Project/Settings.settings deleted file mode 100644 index 377f56d6..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/My Project/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/trunk/managed/Warp3D/Warp3DVB/Warp3D.resx b/trunk/managed/Warp3D/Warp3DVB/Warp3D.resx deleted file mode 100644 index 8f95d662..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/Warp3D.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/trunk/managed/Warp3D/Warp3DVB/Warp3D.vb b/trunk/managed/Warp3D/Warp3DVB/Warp3D.vb deleted file mode 100644 index 8702a429..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/Warp3D.vb +++ /dev/null @@ -1,809 +0,0 @@ -' Created by: X -' http://www.createdbyx.com/ -' ---------------------- -' C# to VB.NET conversion of this code was done by hand and with the assistance of the -' Convert C# to VB .NET application availible at http://www.kamalpatel.net/ConvertCSharp2VB.aspx -' ConvertCSharp2VB utility was developed by: Kamal Patel (http://www.KamalPatel.net) -' ---------------------- -' Thanks to Alan Simes ( http://alansimes.blogdns.net/ ) for creating the Warp3D library. -' http://alansimes.blogdns.net/cs/files/default.aspx -' ---------------------- - -Imports System -imports System.Collections -imports System.ComponentModel -imports System.Drawing -imports System.Data -imports System.Text -imports System.Windows.Forms -Imports System.Runtime.InteropServices -Imports Warp3DVB.Rednettle.Warp3D - -namespace Warp3D - Partial Public Class Warp3D - Inherits UserControl - - Dim _scene As Rednettle.Warp3D.warp_Scene = Nothing - Dim _waiting As String = "Waiting..." - - Private _plugins As New Hashtable() - Private _models As New Hashtable() - - Private _dragging As Boolean = False - Private _oldx As Integer = 0 - Private _oldy As Integer = 0 - Private _controlkey As Boolean = False - Public _keargs As KeyEventArgs - - 'Public Sub New() - ' me.InitializeComponent - - ' Me.MouseUp = New MouseEventHandler(AddressOf OnMouseUp) - ' Me.MouseDown = New MouseEventHandler(AddressOf OnMouseDown) - ' Me.MouseMove = New MouseEventHandler(AddressOf OnMouseMove) - 'End Sub - Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs) - MyBase.OnPaint(e) - - Dim g As Graphics = e.Graphics - - g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality - g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic - - If _scene IsNot Nothing Then - g.DrawImage(_scene.getImage(), 0, 0, Me.Width, Me.Height) - Else - Dim drawFont As Font = New Font("Verdana", 8) - - Dim drawBrush As SolidBrush = New SolidBrush(Color.Black) - Dim drawRect As RectangleF = New RectangleF(-1, -1, Width + 1, Height + 1) - - e.Graphics.FillRectangle(New SolidBrush(Me.BackColor), drawRect) - e.Graphics.DrawString(_waiting, drawFont, drawBrush, drawRect) - End If - End Sub - - Public Sub OnMouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles MyBase.MouseMove - If _dragging Then - Dim dx As Single = (e.Y - _oldy) / 50.0F - Dim dy As Single = (_oldx - e.X) / 50.0F - - If _controlkey Then - _scene.defaultCamera.shift(0, 0, dx) - Else - _scene.rotate(dx, dy, 0) - End If - - _scene.render() - - _oldx = e.X - _oldy = e.Y - - Refresh() - End If - End Sub - - Public Sub OnMouseUp(ByVal sender As Object, ByVal e As MouseEventArgs) - _dragging = False - End Sub - - Public Sub OnMouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) - _oldx = e.X - _oldy = e.Y - - _dragging = True - End Sub - - Protected Overrides Sub OnPaintBackground(ByVal e As PaintEventArgs) - End Sub - - Public Function RegisterPlugIN(ByVal name As String, ByVal plugin As Rednettle.Warp3D.warp_FXPlugin) As Boolean - If _scene Is Nothing Then Return False - - _plugins.Add(name, plugin) - - Return True - End Function - - Public Sub ShiftDefaultCamera(ByVal x As Single, ByVal y As Single, ByVal z As Single) - _scene.defaultCamera.shift(x, y, z) - End Sub - - Public Function AddSphere(ByVal name As String, ByVal radius As Single, ByVal segments As Integer) As Boolean - If _scene Is Nothing Then Return False - - Dim o As warp_Object = warp_ObjectFactory.SPHERE(radius, segments) - - If o Is Nothing Then Return False - - _scene.addObject(name, o) - _scene.rebuild() - - Return True - End Function - - - Public Function AddPlane(ByVal name As String, ByVal size As Single) As Boolean - If _scene Is Nothing Then - Return False - End If - - Dim o As warp_Object = warp_ObjectFactory.SIMPLEPLANE(size, True) - - If o Is Nothing Then - Return False - End If - - _scene.addObject(name, o) - - Return True - End Function - - Public Function AddCube(ByVal name As String, ByVal size As Single) As Boolean - If _scene Is Nothing Then - Return False - End If - - Dim o As warp_Object = warp_ObjectFactory.CUBE(size) - - If o Is Nothing Then - Return False - End If - - _scene.addObject(name, o) - _scene.rebuild() - - Return True - End Function - - Public Function AddBox(ByVal name As String, ByVal x As Single, ByVal y As Single, ByVal z As Single) As Boolean - If _scene Is Nothing Then - Return False - End If - - Dim o As warp_Object = warp_ObjectFactory.BOX(x, y, z) - - If o Is Nothing Then - Return False - End If - - _scene.addObject(name, o) - _scene.rebuild() - - Return True - End Function - - - Public Function ProjectFrontal(ByVal name As String) As Boolean - If _scene Is Nothing Then - Return False - End If - - Dim o As warp_Object = _scene.sceneobject(name) - If o Is Nothing Then - Return False - End If - - warp_TextureProjector.projectFrontal(o) - - Return True - End Function - - Public Function ProjectCylindric(ByVal name As String) As Boolean - If _scene Is Nothing Then - Return False - End If - - Dim o As warp_Object = _scene.sceneobject(name) - If o Is Nothing Then - Return False - End If - - warp_TextureProjector.projectCylindric(o) - - Return True - End Function - - Public Function ShiftObject(ByVal name As String, ByVal x As Single, ByVal y As Single, ByVal z As Single) As Boolean - If _scene Is Nothing Then - Return False - End If - - Dim o As warp_Object = _scene.sceneobject(name) - If o Is Nothing Then - Return False - End If - - o.shift(x, y, z) - - Return True - End Function - - Public Function SetPos(ByVal name As String, ByVal x As Single, ByVal y As Single, ByVal z As Single) As Boolean - If _scene Is Nothing Then - Return False - End If - - Dim o As warp_Object = _scene.sceneobject(name) - If o Is Nothing Then - Return False - End If - - o.setPos(x, y, z) - - Return True - End Function - - - Public Function AddLensFlare(ByVal name As String) As Boolean - If _scene Is Nothing Then - Return False - End If - - Dim lensFlare As warp_FXLensFlare = New warp_FXLensFlare(name, _scene, False) - lensFlare.preset1() - - RegisterPlugIN(name, lensFlare) - - Return True - End Function - - Public Function NormaliseScene() As Boolean - If _scene Is Nothing Then - Return False - End If - - _scene.normalize() - - Return True - End Function - - Public Function SetAmbient(ByVal c As Integer) As Boolean - If _scene Is Nothing Then - Return False - End If - - _scene.setAmbient(c) - - Return True - End Function - - Public Function RotateScene(ByVal quat As warp_Quaternion, ByVal x As Single, ByVal y As Single, ByVal z As Single) As Boolean - If _scene Is Nothing Then - Return False - End If - - _scene.rotate(quat, x, y, z) - - Return True - End Function - - Public Function RotateScene(ByVal x As Single, ByVal y As Single, ByVal z As Single) As Boolean - If _scene Is Nothing Then - Return False - End If - - _scene.rotate(x, y, z) - - Return True - End Function - - Public Function RotateScene(ByVal m As warp_Matrix) As Boolean - If _scene Is Nothing Then - Return False - End If - - _scene.rotate(m) - - Return True - End Function - - Public Function ScaleScene(ByVal x As Single, ByVal y As Single, ByVal z As Single) As Boolean - If _scene Is Nothing Then - Return False - End If - - _scene.scale(x, y, z) - - Return True - End Function - - Public Function TranslateScene(ByVal x As Single, ByVal y As Single, ByVal z As Single) As Boolean - If _scene Is Nothing Then - Return False - End If - - _scene.shift(x, y, z) - - Return True - End Function - - - Public Function RotateObject(ByVal name As String, ByVal x As Single, ByVal y As Single, ByVal z As Single) As Boolean - If _scene Is Nothing Then - Return False - End If - - Dim o As warp_Object = _scene.sceneobject(name) - If o Is Nothing Then - Return False - End If - - o.rotate(x, y, z) - - Return True - End Function - - Public Function RotateSelf(ByVal name As String, ByVal x As Single, ByVal y As Single, ByVal z As Single) As Boolean - If _scene Is Nothing Then - Return False - End If - - Dim o As warp_Object = _scene.sceneobject(name) - If o Is Nothing Then - Return False - End If - - o.rotateSelf(x, y, z) - - Return True - End Function - - Public Function RotateSelf(ByVal name As String, ByVal m As warp_Matrix) As Boolean - If _scene Is Nothing Then - Return False - End If - - Dim o As warp_Object = _scene.sceneobject(name) - If o Is Nothing Then - Return False - End If - - o.rotateSelf(m) - - Return True - End Function - - Public Function RotateSelf(ByVal name As String, ByVal quat As warp_Quaternion) As Boolean - If _scene Is Nothing Then - Return False - End If - - Dim o As warp_Object = _scene.sceneobject(name) - If o Is Nothing Then - Return False - End If - - o.rotateSelf(quat) - - Return True - End Function - - - Public Function ScaleObject(ByVal name As String, ByVal s As Single) As Boolean - If _scene Is Nothing Then - Return False - End If - - Dim o As warp_Object = _scene.sceneobject(name) - If o Is Nothing Then - Return False - End If - - o.scale(s) - - Return True - End Function - - Public Function SetObjectMaterial(ByVal name As String, ByVal m As String) As Boolean - If _scene Is Nothing Then - Return False - End If - - Dim material As warp_Material = CType(_scene.materialData(m), warp_Material) - If material Is Nothing Then - Return False - End If - - _scene.sceneobject(name).setMaterial(material) - - Return True - End Function - - Public Function SetEnvMap(ByVal name As String, ByVal path As String) As Boolean - If _scene Is Nothing Then - Return False - End If - - Dim texture As warp_Texture = Nothing - Try - texture = New warp_Texture(path) - Catch - Return False - End Try - - Dim material As warp_Material = CType(_scene.materialData(name), warp_Material) - If material Is Nothing Then - Return False - End If - - material.setEnvmap(texture) - - Return True - End Function - - Public Function AddLight(ByVal name As String, ByVal x As Single, ByVal y As Single, ByVal z As Single, ByVal color As Integer, ByVal d As Integer, ByVal s As Integer) As Boolean - If _scene Is Nothing Then - Return False - End If - - _scene.addLight(name, New warp_Light(New warp_Vector(x, y, z), color, d, s)) - - Return True - End Function - - Public Function RotateModelSelf(ByVal name As String, ByVal x As Single, ByVal y As Single, ByVal z As Single) As Boolean - If _scene Is Nothing Then - Return False - End If - - Dim model As Hashtable = CType(_models(name), Hashtable) - If model Is Nothing Then - Return False - End If - - Dim myDE As DictionaryEntry - For Each myDE In model - Dim key As String = CType(myDE.Key, String) - Dim o As warp_Object = CType(myDE.Value, warp_Object) - - o.rotateSelf(x, y, z) - Next - - Return True - End Function - - Public Function RotateModel(ByVal name As String, ByVal x As Single, ByVal y As Single, ByVal z As Single) As Boolean - If _scene Is Nothing Then - Return False - End If - - Dim model As Hashtable = CType(_models(name), Hashtable) - If model Is Nothing Then - Return False - End If - - Dim myDE As DictionaryEntry - For Each myDE In model - Dim key As String = CType(myDE.Key, String) - Dim o As warp_Object = CType(myDE.Value, warp_Object) - - o.rotate(x, y, z) - Next - - Return True - End Function - - Public Function TranslateModel(ByVal name As String, ByVal x As Single, ByVal y As Single, ByVal z As Single) As Boolean - If _scene Is Nothing Then - Return False - End If - - Dim model As Hashtable = CType(_models(name), Hashtable) - If model Is Nothing Then - Return False - End If - - Dim myDE As DictionaryEntry - For Each myDE In model - Dim key As String = CType(myDE.Key, String) - Dim o As warp_Object = CType(myDE.Value, warp_Object) - - o.shift(x, y, z) - Next - - Return True - End Function - - Public Function ScaleModel(ByVal name As String, ByVal scale As Single) As Boolean - If _scene Is Nothing Then - Return False - End If - - Dim model As Hashtable = CType(_models(name), Hashtable) - If model Is Nothing Then - Return False - End If - - Dim myDE As DictionaryEntry - For Each myDE In model - Dim key As String = CType(myDE.Key, String) - Dim o As warp_Object = CType(myDE.Value, warp_Object) - - o.scaleSelf(scale) - Next - - Return True - End Function - - - Public Function Import3Ds(ByVal name As String, ByVal path As String, ByVal addtoscene As Boolean) As Hashtable - If _scene Is Nothing Then - Return Nothing - End If - - Dim list As Hashtable = Nothing - Dim studio As warp_3ds_Importer = New warp_3ds_Importer() - Try - list = studio.importFromFile(name, path) - - If addtoscene Then - Dim myDE As DictionaryEntry - For Each myDE In list - Dim key As String = CType(myDE.Key, String) - Dim o As warp_Object = CType(myDE.Value, warp_Object) - - _scene.addObject(key, o) - Next - End If - - _scene.rebuild() - _models.Add(name, list) - Catch - Return Nothing - End Try - - Return list - End Function - - Public Function SetBackgroundColor(ByVal c As Integer) As Boolean - If _scene Is Nothing Then - Return False - End If - - _scene.environment.bgcolor = c - - Return True - End Function - - Public Function SetBackgroundTexture(ByVal path As String) As Boolean - If _scene Is Nothing Then - Return False - End If - - Dim texture As warp_Texture = Nothing - Try - texture = New warp_Texture(path) - Catch - Return False - End Try - - _scene.environment.setBackground(texture) - - Return True - End Function - - Public Function SetBackgroundMaterial(ByVal path As String) As Boolean - If _scene Is Nothing Then - Return False - End If - - Dim material As warp_Material = Nothing - Try - material = New warp_Material(path) - Catch - Return False - End Try - - Dim texture As warp_Texture = material.getTexture() - If texture Is Nothing Then - Return False - End If - - _scene.environment.setBackground(texture) - Return True - End Function - - Public Function SetWireframe(ByVal name As String, ByVal w As Boolean) As Boolean - If _scene Is Nothing Then - Return False - End If - - Dim material As warp_Material = CType(_scene.materialData(name), warp_Material) - If material Is Nothing Then - Return False - End If - - material.setWireframe(w) - - Return True - End Function - - Public Function SetTexture(ByVal name As String, ByVal path As String) As Boolean - If _scene Is Nothing Then - Return False - End If - - Dim texture As warp_Texture = Nothing - Try - texture = New warp_Texture(path) - Catch - Return False - End Try - - Dim material As warp_Material = CType(_scene.materialData(name), warp_Material) - If material Is Nothing Then - Return False - End If - - material.setTexture(texture) - - Return True - End Function - - Public Function AddMaterial(ByVal name As String) As Boolean - If _scene Is Nothing Then - Return False - End If - - Dim material As warp_Material = New warp_Material() - _scene.addMaterial(name, material) - - Return True - End Function - - Public Function AddMaterial(ByVal name As String, ByVal color As Integer) As Boolean - If _scene Is Nothing Then - Return False - End If - - Dim material As warp_Material = New warp_Material(color) - _scene.addMaterial(name, material) - - Return True - End Function - - Public Function AddMaterial(ByVal name As String, ByVal path As String) As Boolean - If _scene Is Nothing Then - Return False - End If - - Dim material As warp_Material = Nothing - Try - material = New warp_Material(path) - Catch - Return False - End Try - - _scene.addMaterial(name, material) - - Return True - End Function - - Public Function SetReflectivity(ByVal name As String, ByVal r As Integer) As Boolean - If _scene Is Nothing Then - Return False - End If - - Dim material As warp_Material = CType(_scene.materialData(name), warp_Material) - If material Is Nothing Then - Return False - End If - - material.setReflectivity(r) - - Return True - End Function - - Public Function SetTransparency(ByVal name As String, ByVal t As Integer) As Boolean - If _scene Is Nothing Then - Return False - End If - - Dim material As warp_Material = CType(_scene.materialData(name), warp_Material) - If material Is Nothing Then - Return False - End If - - material.setTransparency(t) - - Return True - End Function - - Public Function Render() As Boolean - Try - _scene.render() - - Dim myDE As DictionaryEntry - For Each myDE In _plugins - Dim plugin As warp_FXPlugin = CType(myDE.Value, warp_FXPlugin) - plugin.apply() - Next - Catch - Return False - End Try - - Return True - End Function - - Public Function CreateScene(ByVal width As Integer, ByVal height As Integer) As Boolean - Try - _scene = New warp_Scene(width, height) - - _plugins.Clear() - _models.Clear() - Catch - Reset() - Return False - End Try - - Return True - End Function - - Public Sub Reset() - _scene = Nothing - System.GC.Collect() - End Sub - - - Public Sub DisplayDefaultScene() - _scene = New warp_Scene(512, 512) - - Dim crystal As warp_Material = New warp_Material(warp_TextureFactory.MARBLE(128, 128, 0.15F)) - _scene.addMaterial("crystal", crystal) - - Dim c As warp_Material = CType(_scene.materialData("crystal"), warp_Material) - c.setReflectivity(255) - c.setTransparency(100) - - _scene.environment.setBackground(warp_TextureFactory.CHECKERBOARD(128, 128, 3, &H0, &H999999)) - - _scene.addLight("light1", New warp_Light(New warp_Vector(0.2F, 0.2F, 1.0F), &HFFFFFF, 320, 80)) - _scene.addLight("light2", New warp_Light(New warp_Vector(-1.0F, -1.0F, 1.0F), &HFFFFFF, 100, 40)) - - Dim path() As warp_Vector = New warp_Vector(15) {} - - path(0) = New warp_Vector(0.0F, 0.2F, 0) - path(1) = New warp_Vector(0.13F, 0.25F, 0) - path(2) = New warp_Vector(0.33F, 0.3F, 0) - path(3) = New warp_Vector(0.43F, 0.6F, 0) - path(4) = New warp_Vector(0.48F, 0.9F, 0) - path(5) = New warp_Vector(0.5F, 0.9F, 0) - path(6) = New warp_Vector(0.45F, 0.6F, 0) - path(7) = New warp_Vector(0.35F, 0.3F, 0) - path(8) = New warp_Vector(0.25F, 0.2F, 0) - path(9) = New warp_Vector(0.1F, 0.15F, 0) - path(10) = New warp_Vector(0.1F, 0.0F, 0) - path(11) = New warp_Vector(0.1F, -0.5F, 0) - path(12) = New warp_Vector(0.35F, -0.55F, 0) - path(13) = New warp_Vector(0.4F, -0.6F, 0) - path(14) = New warp_Vector(0.0F, -0.6F, 0) - - _scene.addObject("wineglass", warp_ObjectFactory.ROTATIONOBJECT(path, 32)) - _scene.sceneobject("wineglass").setMaterial(_scene.material("crystal")) - - _scene.sceneobject("wineglass").scale(0.8F, 0.8F, 0.8F) - _scene.sceneobject("wineglass").rotate(0.5F, 0.0F, 0.0F) - - _scene.render() - - Refresh() - End Sub - - Private Sub Warp3D_Load(ByVal sender As Object, ByVal e As EventArgs) - - End Sub - - Private Sub Warp3D_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) - _keargs = e - _controlkey = e.Control - End Sub - - Private Sub Warp3D_KeyUp(ByVal sender As Object, ByVal e As KeyEventArgs) - _keargs = e - _controlkey = e.Control - End Sub - - - End Class -end namespace \ No newline at end of file diff --git a/trunk/managed/Warp3D/Warp3DVB/Warp3DVB.vbproj b/trunk/managed/Warp3D/Warp3DVB/Warp3DVB.vbproj deleted file mode 100644 index 82a6deb7..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/Warp3DVB.vbproj +++ /dev/null @@ -1,251 +0,0 @@ - - - - Debug - AnyCPU - 8.0.50727 - 2.0 - {D6F7F49F-4A6F-41CF-9129-C71B66BFC506} - Library - Warp3DVB - Warp3DVB - Windows - On - SAK - SAK - SAK - SAK - - - true - full - true - true - bin\Debug\ - Warp3DVB.xml - 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 - true - - - pdbonly - false - true - true - bin\Release\ - Warp3DVB.xml - 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 - - - bin\Original\ - - - bin\64Bit CPU%27s\ - - - true - true - true - bin\x64\Debug\ - true - Warp3DVB.xml - 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 - full - x64 - - - true - bin\x64\Release\ - Warp3DVB.xml - true - 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 - pdbonly - x64 - - - bin\x64\Original\ - x64 - - - bin\x64\64Bit CPU%27s\ - x64 - - - true - true - true - bin\Slixel Tester\ - true - Warp3DVB.xml - 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 - full - AnyCPU - \rules - true - GlobalSuppressions.vb - - - true - true - true - bin\x64\Slixel Tester\ - true - Warp3DVB.xml - 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 - full - x64 - \rules - true - GlobalSuppressions.vb - - - - - - - - - - - - - - - - - - - - - - True - Application.myapp - - - True - True - Resources.resx - - - True - Settings.settings - True - - - - - VbMyResourcesResXFileCodeGenerator - Resources.Designer.vb - My.Resources - Designer - - - Warp3D.vb - Designer - - - - - MyApplicationCodeGenerator - Application.Designer.vb - - - SettingsSingleFileGenerator - My - Settings.Designer.vb - - - - - UserControl - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/trunk/managed/Warp3D/Warp3DVB/Warp3DVB.vbproj.vspscc b/trunk/managed/Warp3D/Warp3DVB/Warp3DVB.vbproj.vspscc deleted file mode 100644 index feffdeca..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/Warp3DVB.vbproj.vspscc +++ /dev/null @@ -1,10 +0,0 @@ -"" -{ -"FILE_VERSION" = "9237" -"ENLISTMENT_CHOICE" = "NEVER" -"PROJECT_FILE_RELATIVE_PATH" = "" -"NUMBER_OF_EXCLUDED_FILES" = "0" -"ORIGINAL_PROJECT_FILE_PATH" = "" -"NUMBER_OF_NESTED_PROJECTS" = "0" -"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" -} diff --git a/trunk/managed/Warp3D/Warp3DVB/Warp_Vector.vb b/trunk/managed/Warp3D/Warp3DVB/Warp_Vector.vb deleted file mode 100644 index fa11f48d..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/Warp_Vector.vb +++ /dev/null @@ -1,124 +0,0 @@ -' Created by: X -' http://www.createdbyx.com/ -' ---------------------- -' C# to VB.NET conversion of this code was done by hand and with the assistance of the -' Convert C# to VB .NET application availible at http://www.kamalpatel.net/ConvertCSharp2VB.aspx -' ConvertCSharp2VB utility was developed by: Kamal Patel (http://www.KamalPatel.net) -' ---------------------- -' Thanks to Alan Simes ( http://alansimes.blogdns.net/ ) for creating the Warp3D library. -' http://alansimes.blogdns.net/cs/files/default.aspx -' ---------------------- - -Imports System - -Namespace Rednettle.Warp3D - Public Class warp_Vector - Public x As Single = 0 'Cartesian (default) - Public y As Single = 0 'Cartesian (default) - Public z As Single = 0 'Cartesian (default),Cylindric - Public r As Single = 0 'Cylindric - Public theta As Single = 0 'Cylindric - - Public Sub New() - End Sub - - Public Sub New(ByVal xpos As Single, ByVal ypos As Single, ByVal zpos As Single) - x = xpos - y = ypos - z = zpos - End Sub - - Public Function normalize() As warp_Vector - Dim dist As Single = length() - If dist = 0 Then Return Me - Dim invdist As Single = 1 / dist - x *= invdist - y *= invdist - z *= invdist - Return Me - End Function - - Public Function reverse() As warp_Vector - x = -x - y = -y - z = -z - Return Me - End Function - - Public Function length() As Single - Return CType(Math.Sqrt(x * x + y * y + z * z), Single) - End Function - - Public Function transform(ByVal m As warp_Matrix) As warp_Vector - Dim Newx As Single = x * m.m00 + y * m.m01 + z * m.m02 + m.m03 - Dim Newy As Single = x * m.m10 + y * m.m11 + z * m.m12 + m.m13 - Dim Newz As Single = x * m.m20 + y * m.m21 + z * m.m22 + m.m23 - - Return New warp_Vector(Newx, Newy, Newz) - End Function - - Public Sub buildCylindric() - r = CType(Math.Sqrt(x * x + y * y), Single) - theta = CType(Math.Atan2(x, y), Single) - End Sub - - Public Sub buildCartesian() - x = r * warp_Math.cos(theta) - y = r * warp_Math.sin(theta) - End Sub - - Public Shared Function getNormal(ByVal a As warp_Vector, ByVal b As warp_Vector) As warp_Vector - Return vectorProduct(a, b).normalize() - End Function - - Public Shared Function getNormal(ByVal a As warp_Vector, ByVal b As warp_Vector, ByVal c As warp_Vector) As warp_Vector - Return vectorProduct(a, b, c).normalize() - End Function - - Public Shared Function vectorProduct(ByVal a As warp_Vector, ByVal b As warp_Vector) As warp_Vector - Return New warp_Vector(a.y * b.z - b.y * a.z, a.z * b.x - b.z * a.x, a.x * b.y - b.x * a.y) - End Function - - Public Shared Function vectorProduct(ByVal a As warp_Vector, ByVal b As warp_Vector, ByVal c As warp_Vector) As warp_Vector - Return vectorProduct(warp_Vector.sub(b, a), warp_Vector.sub(c, a)) - End Function - - Public Shared Function angle(ByVal a As warp_Vector, ByVal b As warp_Vector) As Single - a.normalize() - b.normalize() - Return (a.x * b.x + a.y * b.y + a.z * b.z) - End Function - - Public Shared Function add(ByVal a As warp_Vector, ByVal b As warp_Vector) As warp_Vector - Return New warp_Vector(a.x + b.x, a.y + b.y, a.z + b.z) - End Function - - Public Shared Function [sub](ByVal a As warp_Vector, ByVal b As warp_Vector) As warp_Vector - Return New warp_Vector(a.x - b.x, a.y - b.y, a.z - b.z) - End Function - - Public Shared Function scale(ByVal f As Single, ByVal a As warp_Vector) As warp_Vector - Return New warp_Vector(f * a.x, f * a.y, f * a.z) - End Function - - Public Shared Function len(ByVal a As warp_Vector) As Single - Return CType(Math.Sqrt(a.x * a.x + a.y * a.y + a.z * a.z), Single) - End Function - ' - ' Public static void New random(single fact) - ' ' returns a random vector - ' { - ' Return New warp_Vector(fact*warp_Math.random(),fact*warp_Math.random(),fact*warp_Math.random()) - ' } - ' - ' Public String toString() - ' { - ' Return New String ("\r\n") - ' } - ' */ - - Public Function getClone() As warp_Vector - Return New warp_Vector(x, y, z) - End Function - End Class -End Namespace diff --git a/trunk/managed/Warp3D/Warp3DVB/warp_3ds_Importer.vb b/trunk/managed/Warp3D/Warp3DVB/warp_3ds_Importer.vb deleted file mode 100644 index 377c74a3..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/warp_3ds_Importer.vb +++ /dev/null @@ -1,196 +0,0 @@ -' Created by: X -' http://www.createdbyx.com/ -' ---------------------- -' C# to VB.NET conversion of this code was done by hand and with the assistance of the -' Convert C# to VB .NET application availible at http://www.kamalpatel.net/ConvertCSharp2VB.aspx -' ConvertCSharp2VB utility was developed by: Kamal Patel (http://www.KamalPatel.net) -' ---------------------- -' Thanks to Alan Simes ( http://alansimes.blogdns.net/ ) for creating the Warp3D library. -' http://alansimes.blogdns.net/cs/files/default.aspx -' ---------------------- - -Imports System -Imports System.IO -Imports System.Collections -Imports System.Net - -Namespace Rednettle.Warp3D - '/ - '/ Summary description for warp_3ds_Importer. - '/ - Public Class warp_3ds_Importer - Private currentJunkId As Integer - Private nextJunkOffset As Integer - - Private currentObjectName As String = Nothing - Private currentObject As warp_Object = Nothing - Private endOfStream As Boolean = False - - Private _objects As Hashtable = New Hashtable() - - Public Sub New() - End Sub - - Public Function importFromFile(ByVal name As String, ByVal path As String) As Hashtable - Dim fs As Stream = Nothing - _objects.Clear() - - If path.StartsWith("http") Then - Dim webrq As WebRequest = WebRequest.Create(path) - fs = webrq.GetResponse().GetResponseStream() - Else - fs = New FileStream(path, FileMode.Open) - End If - - Dim br As BinaryReader = New BinaryReader(fs) - Return importFromStream(name, br) - End Function - - Public Function importFromStream(ByVal name As String, ByVal inStream As BinaryReader) As Hashtable - _objects.Clear() - - readJunkHeader(inStream) - If currentJunkId <> &H4D4D Then Return Nothing - - Try - While True - readNextJunk(name, inStream) - End While - Catch - ' ignored - End Try - - inStream.Close() - - Return _objects - End Function - - Private Sub readJunkHeader(ByVal inStream As BinaryReader) - currentJunkId = readShort(inStream) - nextJunkOffset = readInt(inStream) - endOfStream = currentJunkId < 0 - End Sub - - - Private Function readInt(ByVal inStream As BinaryReader) As Integer - Return inStream.ReadByte() Or (inStream.ReadByte() << 8) Or (inStream.ReadByte() << 16) Or (inStream.ReadByte() << 24) - End Function - - Private Function readShort(ByVal inStream As BinaryReader) As Integer - Return (inStream.ReadByte() Or (inStream.ReadByte() << 8)) - End Function - - Private Sub readNextJunk(ByVal name As String, ByVal inStream As BinaryReader) - readJunkHeader(inStream) - - If currentJunkId = &H3D3D Then Return - - If currentJunkId = &H4000 Then - currentObjectName = readString(inStream) - Return - End If - - If currentJunkId = &H4100 Then - currentObject = New warp_Object() - _objects.Add(name & "_" & currentObjectName, currentObject) - - Return - End If - - If currentJunkId = &H4110 Then - readVertexList(inStream) - Return - End If - - If currentJunkId = &H4120 Then - readPointList(inStream) - Return - End If - - If currentJunkId = &H4140 Then - readMappingCoordinates(inStream) - Return - End If - - skipJunk(inStream) - End Sub - - Private Function readString(ByVal inStream As BinaryReader) As String - Dim result As String = "" - Dim inByte As Byte - - inByte = inStream.ReadByte() - While inByte <> 0 - result &= inByte - inByte = inStream.ReadByte() - End While - - Return result - End Function - - Private Function readFloat(ByVal inStream As BinaryReader) As Single - Dim bits As Integer = readInt(inStream) - - Dim s As Integer = CInt(IIf((bits >> 31) = 0, 1, -1)) - Dim e As Integer = ((bits >> 23) And &HFF) - Dim m As Integer = CInt(IIf((e = 0), (bits And &H7FFFFF) << 1, (bits And &H7FFFFF) Or &H800000)) - - Dim v As Double = s * m * Math.Pow(2, e - 150) - - Return CSng(v) - End Function - - - Private Sub skipJunk(ByVal inStream As BinaryReader) - Try - - For i As Integer = 0 To nextJunkOffset - 6 'AndAlso (Not endOfStream) 'Step i + 1 - If Not endOfStream Then endOfStream = (inStream.ReadByte() < 0) - Next - Catch - endOfStream = True - End Try - - End Sub - - Private Sub readVertexList(ByVal inStream As BinaryReader) - Dim x As Single, y As Single, z As Single - Dim vertices As Integer = readShort(inStream) - - For i As Integer = 0 To vertices - 1 'Step i + 1 - x = readFloat(inStream) - y = readFloat(inStream) - z = readFloat(inStream) - - currentObject.addVertex(x, -y, z) - Next - End Sub - - - Private Sub readPointList(ByVal inStream As BinaryReader) - Dim v1 As Integer, v2 As Integer, v3 As Integer - Dim triangles As Integer = readShort(inStream) - - For i As Integer = 0 To triangles - 1 'Step i + 1 - v1 = readShort(inStream) - v2 = readShort(inStream) - v3 = readShort(inStream) - - readShort(inStream) - - currentObject.addTriangle(currentObject.vertex(v1), _ - currentObject.vertex(v2), _ - currentObject.vertex(v3)) - Next - End Sub - - Private Sub readMappingCoordinates(ByVal inStream As BinaryReader) - Dim vertices As Integer = readShort(inStream) - - For i As Integer = 0 To vertices - 1 ' Step i + 1 - currentObject.vertex(i).u = readFloat(inStream) - currentObject.vertex(i).v = readFloat(inStream) - Next - End Sub - End Class -End Namespace \ No newline at end of file diff --git a/trunk/managed/Warp3D/Warp3DVB/warp_Camera.vb b/trunk/managed/Warp3D/Warp3DVB/warp_Camera.vb deleted file mode 100644 index e504dbb6..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/warp_Camera.vb +++ /dev/null @@ -1,155 +0,0 @@ -' Created by: X -' http://www.createdbyx.com/ -' ---------------------- -' C# to VB.NET conversion of this code was done by hand and with the assistance of the -' Convert C# to VB .NET application availible at http://www.kamalpatel.net/ConvertCSharp2VB.aspx -' ConvertCSharp2VB utility was developed by: Kamal Patel (http://www.KamalPatel.net) -' ---------------------- -' Thanks to Alan Simes ( http://alansimes.blogdns.net/ ) for creating the Warp3D library. -' http://alansimes.blogdns.net/cs/files/default.aspx -' ---------------------- - -Imports System - -Namespace Rednettle.Warp3D - '/ - '/ Summary description for warp_Camera. - '/ - '/ - Public Class warp_Camera - Public matrix As New warp_Matrix '= New warp_Matrix() - Public normalmatrix As New warp_Matrix '= New warp_Matrix() - - Dim needsRebuild As Boolean = True ' Flag indicating changes on matrix - - ' Camera settings - Public pos As warp_Vector = New warp_Vector(0.0F, 0.0F, 0.0F) - Public lookat As warp_Vector = New warp_Vector(0.0F, 0.0F, 0.0F) - Public rollfactor As Single = 0.0F - - Public fovfact As Single - Public screenwidth As Integer - Public screenheight As Integer - Public screenscale As Integer - - Public Sub New() - setFov(90.0F) - End Sub - - Public Sub New(ByVal fov As Single) - setFov(fov) - End Sub - - Public Function getMatrix() As warp_Matrix - rebuildMatrices() - Return matrix - End Function - - Public Function getNormalMatrix() As warp_Matrix - rebuildMatrices() - Return normalmatrix - End Function - - Private Sub rebuildMatrices() - If Not needsRebuild Then Exit Sub - needsRebuild = False - - Dim forward As warp_Vector, up As warp_Vector, right As warp_Vector - - forward = warp_Vector.sub(lookat, pos) - up = New warp_Vector(0.0F, 1.0F, 0.0F) - right = warp_Vector.getNormal(up, forward) - up = warp_Vector.getNormal(forward, right) - - forward.normalize() - up.normalize() - right.normalize() - - normalmatrix = New warp_Matrix(right, up, forward) - normalmatrix.rotate(0, 0, rollfactor) - matrix = normalmatrix.getClone() - matrix.shift(pos.x, pos.y, pos.z) - - normalmatrix = normalmatrix.inverse() - matrix = matrix.inverse() - End Sub - - Public Sub setFov(ByVal fov As Single) - fovfact = CSng(Math.Tan(warp_Math.deg2rad(fov) / 2)) - End Sub - - Public Sub roll(ByVal angle As Single) - rollfactor += angle - needsRebuild = True - End Sub - - Public Sub setPos(ByVal px As Single, ByVal py As Single, ByVal pz As Single) - pos = New warp_Vector(px, py, pz) - needsRebuild = True - End Sub - - Public Sub setPos(ByVal p As warp_Vector) - pos = p - needsRebuild = True - End Sub - - Public Sub setlookAt(ByVal px As Single, ByVal py As Single, ByVal pz As Single) - lookat = New warp_Vector(px, py, pz) - needsRebuild = True - End Sub - - Public Sub setlookAt(ByVal p As warp_Vector) - lookat = p - needsRebuild = True - End Sub - - Public Sub setScreensize(ByVal w As Integer, ByVal h As Integer) - screenwidth = w - screenheight = h - If w < h Then screenscale = w Else screenscale = h - End Sub - - Public Sub shift(ByVal dx As Single, ByVal dy As Single, ByVal dz As Single) - pos = pos.transform(warp_Matrix.shiftMatrix(dx, dy, dz)) - lookat = lookat.transform(warp_Matrix.shiftMatrix(dx, dy, dz)) - needsRebuild = True - End Sub - - Public Sub shift(ByVal v As warp_Vector) - shift(v.x, v.y, v.z) - End Sub - - Public Sub rotate(ByVal dx As Single, ByVal dy As Single, ByVal dz As Single) - pos = pos.transform(warp_Matrix.rotateMatrix(dx, dy, dz)) - needsRebuild = True - End Sub - - Public Sub rotate(ByVal v As warp_Vector) - rotate(v.x, v.y, v.z) - End Sub - - Public Shared Function FRONT() As warp_Camera - Dim cam As New warp_Camera ' = New warp_Camera() - cam.setPos(0, 0, -2.0F) - Return cam - End Function - - Public Shared Function LEFT() As warp_Camera - Dim cam As New warp_Camera '= New warp_Camera() - cam.setPos(2.0F, 0, 0) - Return cam - End Function - - Public Shared Function RIGHT() As warp_Camera - Dim cam As New warp_Camera '= New warp_Camera() - cam.setPos(-2.0F, 0, 0) - Return cam - End Function - - Public Shared Function TOP() As warp_Camera - Dim cam As New warp_Camera '= New warp_Camera() - cam.setPos(0, -2.0F, 0) - Return cam - End Function - End Class -End Namespace diff --git a/trunk/managed/Warp3D/Warp3DVB/warp_Color.vb b/trunk/managed/Warp3D/Warp3DVB/warp_Color.vb deleted file mode 100644 index c54c610b..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/warp_Color.vb +++ /dev/null @@ -1,192 +0,0 @@ -' Created by: X -' http://www.createdbyx.com/ -' ---------------------- -' C# to VB.NET conversion of this code was done by hand and with the assistance of the -' Convert C# to VB .NET application availible at http://www.kamalpatel.net/ConvertCSharp2VB.aspx -' ConvertCSharp2VB utility was developed by: Kamal Patel (http://www.KamalPatel.net) -' ---------------------- -' Thanks to Alan Simes ( http://alansimes.blogdns.net/ ) for creating the Warp3D library. -' http://alansimes.blogdns.net/cs/files/default.aspx -' ---------------------- - -Imports System - -Namespace Rednettle.Warp3D - '/ - '/ Summary description for warp_Color. - '/ - Public Class warp_Color - Public Shared ALPHA As Integer = &HFF000000 ' alpha mask - Public Shared RED As Integer = &HFF0000 ' red mask - Public Shared GREEN As Integer = &HFF00 ' green mask - Public Shared BLUE As Integer = &HFF ' blue mask - Public Shared MASK7Bit As Integer = &HFEFEFF ' mask for additive/subtractive shading - Public Shared MASK6Bit As Integer = &HFCFCFC ' mask for additive/subtractive shading - Public Shared RGB As Integer = &HFFFFFF ' rgb mask - - Private Shared pixel As Integer, color As Integer, overflow As Integer, colorscale As Integer, r As Integer, g As Integer, b As Integer - - Private Sub New() - End Sub - - Public Shared Function random(ByVal color As Integer, ByVal delta As Integer) As Integer - Dim rnd As Random = New Random() - - Dim r As Integer = (color >> 16) And 255 - Dim g As Integer = (color >> 8) And 255 - Dim b As Integer = color And 255 - - r = CInt(r + (rnd.NextDouble() * delta)) - g = CInt(g + (rnd.NextDouble() * delta)) - b = CInt(b + (rnd.NextDouble() * delta)) - - Return getCropColor(r, g, b) - End Function - - Public Shared Function random() As Integer - Dim rnd As Random = New Random() - Return CInt((rnd.NextDouble() * 16777216)) - End Function - - Public Shared Function getRed(ByVal c As Integer) As Integer - Return (c And RED) >> 16 - End Function - - Public Shared Function getGreen(ByVal c As Integer) As Integer - Return (c And GREEN) >> 8 - End Function - - Public Shared Function getBlue(ByVal c As Integer) As Integer - Return c And BLUE - End Function - - Public Shared Function makeGradient(ByVal colors() As Integer, ByVal size As Integer) As Integer() - Dim pal(size - 1) As Integer ' = New Integer(size) {} - Dim c1 As Integer, c2 As Integer, pos1 As Integer, pos2 As Integer, range As Integer - Dim r As Integer, g As Integer, b As Integer, r1 As Integer, g1 As Integer, b1 As Integer, r2 As Integer, g2 As Integer, b2 As Integer, dr As Integer, dg As Integer, db As Integer - If colors.GetLength(0) = 1 Then - c1 = colors(0) - - For i As Integer = 0 To size - 1 'Step i + 1 - pal(i) = c1 - Next - Return pal - End If - - - For c As Integer = 0 To colors.GetLength(0) - 2 ' Step c + 1 - c1 = colors(c) - c2 = colors(c + 1) - pos1 = size * c \ (colors.GetLength(0) - 1) - pos2 = size * (c + 1) \ (colors.GetLength(0) - 1) - range = pos2 - pos1 - r1 = warp_Color.getRed(c1) << 16 - g1 = warp_Color.getGreen(c1) << 16 - b1 = warp_Color.getBlue(c1) << 16 - r2 = warp_Color.getRed(c2) << 16 - g2 = warp_Color.getGreen(c2) << 16 - b2 = warp_Color.getBlue(c2) << 16 - dr = (r2 - r1) \ range - dg = (g2 - g1) \ range - db = (b2 - b1) \ range - r = r1 - g = g1 - b = b1 - - For i As Integer = pos1 To pos2 - 1 'Step i + 1 - pal(i) = getColor(r >> 16, g >> 16, b >> 16) - r += dr - g += dg - b += db - Next - Next - - Return pal - End Function - - Public Shared Function add(ByVal color1 As Integer, ByVal color2 As Integer) As Integer - pixel = (color1 And MASK7Bit) + (color2 And MASK7Bit) - overflow = pixel And &H1010100 - overflow = overflow - (overflow >> 8) - - Return ALPHA Or overflow Or pixel - End Function - - ' TOTO: Make sure using xor works properly xor replaces C# ~ operator - Public Shared Function [sub](ByVal color1 As Integer, ByVal color2 As Integer) As Integer - pixel = (color1 And MASK7Bit) + ((color2 Xor color2) And MASK7Bit) - overflow = (pixel Xor pixel) And &H1010100 - overflow = overflow - (overflow >> 8) - Return ALPHA Or ((overflow Xor overflow) And pixel) - End Function - - Public Shared Function subneg(ByVal color1 As Integer, ByVal color2 As Integer) As Integer - pixel = (color1 And MASK7Bit) + (color2 And MASK7Bit) - overflow = (pixel Xor pixel) And &H1010100 - overflow = overflow - (overflow >> 8) - Return ALPHA Or ((overflow Xor overflow) And pixel) - End Function - - Public Shared Function inv(ByVal color As Integer) As Integer - Return ALPHA Or (color Xor color) - End Function - - Public Shared Function mix(ByVal color1 As Integer, ByVal color2 As Integer) As Integer - ' Returns the averidge color from 2 colors - Return ALPHA Or (((color1 And MASK7Bit) >> 1) + ((color2 And MASK7Bit) >> 1)) - End Function - - Public Shared Function scale(ByVal color As Integer, ByVal factor As Integer) As Integer - If factor = 0 Then Return 0 - If factor = 255 Then Return color - If factor = 127 Then Return (color And &HFEFEFE) >> 1 - - r = (((color >> 16) And 255) * factor) >> 8 - g = (((color >> 8) And 255) * factor) >> 8 - b = ((color And 255) * factor) >> 8 - Return ALPHA Or (r << 16) Or (g << 8) Or b - End Function - - Public Shared Function multiply(ByVal color1 As Integer, ByVal color2 As Integer) As Integer - If (color1 And RGB) = 0 Then Return 0 - If (color2 And RGB) = 0 Then Return 0 - r = (((color1 >> 16) And 255) * ((color2 >> 16) And 255)) >> 8 - g = (((color1 >> 8) And 255) * ((color2 >> 8) And 255)) >> 8 - b = ((color1 And 255) * (color2 And 255)) >> 8 - Return ALPHA Or (r << 16) Or (g << 8) Or b - End Function - - Public Shared Function transparency(ByVal bkgrd As Integer, ByVal color As Integer, ByVal alpha As Integer) As Integer - If alpha = 0 Then Return color - If alpha = 255 Then Return bkgrd - If alpha = 127 Then Return mix(bkgrd, color) - - r = (alpha * (((bkgrd >> 16) And 255) - ((color >> 16) And 255)) >> 8) + ((color >> 16) And 255) - g = (alpha * (((bkgrd >> 8) And 255) - ((color >> 8) And 255)) >> 8) + ((color >> 8) And 255) - b = (alpha * ((bkgrd And 255) - (color And 255)) >> 8) + (color And 255) - - Return alpha Or (r << 16) Or (g << 8) Or b - End Function - - Public Shared Function getCropColor(ByVal r As Integer, ByVal g As Integer, ByVal b As Integer) As Integer - Return ALPHA Or (warp_Math.crop(r, 0, 255) << 16) Or (warp_Math.crop(g, 0, 255) << 8) Or warp_Math.crop(b, 0, 255) - End Function - - - Public Shared Function getColor(ByVal r As Integer, ByVal g As Integer, ByVal b As Integer) As Integer - Return ALPHA Or (r << 16) Or (g << 8) Or b - End Function - - Public Shared Function getGray(ByVal color As Integer) As Integer - Dim r As Integer = ((color And RED) >> 16) - Dim g As Integer = ((color And GREEN) >> 8) - Dim b As Integer = (color And BLUE) - Dim Y As Integer = CInt((r * 3 + g * 6 + b) / 10) - Return ALPHA Or (Y << 16) Or (Y << 8) Or Y - End Function - - Public Shared Function getAverage(ByVal color As Integer) As Integer - Return (((color And RED) >> 16) + ((color And GREEN) >> 8) + (color And BLUE)) \ 3 - End Function - End Class -End Namespace diff --git a/trunk/managed/Warp3D/Warp3DVB/warp_CoreObject.vb b/trunk/managed/Warp3D/Warp3DVB/warp_CoreObject.vb deleted file mode 100644 index b0754167..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/warp_CoreObject.vb +++ /dev/null @@ -1,106 +0,0 @@ -' Created by: X -' http://www.createdbyx.com/ -' ---------------------- -' C# to VB.NET conversion of this code was done by hand and with the assistance of the -' Convert C# to VB .NET application availible at http://www.kamalpatel.net/ConvertCSharp2VB.aspx -' ConvertCSharp2VB utility was developed by: Kamal Patel (http://www.KamalPatel.net) -' ---------------------- -' Thanks to Alan Simes ( http://alansimes.blogdns.net/ ) for creating the Warp3D library. -' http://alansimes.blogdns.net/cs/files/default.aspx -' ---------------------- - -Imports System - -Namespace Rednettle.Warp3D - '/ - '/ Summary description for warp_CoreObject. - '/ - '/ - - Public Class warp_CoreObject - Public matrix As New warp_Matrix ' = New warp_Matrix() - Public normalmatrix As New warp_Matrix '= New warp_Matrix() - - Public Sub transform(ByVal m As warp_Matrix) - matrix.transform(m) - normalmatrix.transform(m) - End Sub - - Public Sub shift(ByVal dx As Single, ByVal dy As Single, ByVal dz As Single) - matrix.shift(dx, dy, dz) - End Sub - - Public Sub shift(ByVal v As warp_Vector) - matrix.shift(v.x, v.y, v.z) - End Sub - - Public Sub scale(ByVal d As Single) - matrix.scale(d) - End Sub - - Public Sub scale(ByVal dx As Single, ByVal dy As Single, ByVal dz As Single) - matrix.scale(dx, dy, dz) - End Sub - - Public Sub scaleSelf(ByVal d As Single) - matrix.scaleSelf(d) - End Sub - - Public Sub scaleSelf(ByVal dx As Single, ByVal dy As Single, ByVal dz As Single) - matrix.scaleSelf(dx, dy, dz) - End Sub - - Public Sub rotate(ByVal d As warp_Vector) - rotateSelf(d.x, d.y, d.z) - End Sub - - Public Sub rotateSelf(ByVal d As warp_Vector) - rotateSelf(d.x, d.y, d.z) - End Sub - - Public Sub rotate(ByVal dx As Single, ByVal dy As Single, ByVal dz As Single) - matrix.rotate(dx, dy, dz) - normalmatrix.rotate(dx, dy, dz) - End Sub - - Public Sub rotate(ByVal quat As warp_Quaternion, ByVal x As Single, ByVal y As Single, ByVal z As Single) - matrix.rotate(quat, x, y, z) - normalmatrix.rotate(quat, x, y, z) - End Sub - - Public Sub rotate(ByVal m As warp_Matrix) - matrix.rotate(m) - normalmatrix.rotate(m) - End Sub - - - Public Sub rotateSelf(ByVal dx As Single, ByVal dy As Single, ByVal dz As Single) - matrix.rotateSelf(dx, dy, dz) - normalmatrix.rotateSelf(dx, dy, dz) - End Sub - - Public Sub rotateSelf(ByVal quat As warp_Quaternion) - matrix.rotateSelf(quat) - normalmatrix.rotateSelf(quat) - End Sub - - Public Sub rotateSelf(ByVal m As warp_Matrix) - matrix.rotateSelf(m) - normalmatrix.rotateSelf(m) - End Sub - - Public Sub setPos(ByVal x As Single, ByVal y As Single, ByVal z As Single) - matrix.m03 = x - matrix.m13 = y - matrix.m23 = z - End Sub - - Public Sub setPos(ByVal v As warp_Vector) - setPos(v.x, v.y, v.z) - End Sub - - Public Function getPos() As warp_Vector - Return New warp_Vector(matrix.m03, matrix.m13, matrix.m23) - End Function - End Class -End Namespace diff --git a/trunk/managed/Warp3D/Warp3DVB/warp_Edge.vb b/trunk/managed/Warp3D/Warp3DVB/warp_Edge.vb deleted file mode 100644 index cb22fbf8..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/warp_Edge.vb +++ /dev/null @@ -1,38 +0,0 @@ -' Created by: X -' http://www.createdbyx.com/ -' ---------------------- -' C# to VB.NET conversion of this code was done by hand and with the assistance of the -' Convert C# to VB .NET application availible at http://www.kamalpatel.net/ConvertCSharp2VB.aspx -' ConvertCSharp2VB utility was developed by: Kamal Patel (http://www.KamalPatel.net) -' ---------------------- -' Thanks to Alan Simes ( http://alansimes.blogdns.net/ ) for creating the Warp3D library. -' http://alansimes.blogdns.net/cs/files/default.aspx -' ---------------------- - -Imports System - -Namespace Rednettle.Warp3D - '/ - '/ Summary description for warp_Edge. - '/ - '/ - Public Class warp_Edge - Dim a As warp_Vertex, b As warp_Vertex - - Public Sub New() - End Sub - - Public Sub New(ByVal v1 As warp_Vertex, ByVal v2 As warp_Vertex) - a = v1 - b = v2 - End Sub - - Public Function start() As warp_Vertex - Return a - End Function - - Public Function [end]() As warp_Vertex - Return b - End Function - End Class -End Namespace \ No newline at end of file diff --git a/trunk/managed/Warp3D/Warp3DVB/warp_Environment.vb b/trunk/managed/Warp3D/Warp3DVB/warp_Environment.vb deleted file mode 100644 index 384631f8..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/warp_Environment.vb +++ /dev/null @@ -1,30 +0,0 @@ -' Created by: X -' http://www.createdbyx.com/ -' ---------------------- -' C# to VB.NET conversion of this code was done by hand and with the assistance of the -' Convert C# to VB .NET application availible at http://www.kamalpatel.net/ConvertCSharp2VB.aspx -' ConvertCSharp2VB utility was developed by: Kamal Patel (http://www.KamalPatel.net) -' ---------------------- -' Thanks to Alan Simes ( http://alansimes.blogdns.net/ ) for creating the Warp3D library. -' http://alansimes.blogdns.net/cs/files/default.aspx -' ---------------------- - -Imports System - -Namespace Rednettle.Warp3D - '/ - '/ Summary description for warp_Environment. - '/ - Public Class warp_Environment - Public ambient As Integer = 0 - Public fogcolor As Integer = 0 - Public fogfact As Integer = 0 - Public bgcolor As Integer = &HFFFFFFFF - - Public background As warp_Texture = Nothing - - Public Sub setBackground(ByVal t As warp_Texture) - background = t - End Sub - End Class -End Namespace \ No newline at end of file diff --git a/trunk/managed/Warp3D/Warp3DVB/warp_FXLensFlare.vb b/trunk/managed/Warp3D/Warp3DVB/warp_FXLensFlare.vb deleted file mode 100644 index c47b793f..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/warp_FXLensFlare.vb +++ /dev/null @@ -1,330 +0,0 @@ -' Created by: X -' http://www.createdbyx.com/ -' ---------------------- -' C# to VB.NET conversion of this code was done by hand and with the assistance of the -' Convert C# to VB .NET application availible at http://www.kamalpatel.net/ConvertCSharp2VB.aspx -' ConvertCSharp2VB utility was developed by: Kamal Patel (http://www.KamalPatel.net) -' ---------------------- -' Thanks to Alan Simes ( http://alansimes.blogdns.net/ ) for creating the Warp3D library. -' http://alansimes.blogdns.net/cs/files/default.aspx -' ---------------------- - -Imports System -Imports System.Collections.Generic -Imports System.Text - -Namespace Rednettle.Warp3D - Public Class warp_FXLensFlare - Inherits warp_FXPlugin - Public flareObject As warp_Object - - Private flares As Integer = 0 - Private zBufferSensitive As Boolean = True - Private flare() As warp_Texture - Private flareDist() As Single - - Private Sub New(ByVal scene As warp_Scene) - MyBase.New(scene) - End Sub - - Public Sub New(ByVal name As String, ByVal scene As warp_Scene, ByVal zBufferSensitive As Boolean) - MyBase.New(scene) - Me.zBufferSensitive = zBufferSensitive - - flareObject = New warp_Object() - flareObject.addVertex(New warp_Vertex(1.0F, 1.0F, 1.0F)) - flareObject.rebuild() - - scene.addObject(name, flareObject) - End Sub - - Public Sub preset1() - clear() - - addGlow(144, &H330099) - addStrike(320, 48, &H3366) - addStrike(48, 240, &H660033) - addRing(120, &H660000) - addRays(320, 32, 20, &H111111) - addSecs(12, 100, 64, &H6633CC, 64) - End Sub - - Public Sub preset2() - clear() - addGlow(144, &H995500) - addStrike(640, 64, &HCC0000) - addStrike(32, 480, &HFF) - addStrike(64, 329, &H330099) - addRing(160, &H990000) - addRays(320, 24, 32, &H332211) - addSecs(12, 100, 64, &H333333, 100) - addSecs(12, 60, 40, &H336699, 80) - End Sub - - Public Sub preset3() - clear() - addGlow(144, &H993322) - addStrike(400, 200, &HCC00FF) - addStrike(480, 32, &HFF) - addRing(180, &H990000) - addRays(240, 32, 48, &H332200) - addSecs(12, 80, 64, &H555555, 50) - addSecs(12, 60, 40, &H336699, 80) - End Sub - - Public Sub setPos(ByVal pos As warp_Vector) - flareObject.fastvertex(0).pos = pos - End Sub - - Public Sub clear() - flares = 0 - flare = Nothing - flareDist = Nothing - End Sub - - Public Sub addGlow(ByVal size As Integer, ByVal color As Integer) - addFlare(createGlow(size, size, color, 256), 0.0F) - End Sub - - Public Sub addStrike(ByVal width As Integer, ByVal height As Integer, ByVal color As Integer) - addFlare(createGlow(width, height, color, 48), 0.0F) - End Sub - - Public Sub addRing(ByVal size As Integer, ByVal color As Integer) - addFlare(createRing(size, color), 0.0F) - End Sub - - Public Sub addRays(ByVal size As Integer, ByVal num As Integer, ByVal rad As Integer, ByVal color As Integer) - addFlare(createRays(size, num, rad, color), 0.0F) - End Sub - - Public Sub addSecs(ByVal count As Integer, ByVal averidgeSize As Integer, ByVal sizeDelta As Integer, ByVal averidgeColor As Integer, ByVal colorDelta As Integer) - For i As Integer = 0 To count - 1 'Step i + 1 - addFlare(createSec(averidgeSize, sizeDelta, averidgeColor, colorDelta), warp_Math.random(-0.5F, 3.0F)) - Next - End Sub - - - Public Overrides Sub apply() - Dim px As Integer = flareObject.fastvertex(0).x - Dim py As Integer = flareObject.fastvertex(0).y - - If Not flareObject.fastvertex(0).visible Then Exit Sub - If zBufferSensitive AndAlso (flareObject.fastvertex(0).z > scene.renderPipeline.zBuffer(px + py * screen.width)) Then Exit Sub - - Dim cx As Integer = screen.width \ 2 - Dim cy As Integer = screen.height \ 2 - - Dim dx As Single = (cx - px) - Dim dy As Single = (cy - py) - Dim posx As Integer, posy As Integer, xsize As Integer, ysize As Integer - Dim zoom As Single - - Dim i As Integer - For i = 0 To flares - 1 'Step i + 1 - zoom = warp_Math.pythagoras(dx, dy) / warp_Math.pythagoras(cx, cy) - zoom = (1 - zoom) / 2 + 1 - xsize = flare(i).width - ysize = flare(i).height - posx = CInt(px + (dx * flareDist(i))) - posy = CInt(py + (dy * flareDist(i))) - - screen.add(flare(i), posx - xsize \ 2, posy - ysize \ 2, xsize, ysize) - Next - End Sub - - Private Sub addFlare(ByVal texture As warp_Texture, ByVal relPos As Single) - flares = flares + 1 - - If flares = 1 Then - flare = New warp_Texture(1) {} - flareDist = New Single(1) {} - Else - Dim temp1() As warp_Texture = New warp_Texture(flares - 1) {} - System.Array.Copy(flare, 0, temp1, 0, flares - 1) - flare = temp1 - - Dim temp2() As Single = New Single(flares - 1) {} - System.Array.Copy(flareDist, 0, temp2, 0, flares - 1) - flareDist = temp2 - End If - - flare(flares - 1) = texture - flareDist(flares - 1) = relPos - End Sub - - Private Function createRadialTexture(ByVal w As Integer, ByVal h As Integer, ByVal colormap() As Integer, ByVal alphamap() As Integer) As warp_Texture - Dim offset As Integer - Dim relX As Single, relY As Single - Dim NewTexture As warp_Texture = New warp_Texture(w, h) - Dim palette() As Integer = getPalette(colormap, alphamap) - - For y As Integer = h - 1 To 0 Step -1 - offset = y * w - - For x As Integer = w - 1 To 0 Step -1 - relX = CSng((x - (w >> 1)) / (w >> 1)) - relY = CSng((y - (h >> 1)) / (h >> 1)) - NewTexture.pixel(offset + x) = palette(warp_Math.crop(CInt(255 * Math.Sqrt(relX * relX + relY * relY)), 0, 255)) - Next - Next - - Return NewTexture - End Function - - Private Function getPalette(ByVal color() As Integer, ByVal alpha() As Integer) As Integer() - Dim r As Integer, g As Integer, b As Integer - Dim palette(255) As Integer '= New Integer(255) {} - - For i As Integer = 255 To 0 Step -1 - r = (((color(i) >> 16) And 255) * alpha(i)) >> 8 - g = (((color(i) >> 8) And 255) * alpha(i)) >> 8 - b = ((color(i) And 255) * alpha(i)) >> 8 - palette(i) = warp_Color.getColor(r, g, b) - Next - Return palette - End Function - - Private Function createGlow(ByVal w As Integer, ByVal h As Integer, ByVal color As Integer, ByVal alpha As Integer) As warp_Texture - Return createRadialTexture(w, h, getGlowPalette(color), getConstantAlpha(alpha)) - End Function - - Private Function createRing(ByVal size As Integer, ByVal color As Integer) As warp_Texture - Return createRadialTexture(size, size, getColorPalette(color, color), getRingAlpha(40)) - End Function - - Private Function createSec(ByVal size As Integer, ByVal sizedelta As Integer, ByVal color As Integer, ByVal colordelta As Integer) As warp_Texture - Dim s As Integer = CInt(warp_Math.randomWithDelta(size, sizedelta)) - Dim c1 As Integer = warp_Color.random(color, colordelta) - Dim c2 As Integer = warp_Color.random(color, colordelta) - Return createRadialTexture(s, s, getColorPalette(c1, c2), getSecAlpha()) - End Function - - Private Function createRays(ByVal size As Integer, ByVal rays As Integer, ByVal rad As Integer, ByVal color As Integer) As warp_Texture - Dim pos As Integer - Dim relPos As Single - Dim texture As warp_Texture = New warp_Texture(size, size) - Dim radialMap(1023) As Integer '= New Integer(1023) {} - warp_Math.clearBuffer(radialMap, 0) - - - For i As Integer = 0 To rays - 1 'Step i + 1 - pos = CInt(warp_Math.random(rad, 1023 - rad)) - - For k As Integer = pos - rad To pos + rad 'Step k + 1 - relPos = (k - pos + rad) / (rad * 2.0F) - radialMap(k) = CInt(radialMap(k) + (255 * (1 + Math.Sin((relPos - 0.25) * 3.14159 * 2)) / 2)) - Next - Next - - Dim angle As Integer, offset As Integer, reldist As Integer - Dim xrel As Single, yrel As Single - Dim y As Integer - For y = size - 1 To 0 Step -1 - offset = y * size - Dim x As Integer - For x = size - 1 To 0 Step -1 - xrel = (2.0F * x - size) / size - yrel = (2.0F * y - size) / size - angle = CInt(1023 * Math.Atan2(xrel, yrel) / 3.14159 / 2) And 1023 - reldist = CInt(Math.Max((255 - 255 * warp_Math.pythagoras(xrel, yrel)), 0)) - texture.pixel(x + offset) = warp_Color.scale(color, radialMap(angle) * reldist \ 255) - Next - Next - - Return texture - End Function - - Private Function getGlowPalette(ByVal color As Integer) As Integer() - Dim r As Integer, g As Integer, b As Integer - Dim relDist As Single, diffuse As Single, specular As Single - Dim palette(255) As Integer '= New Integer(256) {} - Dim cr As Integer = (color >> 16) And 255 - Dim cg As Integer = (color >> 8) And 255 - Dim cb As Integer = color And 255 - Dim i As Integer - For i = 255 To 0 Step -1 - relDist = i / 255.0F - diffuse = CSng(Math.Cos(relDist * 1.57)) - specular = CSng((255 / Math.Pow(2.718, relDist * 2.718) - i / 16)) - r = CInt((cr * diffuse + specular)) - g = CInt((cg * diffuse + specular)) - b = CInt((cb * diffuse + specular)) - palette(i) = warp_Color.getCropColor(r, g, b) - Next - - Return palette - End Function - - Private Function getConstantAlpha(ByVal alpha As Integer) As Integer() - Dim alphaPalette(255) As Integer '= New Integer(256) {} - - For i As Integer = 255 To 0 Step -1 - alphaPalette(i) = alpha - Next - Return alphaPalette - End Function - - Private Function getLinearAlpha() As Integer() - Dim alphaPalette(255) As Integer '= New Integer(256) {} - - For i As Integer = 255 To 0 Step -1 - alphaPalette(i) = 255 - i - Next - - Return alphaPalette - End Function - - Private Function getRingAlpha(ByVal ringsize As Integer) As Integer() - Dim alphaPalette(255) As Integer ' = New Integer(256) {} - Dim angle As Single - - 'For i As Integer = 0 To 256 - 1 ' Step i + 1 - ' alphaPalette(i) = 0 - 'Next - - For i As Integer = 0 To ringsize - 1 'Step i + 1 - angle = 3.14159F / 180 * (180.0F * i / ringsize) - alphaPalette(255 - ringsize + i) = CInt((64 * Math.Sin(angle))) - Next - Return alphaPalette - End Function - - Private Function getSecAlpha() As Integer() - Dim alphaPalette() As Integer = getRingAlpha(CInt(warp_Math.random(0, 255))) - - For i As Integer = 0 To 255 '6 - 1 Step i + 1 - alphaPalette(i) = (alphaPalette(i) + 255 - i) >> 2 - Next - - Return alphaPalette - End Function - - - Private Function getColorPalette(ByVal color1 As Integer, ByVal color2 As Integer) As Integer() - Dim palette() As Integer = New Integer(256) {} - - Dim r1 As Integer = (color1 >> 16) And 255 - Dim g1 As Integer = (color1 >> 8) And 255 - Dim b1 As Integer = color1 And 255 - Dim r2 As Integer = (color2 >> 16) And 255 - Dim g2 As Integer = (color2 >> 8) And 255 - Dim b2 As Integer = color2 And 255 - Dim dr As Integer = r2 - r1 - Dim dg As Integer = g2 - g1 - Dim db As Integer = b2 - b1 - Dim r As Integer = r1 << 8 - Dim g As Integer = g1 << 8 - Dim b As Integer = b1 << 8 - - - For i As Integer = 0 To 255 '6 - 1 Step i + 1 - palette(i) = warp_Color.getColor(r >> 8, g >> 8, b >> 8) - r += dr - g += dg - b += db - Next - Return palette - End Function - End Class -End Namespace \ No newline at end of file diff --git a/trunk/managed/Warp3D/Warp3DVB/warp_FXPlugin.vb b/trunk/managed/Warp3D/Warp3DVB/warp_FXPlugin.vb deleted file mode 100644 index 87969dcc..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/warp_FXPlugin.vb +++ /dev/null @@ -1,29 +0,0 @@ -' Created by: X -' http://www.createdbyx.com/ -' ---------------------- -' C# to VB.NET conversion of this code was done by hand and with the assistance of the -' Convert C# to VB .NET application availible at http://www.kamalpatel.net/ConvertCSharp2VB.aspx -' ConvertCSharp2VB utility was developed by: Kamal Patel (http://www.KamalPatel.net) -' ---------------------- -' Thanks to Alan Simes ( http://alansimes.blogdns.net/ ) for creating the Warp3D library. -' http://alansimes.blogdns.net/cs/files/default.aspx -' ---------------------- - -Imports System -Imports System.Collections.Generic -Imports System.Text - -Namespace Rednettle.Warp3D - Public MustInherit Class warp_FXPlugin - Public scene As warp_Scene = Nothing - Public screen As warp_Screen = Nothing - - Public Sub New(ByVal scene As warp_Scene) - Me.scene = scene - screen = scene.renderPipeline.screen - End Sub - - Public MustOverride Sub apply() - - End Class -End Namespace \ No newline at end of file diff --git a/trunk/managed/Warp3D/Warp3DVB/warp_Light.vb b/trunk/managed/Warp3D/Warp3DVB/warp_Light.vb deleted file mode 100644 index 7dcb1444..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/warp_Light.vb +++ /dev/null @@ -1,68 +0,0 @@ -' Created by: X -' http://www.createdbyx.com/ -' ---------------------- -' C# to VB.NET conversion of this code was done by hand and with the assistance of the -' Convert C# to VB .NET application availible at http://www.kamalpatel.net/ConvertCSharp2VB.aspx -' ConvertCSharp2VB utility was developed by: Kamal Patel (http://www.KamalPatel.net) -' ---------------------- -' Thanks to Alan Simes ( http://alansimes.blogdns.net/ ) for creating the Warp3D library. -' http://alansimes.blogdns.net/cs/files/default.aspx -' ---------------------- - -Imports System - -Namespace Rednettle.Warp3D - '/ - '/ Summary description for warp_Light. - '/ - Public Class warp_Light - ' F I E L D S - - Public v As warp_Vector 'Light direction() - Public v2 As warp_Vector 'projected Light direction - Public diffuse As Integer = 0 - Public specular As Integer = 0 - Public highlightSheen As Integer = 0 - Public highlightSpread As Integer = 0 - - Dim matrix2 As warp_Matrix - - Private Sub New() - End Sub - - Public Sub New(ByVal direction As warp_Vector) - v = direction.getClone() - v.normalize() - End Sub - - Public Sub New(ByVal direction As warp_Vector, ByVal diffuse As Integer) - v = direction.getClone() - v.normalize() - Me.diffuse = diffuse - End Sub - - Public Sub New(ByVal direction As warp_Vector, ByVal color As Integer, ByVal highlightSheen As Integer, ByVal highlightSpread As Integer) - v = direction.getClone() - v.normalize() - Me.diffuse = color - Me.specular = color - Me.highlightSheen = highlightSheen - Me.highlightSpread = highlightSpread - End Sub - - Public Sub New(ByVal direction As warp_Vector, ByVal diffuse As Integer, ByVal specular As Integer, ByVal highlightSheen As Integer, ByVal highlightSpread As Integer) - v = direction.getClone() - v.normalize() - Me.diffuse = diffuse - Me.specular = specular - Me.highlightSheen = highlightSheen - Me.highlightSpread = highlightSpread - End Sub - - Public Sub project(ByVal m As warp_Matrix) - matrix2 = m.getClone() - matrix2.transform(m) - v2 = v.transform(matrix2) - End Sub - End Class -End Namespace \ No newline at end of file diff --git a/trunk/managed/Warp3D/Warp3DVB/warp_Lightmap.vb b/trunk/managed/Warp3D/Warp3DVB/warp_Lightmap.vb deleted file mode 100644 index 7110ec0e..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/warp_Lightmap.vb +++ /dev/null @@ -1,98 +0,0 @@ -' Created by: X -' http://www.createdbyx.com/ -' ---------------------- -' C# to VB.NET conversion of this code was done by hand and with the assistance of the -' Convert C# to VB .NET application availible at http://www.kamalpatel.net/ConvertCSharp2VB.aspx -' ConvertCSharp2VB utility was developed by: Kamal Patel (http://www.KamalPatel.net) -' ---------------------- -' Thanks to Alan Simes ( http://alansimes.blogdns.net/ ) for creating the Warp3D library. -' http://alansimes.blogdns.net/cs/files/default.aspx -' ---------------------- - -Imports System - -Namespace Rednettle.Warp3D - '/ - '/ Summary description for warp_Lightmap. - '/ - Public Class warp_Lightmap - Public diffuse() As Integer = New Integer(65535) {} - Public specular() As Integer = New Integer(65535) {} - Private sphere() As Single = New Single(65535) {} - Private light() As warp_Light - Private lights As Integer - Private ambient As Integer - Private temp As Integer, overflow As Integer, color As Integer, pos As Integer, r As Integer, g As Integer, b As Integer - - Public Sub New(ByVal scene As warp_Scene) - scene.rebuild() - - light = scene.light - lights = scene.lights - ambient = scene.environment.ambient - - buildSphereMap() - rebuildLightmap() - End Sub - - Private Sub buildSphereMap() - Dim fnx As Single, fny As Single, fnz As Single - Dim pos As Integer - Dim ny As Integer - For ny = -128 To 128 - 1 ' Step ny + 1 - fny = ny / 128.0F - Dim nx As Integer - For nx = -128 To 128 - 1 'Step nx + 1 - pos = nx + 128 + ((ny + 128) << 8) - fnx = nx / 128.0F - fnz = CSng(1 - Math.Sqrt(fnx * fnx + fny * fny)) - If fnz > 0 Then sphere(pos) = fnz Else sphere(pos) = 0 - Next - Next - End Sub - - Public Sub rebuildLightmap() - ' System.Console.WriteLine(">> Rebuilding Light Map ... [" + lights + " light sources]") - Dim l As warp_Vector - Dim fnx As Single, fny As Single, phongfact As Single, sheen As Single, spread As Single - Dim diffuse As Integer, specular As Integer, cos As Integer, dr As Integer, dg As Integer, db As Integer, sr As Integer, sg As Integer, sb As Integer - Dim ny As Integer - For ny = -128 To 128 - 1 'Step ny + 1 - fny = ny / 128.0F - Dim nx As Integer - For nx = -128 To 128 - 1 'Step nx + 1 - pos = nx + 128 + ((ny + 128) << 8) - fnx = nx / 128.0F - sr = 0 - sg = 0 - sb = 0 - - dr = warp_Color.getRed(ambient) - dg = warp_Color.getGreen(ambient) - db = warp_Color.getBlue(ambient) - - Dim i As Integer - For i = 0 To lights - 1 'Step i + 1 - l = light(i).v - diffuse = light(i).diffuse - specular = light(i).specular - sheen = light(i).highlightSheen / 255.0F - spread = CSng(light(i).highlightSpread / 4096) - If spread < 0.01F Then spread = 0.01F 'else spread = spread - cos = CInt((255 * warp_Vector.angle(light(i).v, New warp_Vector(fnx, fny, sphere(pos))))) - If cos <= 0 Then cos = 0 - dr += (warp_Color.getRed(diffuse) * cos) >> 8 - dg += (warp_Color.getGreen(diffuse) * cos) >> 8 - db += (warp_Color.getBlue(diffuse) * cos) >> 8 - phongfact = CSng(sheen * Math.Pow(cos / 255.0F, 1 / spread)) - sr = CInt(sr + warp_Color.getRed(specular) * phongfact) - sg = CInt(sg + warp_Color.getGreen(specular) * phongfact) - sb = CInt(sb + warp_Color.getBlue(specular) * phongfact) - Next - Me.diffuse(pos) = warp_Color.getCropColor(dr, dg, db) - Me.specular(pos) = warp_Color.getCropColor(sr, sg, sb) - Next - Next - End Sub - End Class -End Namespace \ No newline at end of file diff --git a/trunk/managed/Warp3D/Warp3DVB/warp_Material.vb b/trunk/managed/Warp3D/Warp3DVB/warp_Material.vb deleted file mode 100644 index 77b5bf16..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/warp_Material.vb +++ /dev/null @@ -1,224 +0,0 @@ -' Created by: X -' http://www.createdbyx.com/ -' ---------------------- -' C# to VB.NET conversion of this code was done by hand and with the assistance of the -' Convert C# to VB .NET application availible at http://www.kamalpatel.net/ConvertCSharp2VB.aspx -' ConvertCSharp2VB utility was developed by: Kamal Patel (http://www.KamalPatel.net) -' ---------------------- -' Thanks to Alan Simes ( http://alansimes.blogdns.net/ ) for creating the Warp3D library. -' http://alansimes.blogdns.net/cs/files/default.aspx -' ---------------------- - -Imports System -Imports System.Drawing -Imports System.IO - -Namespace Rednettle.Warp3D - '/ - '/ Summary description for warp_Material. - '/ - Public Class warp_Material - Public color As Integer = 0 - Public transparency As Integer = 0 - Public reflectivity As Integer = 255 - Public type As Integer = 0 - Public texture As warp_Texture = Nothing - Public envmap As warp_Texture = Nothing - Public flat As Boolean = False - Public wireframe As Boolean = False - Public opaque As Boolean = True - Public texturePath As String = Nothing - Public envmapPath As String = Nothing - Public textureSettings As warp_TextureSettings = Nothing - Public envmapSettings As warp_TextureSettings = Nothing - Public rwx As Double = 500.0 - Public rwy As Double = 500.0 - Public pt As Point = New Point(0, 0) - Public offset As Integer = 0 - - Public Sub New() - ' - ' TODO: Add constructor logic here - ' - End Sub - - Public Sub New(ByVal color As Integer) - setColor(color) - End Sub - - Public Sub New(ByVal t As warp_Texture) - setTexture(t) - reflectivity = 255 - End Sub - - Public Sub New(ByVal path As String) - - - Dim fs As FileStream = New FileStream(Path, FileMode.Open) - Dim br As BinaryReader = New BinaryReader(fs) - - importFromStream(br) - End Sub - - - Private Sub importFromStream(ByVal inStream As BinaryReader) - readSettings(inStream) - readTexture(inStream, True) - readTexture(inStream, False) - End Sub - - Private Sub readSettings(ByVal inStream As BinaryReader) - setColor(readInt(inStream)) - setTransparency(inStream.ReadByte()) - setReflectivity(inStream.ReadByte()) - setFlat(inStream.ReadBoolean()) - End Sub - - - Private Function readInt(ByVal inStream As BinaryReader) As Integer - Return (inStream.ReadByte() << 24) Or (inStream.ReadByte() << 16) Or (inStream.ReadByte() << 8) Or inStream.ReadByte() - End Function - - Private Function readString(ByVal inStream As BinaryReader) As String - Dim result As String = "" - Dim inByte As Byte - inByte = inStream.ReadByte() - While inByte <> 60 - result &= inByte - inByte = inStream.ReadByte() - End While - - Return result - End Function - - - - Private Sub readTexture(ByVal inStream As BinaryReader, ByVal textureId As Boolean) - Dim t As warp_Texture = Nothing - Dim id As Integer = inStream.ReadSByte() - If id = 1 Then - t = New warp_Texture("c:/source/warp3d/materials/skymap.jpg") - - If t IsNot Nothing AndAlso textureId Then - texturePath = t.path - textureSettings = Nothing - setTexture(t) - End If - If t IsNot Nothing AndAlso Not textureId Then - envmapPath = t.path - envmapSettings = Nothing - setEnvmap(t) - End If - End If - - If id = 2 Then - Dim w As Integer = readInt(inStream) - Dim h As Integer = readInt(inStream) - Dim type As Integer = inStream.ReadSByte() - - Dim persistency As Single = readInt(inStream) - Dim density As Single = readInt(inStream) - - persistency = 0.5F - density = 0.5F - - Dim samples As Integer = inStream.ReadByte() - Dim numColors As Integer = inStream.ReadByte() - Dim colors() As Integer = New Integer(numColors - 1) {} - Dim i As Integer - For i = 0 To colors.Length - 1 ' numColors - 2 ' Step i + 1 - colors(i) = readInt(inStream) - - Next - If type = 1 Then - t = warp_TextureFactory.PERLIN(w, h, persistency, density, samples, 1024).colorize(warp_Color.makeGradient(colors, 1024)) - End If - If type = 2 Then - t = warp_TextureFactory.WAVE(w, h, persistency, density, samples, 1024).colorize(warp_Color.makeGradient(colors, 1024)) - End If - If type = 3 Then - t = warp_TextureFactory.GRAIN(w, h, persistency, density, samples, 20, 1024).colorize(warp_Color.makeGradient(colors, 1024)) - - End If - - If textureId Then - texturePath = Nothing - textureSettings = New warp_TextureSettings(t, w, h, type, persistency, density, samples, colors) - setTexture(t) - Else - envmapPath = Nothing - envmapSettings = New warp_TextureSettings(t, w, h, type, persistency, density, samples, colors) - setEnvmap(t) - End If - End If - End Sub - - Public Sub setTexture(ByVal t As warp_Texture) - texture = t - If texture IsNot Nothing Then texture.resize() - End Sub - - Public Sub setEnvmap(ByVal env As warp_Texture) - envmap = env - env.resize(256, 256) - End Sub - - Public Sub setColor(ByVal c As Integer) - color = c - End Sub - - Public Sub setTransparency(ByVal factor As Integer) - transparency = warp_Math.crop(factor, 0, 255) - opaque = (transparency = 0) - End Sub - - Public Sub setReflectivity(ByVal factor As Integer) - reflectivity = warp_Math.crop(factor, 0, 255) - End Sub - - Public Sub setFlat(ByVal flat As Boolean) - Me.flat = flat - End Sub - - Public Sub setWireframe(ByVal wireframe As Boolean) - Me.wireframe = wireframe - End Sub - - Public Sub setType(ByVal type As Integer) - Me.type = type - End Sub - - Public Function getTexture() As warp_Texture - Return texture - End Function - - Public Function getEnvmap() As warp_Texture - Return envmap - End Function - - Public Function getColor() As Integer - Return color - End Function - - Public Function getTransparency() As Integer - Return transparency - End Function - - Public Function getReflectivity() As Integer - Return reflectivity - End Function - - Public Function [getType]() As Integer - Return type - End Function - - Public Function isFlat() As Boolean - Return flat - End Function - - Public Function isWireframe() As Boolean - Return wireframe - End Function - - End Class -End Namespace \ No newline at end of file diff --git a/trunk/managed/Warp3D/Warp3DVB/warp_Math.vb b/trunk/managed/Warp3D/Warp3DVB/warp_Math.vb deleted file mode 100644 index e7d8a90b..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/warp_Math.vb +++ /dev/null @@ -1,182 +0,0 @@ -' Created by: X -' http://www.createdbyx.com/ -' ---------------------- -' C# to VB.NET conversion of this code was done by hand and with the assistance of the -' Convert C# to VB .NET application availible at http://www.kamalpatel.net/ConvertCSharp2VB.aspx -' ConvertCSharp2VB utility was developed by: Kamal Patel (http://www.KamalPatel.net) -' ---------------------- -' Thanks to Alan Simes ( http://alansimes.blogdns.net/ ) for creating the Warp3D library. -' http://alansimes.blogdns.net/cs/files/default.aspx -' ---------------------- - -Imports System - -Namespace Rednettle.Warp3D - '/ - '/ Summary description for warp_Math. - '/ - Public Class warp_Math - Private Shared sinus() As Single - Private Shared cosinus() As Single - Private Shared trig As Boolean = False - Public Shared pi As Single = 3.14159274F - Private Shared rad2scale As Single = 4096.0F / 3.14159274F / 2.0F - Private Shared pad As Single = 256 * 3.14159274F - - Private Shared fastRandoms() As Integer - Private Shared fastRndPointer As Integer = 0 - Private Shared fastRndInit As Boolean = False - - Private Shared _rnd As Random = New Random() - - - Public Sub New() - ' - ' TODO: Add constructor logic here - ' - End Sub - - - Public Shared Function interpolate(ByVal a As Single, ByVal b As Single, ByVal d As Single) As Single - Dim f As Single = (1 - cos(d * pi)) * 0.5F - Return a + f * (b - a) - End Function - - Public Shared Function random() As Single - Dim rnd As Random = New Random() - Return CType((rnd.NextDouble() * 2 - 1), Single) - End Function - - Public Shared Function random(ByVal min As Single, ByVal max As Single) As Single - 'Random rnd = new Random(); - Return CType((_rnd.NextDouble() * (max - min) + min), Single) - End Function - - Public Shared Function randomWithDelta(ByVal averidge As Single, ByVal delta As Single) As Single - Return averidge + random() * delta - End Function - - - Public Shared Function fastRnd(ByVal bits As Integer) As Integer - If bits < 1 Then Return 0 - - fastRndPointer = (fastRndPointer + 1) And 31 - If Not fastRndInit Then - fastRandoms = New Integer(31) {} - Dim i As Integer - For i = 0 To 30 ' - 1 Step i + 1 - fastRandoms(i) = CInt(random(0, &HFFFFFF)) - Next - fastRndInit = True - End If - Return fastRandoms(fastRndPointer) And (1 << (bits - 1)) - End Function - - - Public Shared Function fastRndBit() As Integer - Return fastRnd(1) - End Function - - Public Shared Function deg2rad(ByVal deg As Single) As Single - Return deg * 0.0174532924F - End Function - - Public Shared Function rad2deg(ByVal rad As Single) As Single - Return rad * 57.29578F - End Function - - Public Shared Function sin(ByVal angle As Single) As Single - If Not trig Then buildTrig() - Return sinus(CInt((angle + pad) * rad2scale) And &HFFF) - End Function - - Public Shared Function cos(ByVal angle As Single) As Single - If Not trig Then buildTrig() - Return cosinus(CInt((angle + pad) * rad2scale) And &HFFF) - End Function - - - Private Shared Sub buildTrig() - ' System.Console.WriteLine(">> Building warp_Math LUT") - - sinus = New Single(4095) {} - cosinus = New Single(4095) {} - - For i As Integer = 0 To 4095 '6 - 1 Step i + 1 - sinus(i) = CSng(Math.Sin(i / rad2scale)) - cosinus(i) = CSng(Math.Cos(i / rad2scale)) - Next - - trig = True - End Sub - - - Public Shared Function pythagoras(ByVal a As Single, ByVal b As Single) As Single - Return CSng(Math.Sqrt(a * a + b * b)) - End Function - - Public Shared Function pythagoras(ByVal a As Integer, ByVal b As Integer) As Integer - Return CInt(Math.Sqrt(a * a + b * b)) - End Function - - Public Shared Function crop(ByVal num As Integer, ByVal min As Integer, ByVal max As Integer) As Integer - If num < min Then Return min - If num > max Then Return max - Return num - End Function - - Public Shared Function crop(ByVal num As Single, ByVal min As Single, ByVal max As Single) As Single - If num < min Then Return min - If num > max Then Return max - Return num - End Function - - Public Shared Function inrange(ByVal num As Integer, ByVal min As Integer, ByVal max As Integer) As Boolean - Return ((num >= min) AndAlso (num < max)) - End Function - - Public Shared Sub clearBuffer(ByRef buffer() As Integer, ByVal c As Integer) - System.Array.Clear(buffer, 0, buffer.GetLength(0)) - ' For i As Integer = 0 To buffer.Length - 1 - ' buffer(i) = c - ' Next - End Sub - - Public Shared Sub clearBuffer(ByRef buffer() As Long, ByVal c As Integer) - System.Array.Clear(buffer, 0, buffer.GetLength(0)) - ' For i As Integer = 0 To buffer.Length - 1 - ' buffer(i) = c - ' Next - End Sub - - Public Shared Sub clearBuffer(ByVal buffer() As Byte, ByVal value As Byte) - System.Array.Clear(buffer, 0, buffer.GetLength(0)) - End Sub - - Public Shared Sub cropBuffer(ByVal buffer() As Integer, ByVal min As Integer, ByVal max As Integer) - For i As Integer = buffer.GetLength(0) - 1 To 0 Step -1 - buffer(i) = crop(buffer(i), min, max) - Next - End Sub - - Public Shared Sub copyBuffer(ByVal source() As Integer, ByVal target() As Integer) - System.Array.Copy(source, 0, target, 0, crop(source.GetLength(0), 0, target.GetLength(0))) - End Sub - ' - ' Public static single random() - ' { - ' Return CType((Math.r.random()*2-1), single) - ' } - ' - ' Public static single random(single min, single max) - ' { - ' Return CType((Math.random()*(max-min)+min), single) - ' } - ' - ' Public static single randomWithDelta(single averidge, single delta) - ' { - ' Return averidge+random()*delta - ' } - ' */ - End Class -End Namespace \ No newline at end of file diff --git a/trunk/managed/Warp3D/Warp3DVB/warp_Matrix.vb b/trunk/managed/Warp3D/Warp3DVB/warp_Matrix.vb deleted file mode 100644 index 1eb83f9e..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/warp_Matrix.vb +++ /dev/null @@ -1,348 +0,0 @@ -' Created by: X -' http://www.createdbyx.com/ -' ---------------------- -' C# to VB.NET conversion of this code was done by hand and with the assistance of the -' Convert C# to VB .NET application availible at http://www.kamalpatel.net/ConvertCSharp2VB.aspx -' ConvertCSharp2VB utility was developed by: Kamal Patel (http://www.KamalPatel.net) -' ---------------------- -' Thanks to Alan Simes ( http://alansimes.blogdns.net/ ) for creating the Warp3D library. -' http://alansimes.blogdns.net/cs/files/default.aspx -' ---------------------- - -Imports System - -Namespace Rednettle.Warp3D - Public Class warp_Matrix - Public m00 As Single = 1, m01 As Single = 0, m02 As Single = 0, m03 As Single = 0 - Public m10 As Single = 0, m11 As Single = 1, m12 As Single = 0, m13 As Single = 0 - Public m20 As Single = 0, m21 As Single = 0, m22 As Single = 1, m23 As Single = 0 - Public m30 As Single = 0, m31 As Single = 0, m32 As Single = 0, m33 As Single = 1 - - Public Sub New(ByVal right As warp_Vector, ByVal up As warp_Vector, ByVal forward As warp_Vector) - m00 = Right.x - m10 = right.y - m20 = right.z - m01 = up.x - m11 = up.y - m21 = up.z - m02 = forward.x - m12 = forward.y - m22 = forward.z - End Sub - - Default Public ReadOnly Property Item(ByVal column As Integer, ByVal row As Integer) As Single - Get - Select Case row - Case 0 - If column = 0 Then Return m00 - If column = 1 Then Return m01 - If column = 2 Then Return m02 - If column = 3 Then Return m03 - Exit Select - Case 1 - If column = 0 Then Return m11 - If column = 1 Then Return m11 - If column = 2 Then Return m12 - If column = 3 Then Return m13 - Exit Select - Case 2 - If column = 0 Then Return m20 - If column = 1 Then Return m21 - If column = 2 Then Return m22 - If column = 3 Then Return m23 - Exit Select - Case 3 - If column = 0 Then Return m30 - If column = 1 Then Return m31 - If column = 2 Then Return m32 - If column = 3 Then Return m33 - Exit Select - - Case Else - Return 0 - End Select - - Return 0 - End Get - End Property - - Public Sub New() - ' - ' TODO: Add constructor logic here - ' - End Sub - - Public Shared Function shiftMatrix(ByVal dx As Single, ByVal dy As Single, ByVal dz As Single) As warp_Matrix - ' matrix for shifting - Dim m As New warp_Matrix - m.m03 = dx - m.m13 = dy - m.m23 = dz - Return m - End Function - - Public Shared Function quaternionMatrix(ByVal quat As warp_Quaternion) As warp_Matrix - Dim m As New warp_Matrix - - - Dim xx As Single = quat.X * quat.X - Dim xy As Single = quat.X * quat.Y - Dim xz As Single = quat.X * quat.Z - Dim xw As Single = quat.X * quat.W - Dim yy As Single = quat.Y * quat.Y - Dim yz As Single = quat.Y * quat.Z - Dim yw As Single = quat.Y * quat.W - Dim zz As Single = quat.Z * quat.Z - Dim zw As Single = quat.Z * quat.W - - m.m00 = 1 - 2 * (yy + zz) - m.m01 = 2 * (xy - zw) - m.m02 = 2 * (xz + yw) - m.m10 = 2 * (xy + zw) - m.m11 = 1 - 2 * (xx + zz) - m.m12 = 2 * (yz - xw) - m.m20 = 2 * (xz - yw) - m.m21 = 2 * (yz + xw) - m.m22 = 1 - 2 * (xx + yy) - - m.m03 = 0 - m.m13 = 0 - m.m23 = 0 - m.m30 = 0 - m.m31 = 0 - m.m32 = 0 - m.m33 = 1 - - Return m - End Function - - Public Function rotateMatrix(ByVal quat As warp_Quaternion) As warp_Matrix - Reset() - - Dim temp As warp_Matrix = warp_Matrix.quaternionMatrix(quat) - Dim result As warp_Matrix = warp_Matrix.multiply(Me, temp) - - Return result - End Function - - Public Shared Function scaleMatrix(ByVal dx As Single, ByVal dy As Single, ByVal dz As Single) As warp_Matrix - Dim m As warp_Matrix - - m.m00 = dx - m.m11 = dy - m.m22 = dz - - Return m - End Function - - Public Function scaleMatrix(ByVal d As Single) As warp_Matrix - Return warp_Matrix.scaleMatrix(d, d, d) - End Function - - Public Shared Function rotateMatrix(ByVal dx As Single, ByVal dy As Single, ByVal dz As Single) As warp_Matrix - Dim res As New warp_Matrix - - Dim SIN As Single - Dim COS As Single - - If dx <> 0 Then - Dim m As New warp_Matrix - SIN = warp_Math.sin(dx) - COS = warp_Math.cos(dx) - m.m11 = COS - m.m12 = SIN - m.m21 = -SIN - m.m22 = COS - - res.transform(m) - End If - If dy <> 0 Then - Dim m As New warp_Matrix - - SIN = warp_Math.sin(dy) - COS = warp_Math.cos(dy) - m.m00 = COS - m.m02 = SIN - m.m20 = -SIN - m.m22 = COS - - res.transform(m) - End If - - If dz <> 0 Then - Dim m As New warp_Matrix - - SIN = warp_Math.sin(dz) - COS = warp_Math.cos(dz) - m.m00 = COS - m.m01 = SIN - m.m10 = -SIN - m.m11 = COS - - res.transform(m) - End If - - - Return res - End Function - - - Public Sub shift(ByVal dx As Single, ByVal dy As Single, ByVal dz As Single) - - transform(shiftMatrix(dx, dy, dz)) - End Sub - - Public Sub scale(ByVal dx As Single, ByVal dy As Single, ByVal dz As Single) - transform(scaleMatrix(dx, dy, dz)) - End Sub - - Public Sub scale(ByVal d As Single) - transform(scaleMatrix(d)) - End Sub - - Public Sub rotate(ByVal dx As Single, ByVal dy As Single, ByVal dz As Single) - transform(rotateMatrix(dx, dy, dz)) - End Sub - - Public Sub rotate(ByVal quat As warp_Quaternion, ByVal x As Single, ByVal y As Single, ByVal z As Single) - transform(rotateMatrix(quat)) - End Sub - - Public Sub rotate(ByVal m As warp_Matrix) - transform(m) - End Sub - - Public Sub scaleSelf(ByVal dx As Single, ByVal dy As Single, ByVal dz As Single) - preTransform(scaleMatrix(dx, dy, dz)) - End Sub - - Public Sub scaleSelf(ByVal d As Single) - preTransform(scaleMatrix(d)) - End Sub - - Public Sub shiftSelf(ByVal dx As Single, ByVal dy As Single, ByVal dz As Single) - preTransform(shiftMatrix(dx, dy, dz)) - End Sub - - Public Sub rotateSelf(ByVal dx As Single, ByVal dy As Single, ByVal dz As Single) - preTransform(rotateMatrix(dx, dy, dz)) - End Sub - Public Sub rotateSelf(ByVal m As warp_Matrix) - preTransform(m) - End Sub - - Public Sub rotateSelf(ByVal quat As warp_Quaternion) - preTransform(rotateMatrix(quat)) - End Sub - - - Public Sub transform(ByVal n As warp_Matrix) - Dim m As warp_Matrix = Me.getClone() - - m00 = n.m00 * m.m00 + n.m01 * m.m10 + n.m02 * m.m20 - m01 = n.m00 * m.m01 + n.m01 * m.m11 + n.m02 * m.m21 - m02 = n.m00 * m.m02 + n.m01 * m.m12 + n.m02 * m.m22 - m03 = n.m00 * m.m03 + n.m01 * m.m13 + n.m02 * m.m23 + n.m03 - m10 = n.m10 * m.m00 + n.m11 * m.m10 + n.m12 * m.m20 - m11 = n.m10 * m.m01 + n.m11 * m.m11 + n.m12 * m.m21 - m12 = n.m10 * m.m02 + n.m11 * m.m12 + n.m12 * m.m22 - m13 = n.m10 * m.m03 + n.m11 * m.m13 + n.m12 * m.m23 + n.m13 - m20 = n.m20 * m.m00 + n.m21 * m.m10 + n.m22 * m.m20 - m21 = n.m20 * m.m01 + n.m21 * m.m11 + n.m22 * m.m21 - m22 = n.m20 * m.m02 + n.m21 * m.m12 + n.m22 * m.m22 - m23 = n.m20 * m.m03 + n.m21 * m.m13 + n.m22 * m.m23 + n.m23 - End Sub - - Public Sub preTransform(ByVal n As warp_Matrix) - Dim m As warp_Matrix = Me.getClone() - - m00 = m.m00 * n.m00 + m.m01 * n.m10 + m.m02 * n.m20 - m01 = m.m00 * n.m01 + m.m01 * n.m11 + m.m02 * n.m21 - m02 = m.m00 * n.m02 + m.m01 * n.m12 + m.m02 * n.m22 - m03 = m.m00 * n.m03 + m.m01 * n.m13 + m.m02 * n.m23 + m.m03 - m10 = m.m10 * n.m00 + m.m11 * n.m10 + m.m12 * n.m20 - m11 = m.m10 * n.m01 + m.m11 * n.m11 + m.m12 * n.m21 - m12 = m.m10 * n.m02 + m.m11 * n.m12 + m.m12 * n.m22 - m13 = m.m10 * n.m03 + m.m11 * n.m13 + m.m12 * n.m23 + m.m13 - m20 = m.m20 * n.m00 + m.m21 * n.m10 + m.m22 * n.m20 - m21 = m.m20 * n.m01 + m.m21 * n.m11 + m.m22 * n.m21 - m22 = m.m20 * n.m02 + m.m21 * n.m12 + m.m22 * n.m22 - m23 = m.m20 * n.m03 + m.m21 * n.m13 + m.m22 * n.m23 + m.m23 - End Sub - - Public Shared Function multiply(ByVal m1 As warp_Matrix, ByVal m2 As warp_Matrix) As warp_Matrix - Dim m As warp_Matrix = New warp_Matrix() - - m.m00 = m1.m00 * m2.m00 + m1.m01 * m2.m10 + m1.m02 * m2.m20 - m.m01 = m1.m00 * m2.m01 + m1.m01 * m2.m11 + m1.m02 * m2.m21 - m.m02 = m1.m00 * m2.m02 + m1.m01 * m2.m12 + m1.m02 * m2.m22 - m.m03 = m1.m00 * m2.m03 + m1.m01 * m2.m13 + m1.m02 * m2.m23 + m1.m03 - m.m10 = m1.m10 * m2.m00 + m1.m11 * m2.m10 + m1.m12 * m2.m20 - m.m11 = m1.m10 * m2.m01 + m1.m11 * m2.m11 + m1.m12 * m2.m21 - m.m12 = m1.m10 * m2.m02 + m1.m11 * m2.m12 + m1.m12 * m2.m22 - m.m13 = m1.m10 * m2.m03 + m1.m11 * m2.m13 + m1.m12 * m2.m23 + m1.m13 - m.m20 = m1.m20 * m2.m00 + m1.m21 * m2.m10 + m1.m22 * m2.m20 - m.m21 = m1.m20 * m2.m01 + m1.m21 * m2.m11 + m1.m22 * m2.m21 - m.m22 = m1.m20 * m2.m02 + m1.m21 * m2.m12 + m1.m22 * m2.m22 - m.m23 = m1.m20 * m2.m03 + m1.m21 * m2.m13 + m1.m22 * m2.m23 + m1.m23 - - Return m - End Function - - ' - ' Public String toString() - ' { - ' ' todo - ' } - ' */ - - Public Function getClone() As warp_Matrix - Dim m As warp_Matrix = New warp_Matrix() - - m.m00 = m00 : m.m01 = m01 : m.m02 = m02 : m.m03 = m03 - m.m10 = m10 : m.m11 = m11 : m.m12 = m12 : m.m13 = m13 - m.m20 = m20 : m.m21 = m21 : m.m22 = m22 : m.m23 = m23 - m.m30 = m30 : m.m31 = m31 : m.m32 = m32 : m.m33 = m33 - - Return m - End Function - - - Public Function inverse() As warp_Matrix - Dim m As warp_Matrix = New warp_Matrix() - - Dim q1 As Single = m12, q6 As Single = m10 * m01, q7 As Single = m10 * m21, q8 As Single = m02 - Dim q13 As Single = m20 * m01, q14 As Single = m20 * m11, q21 As Single = m02 * m21, q22 As Single = m03 * m21 - Dim q25 As Single = m01 * m12, q26 As Single = m01 * m13, q27 As Single = m02 * m11, q28 As Single = m03 * m11 - Dim q29 As Single = m10 * m22, q30 As Single = m10 * m23, q31 As Single = m20 * m12, q32 As Single = m20 * m13 - Dim q35 As Single = m00 * m22, q36 As Single = m00 * m23, q37 As Single = m20 * m02, q38 As Single = m20 * m03 - Dim q41 As Single = m00 * m12, q42 As Single = m00 * m13, q43 As Single = m10 * m02, q44 As Single = m10 * m03 - Dim q45 As Single = m00 * m11, q48 As Single = m00 * m21 - Dim q49 As Single = q45 * m22 - q48 * q1 - q6 * m22 + q7 * q8 - Dim q50 As Single = q13 * q1 - q14 * q8 - Dim q51 As Single = 1 / (q49 + q50) - - m.m00 = (m11 * m22 * m33 - m11 * m23 * m32 - m21 * m12 * m33 + m21 * m13 * m32 + m31 * m12 * m23 - m31 * m13 * m22) * q51 - m.m01 = -(m01 * m22 * m33 - m01 * m23 * m32 - q21 * m33 + q22 * m32) * q51 - m.m02 = (q25 * m33 - q26 * m32 - q27 * m33 + q28 * m32) * q51 - m.m03 = -(q25 * m23 - q26 * m22 - q27 * m23 + q28 * m22 + q21 * m13 - q22 * m12) * q51 - m.m10 = -(q29 * m33 - q30 * m32 - q31 * m33 + q32 * m32) * q51 - m.m11 = (q35 * m33 - q36 * m32 - q37 * m33 + q38 * m32) * q51 - m.m12 = -(q41 * m33 - q42 * m32 - q43 * m33 + q44 * m32) * q51 - m.m13 = (q41 * m23 - q42 * m22 - q43 * m23 + q44 * m22 + q37 * m13 - q38 * m12) * q51 - m.m20 = (q7 * m33 - q30 * m31 - q14 * m33 + q32 * m31) * q51 - m.m21 = -(q48 * m33 - q36 * m31 - q13 * m33 + q38 * m31) * q51 - m.m22 = (q45 * m33 - q42 * m31 - q6 * m33 + q44 * m31) * q51 - m.m23 = -(q45 * m23 - q42 * m21 - q6 * m23 + q44 * m21 + q13 * m13 - q38 * m11) * q51 - - Return m - End Function - - Public Sub reset() - m00 = 1 : m01 = 0 : m02 = 0 : m03 = 0 - m10 = 0 : m11 = 1 : m12 = 0 : m13 = 0 - m20 = 0 : m21 = 0 : m22 = 1 : m23 = 0 - m30 = 0 : m31 = 0 : m32 = 0 : m33 = 1 - End Sub - End Class -End Namespace diff --git a/trunk/managed/Warp3D/Warp3DVB/warp_Object.vb b/trunk/managed/Warp3D/Warp3DVB/warp_Object.vb deleted file mode 100644 index 99b59d66..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/warp_Object.vb +++ /dev/null @@ -1,375 +0,0 @@ -' Created by: X -' http://www.createdbyx.com/ -' ---------------------- -' C# to VB.NET conversion of this code was done by hand and with the assistance of the -' Convert C# to VB .NET application availible at http://www.kamalpatel.net/ConvertCSharp2VB.aspx -' ConvertCSharp2VB utility was developed by: Kamal Patel (http://www.KamalPatel.net) -' ---------------------- -' Thanks to Alan Simes ( http://alansimes.blogdns.net/ ) for creating the Warp3D library. -' http://alansimes.blogdns.net/cs/files/default.aspx -' ---------------------- - -Imports System -Imports System.Collections - -Namespace Rednettle.Warp3D - '/ - '/ Summary description for warp_Object. - '/ - Public Class warp_Object - Inherits warp_CoreObject - - Public userData As Object = Nothing ' Can be freely used - Public user As String = Nothing ' Can be freely used - - Public vertexData As ArrayList = New ArrayList() - Public triangleData As ArrayList = New ArrayList() - - - Public id As Integer ' This object's index() As id - Public name As String = "" ' This object's name - Public visible As Boolean = True ' Visibility tag - Public projected As Boolean = False - Public parent As warp_Scene = Nothing - Private dirty As Boolean = True ' Flag for dirty handling - - Public fastvertex() As warp_Vertex - Public fasttriangle() As warp_Triangle - - Public vertices As Integer = 0 - Public triangles As Integer = 0 - - Public material As warp_Material = Nothing - Public index As Integer - Public offset As Integer = 0 - Public split As Integer = 0 - - - Public Sub New() - - End Sub - - - Public Function vertex(ByVal id As Integer) As warp_Vertex - Return CType(vertexData(id), warp_Vertex) - End Function - - Public Function triangle(ByVal id As Integer) As warp_Triangle - Return CType(triangleData(id), warp_Triangle) - End Function - - Public Sub addVertex(ByVal NewVertex As warp_Vertex) - NewVertex.parent = Me - vertexData.Add(NewVertex) - dirty = True - End Sub - - Public Sub addTriangle(ByVal NewTriangle As warp_Triangle) - NewTriangle.parent = Me - triangleData.Add(NewTriangle) - dirty = True - End Sub - - Public Sub addTriangle(ByVal v1 As Integer, ByVal v2 As Integer, ByVal v3 As Integer) - addTriangle(vertex(v1), vertex(v2), vertex(v3)) - End Sub - - Public Sub removeVertex(ByVal v As warp_Vertex) - vertexData.Remove(v) - End Sub - - Public Sub removeTriangle(ByVal t As warp_Triangle) - triangleData.Remove(t) - End Sub - - Public Sub removeVertexAt(ByVal pos As Integer) - vertexData.Remove(pos) - End Sub - - Public Sub removeTriangleAt(ByVal pos As Integer) - triangleData.Remove(pos) - End Sub - - Public Sub setMaterial(ByVal m As warp_Material) - material = m - End Sub - - - Public Sub rebuild() - If Not dirty Then - Return - End If - dirty = False - - ' Generate faster structure for vertices - vertices = vertexData.Count - fastvertex = New warp_Vertex(vertices - 1) {} - - Dim enumerator As IEnumerator = vertexData.GetEnumerator() - - For i As Integer = vertices - 1 To 0 Step -1 - enumerator.MoveNext() - fastvertex(i) = CType(enumerator.Current, warp_Vertex) - Next - - ' Generate faster structure for triangles - triangles = triangleData.Count - fasttriangle = New warp_Triangle(triangles - 1) {} - - enumerator = triangleData.GetEnumerator() - - For i As Integer = triangles - 1 To 0 Step -1 - enumerator.MoveNext() - fasttriangle(i) = CType(enumerator.Current, warp_Triangle) - fasttriangle(i).id = i - Next - - - For i As Integer = vertices - 1 To 0 Step -1 - fastvertex(i).id = i - fastvertex(i).resetNeighbors() - Next - - Dim tri As warp_Triangle - - For i As Integer = triangles - 1 To 0 Step -1 - tri = fasttriangle(i) - tri.p1.registerNeighbor(tri) - tri.p2.registerNeighbor(tri) - tri.p3.registerNeighbor(tri) - Next - - regenerate() - End Sub - - '/* - 'public void rebuild() - '{ - ' if (!dirty) return; - ' dirty=false; - - ' Enumeration enum; - - ' // Generate faster structure for vertices - ' vertices=vertexData.size(); - ' vertex=new warp_Vertex[vertices]; - ' enum=vertexData.elements(); - ' for (int i=vertices-1;i>=0;i--) vertex[i]=(warp_Vertex)enum.nextElement(); - - ' // Generate faster structure for triangles - ' triangles=triangleData.size(); - ' triangle=new warp_Triangle[triangles]; - ' enum=triangleData.elements(); - ' for (int i=triangles-1;i>=0;i--) - ' { - ' triangle[i]=(warp_Triangle)enum.nextElement(); - ' triangle[i].id=i; - ' } - - ' for (int i=vertices-1;i>=0;i--) - ' { - ' vertex[i].id=i; - ' vertex[i].resetNeighbors(); - ' } - - ' warp_Triangle tri; - ' for (int i=triangles-1;i>=0;i--) - ' { - ' tri=triangle[i]; - ' tri.p1.registerNeighbor(tri); - ' tri.p2.registerNeighbor(tri); - ' tri.p3.registerNeighbor(tri); - ' } - - ' regenerate(); - '} - '*/ - - - Public Sub addVertex(ByVal x As Single, ByVal y As Single, ByVal z As Single) - addVertex(New warp_Vertex(x, y, z)) - End Sub - - - Public Sub addVertex(ByVal x As Single, ByVal y As Single, ByVal z As Single, ByVal u As Single, ByVal v As Single) - Dim vert As warp_Vertex = New warp_Vertex(x, y, z) - vert.setUV(u, v) - addVertex(vert) - End Sub - - Public Sub addTriangle(ByVal a As warp_Vertex, ByVal b As warp_Vertex, ByVal c As warp_Vertex) - addTriangle(New warp_Triangle(a, b, c)) - End Sub - - Public Sub regenerate() - Dim i As Integer - For i = 0 To triangles - 1 'Step i + 1 - fasttriangle(i).regenerateNormal() - Next - For i = 0 To vertices - 1 'Step i + 1 - fastvertex(i).regenerateNormal() - Next - End Sub - - Public Sub remapUV(ByVal w As Integer, ByVal h As Integer, ByVal sx As Single, ByVal sy As Single) - rebuild() - Dim p As Integer = 0 - For j As Integer = 0 To h - 1 'Step j + 1 - Dim v As Single = CSng((j / (h - 1)) * sy) - For i As Integer = 0 To w - 1 'Step i + 1 - Dim u As Single = CSng((i / (w - 1)) * sx) - fastvertex(p).setUV(u, v) - p += 1 - Next - Next - End Sub - - '/* - 'public void tilt(float fact) - '{ - ' rebuild(); - ' for (int i=0;i maxX Then maxX = fastvertex(i).pos.x - If fastvertex(i).pos.y > maxY Then maxY = fastvertex(i).pos.y - If fastvertex(i).pos.z > maxZ Then maxZ = fastvertex(i).pos.z - Next - Return New warp_Vector(maxX, maxY, maxZ) - End Function - - - - Public Sub detach() - Dim center As warp_Vector = getCenter() - - For i As Integer = 0 To vertices - 1 Step i + 1 - fastvertex(i).pos.x -= center.x - fastvertex(i).pos.y -= center.y - fastvertex(i).pos.z -= center.z - Next - - shift(center) - End Sub - - Public Function getCenter() As warp_Vector - Dim max As warp_Vector = maximum() - Dim min As warp_Vector = minimum() - - Return New warp_Vector((max.x + min.x) / 2, (max.y + min.y) / 2, (max.z + min.z) / 2) - End Function - - Public Function getDimension() As warp_Vector - Dim max As warp_Vector = maximum() - Dim min As warp_Vector = minimum() - - Return New warp_Vector(max.x - min.x, max.y - min.y, max.z - min.z) - End Function - - Public Sub matrixMeltdown() - rebuild() - Dim i As Integer - For i = vertices - 1 To 0 Step -1 - fastvertex(i).pos = fastvertex(i).pos.transform(matrix) - Next - - regenerate() - matrix.reset() - normalmatrix.reset() - End Sub - - Public Function getClone() As warp_Object - Dim obj As warp_Object = New warp_Object() - rebuild() - For i As Integer = 0 To vertices - 1 'Step i + 1 - obj.addVertex(fastvertex(i).getClone()) - Next - For i As Integer = 0 To triangles - 1 'Step i + 1 - obj.addTriangle(fasttriangle(i).getClone()) - Next - obj.name = name & " [cloned]" - obj.material = material - obj.matrix = matrix.getClone() - obj.normalmatrix = normalmatrix.getClone() - obj.rebuild() - Return obj - End Function - - '/* - ' public void removeDuplicateVertices() - ' { - ' rebuild(); - ' Vector edgesToCollapse=new Vector(); - ' for (int i=0;i - '/ Summary description for warp_ObjectFactory. - '/ - Public Class warp_ObjectFactory - Public Shared pi As Double = 3.1415926535 - Public Shared deg2rad As Double = pi / 180 - - Public Shared Function SIMPLEPLANE(ByVal size As Single, ByVal doubleSided As Boolean) As warp_Object - Dim NewObject As warp_Object = New warp_Object() - - NewObject.addVertex(New warp_Vertex(-size, 0.0F, size, 0, 0)) - NewObject.addVertex(New warp_Vertex(size, 0.0F, size, 4.0F, 0)) - NewObject.addVertex(New warp_Vertex(size, 0.0F, -size, 4.0F, 4.0F)) - NewObject.addVertex(New warp_Vertex(-size, 0.0F, -size, 0, 4.0F)) - - NewObject.addTriangle(0, 3, 2) - NewObject.addTriangle(0, 2, 1) - - If doubleSided Then - NewObject.addTriangle(0, 2, 3) - NewObject.addTriangle(0, 1, 2) - End If - - Return NewObject - End Function - - Public Shared Function CUBE(ByVal size As Single) As warp_Object - Return BOX(size, size, size) - End Function - - Public Shared Function BOX(ByVal size As warp_Vector) As warp_Object - Return BOX(size.x, size.y, size.z) - End Function - - Public Shared Function BOX(ByVal xsize As Single, ByVal ysize As Single, ByVal zsize As Single) As warp_Object - Dim x As Single = Math.Abs(xsize / 2) - Dim y As Single = Math.Abs(ysize / 2) - Dim z As Single = Math.Abs(zsize / 2) - - Dim xx As Single, yy As Single, zz As Single - - Dim n As New warp_Object() - Dim xflag() As Integer = New Integer(5) {} - Dim yflag() As Integer = New Integer(5) {} - Dim zflag() As Integer = New Integer(5) {} - - xflag(0) = 10 - yflag(0) = 3 - zflag(0) = 0 - xflag(1) = 10 - yflag(1) = 15 - zflag(1) = 3 - xflag(2) = 15 - yflag(2) = 3 - zflag(2) = 10 - xflag(3) = 10 - yflag(3) = 0 - zflag(3) = 12 - xflag(4) = 0 - yflag(4) = 3 - zflag(4) = 5 - xflag(5) = 5 - yflag(5) = 3 - zflag(5) = 15 - - For side As Integer = 0 To 5 - For i As Integer = 0 To 3 - If (xflag(side) And (1 << i)) > 0 Then xx = x Else xx = -x - If (yflag(side) And (1 << i)) > 0 Then yy = y Else yy = -y - If (zflag(side) And (1 << i)) > 0 Then zz = z Else zz = -z - n.addVertex(xx, yy, zz, i And 1, (i And 2) >> 1) - Next - Dim t As Integer = side << 2 - n.addTriangle(t, t + 2, t + 3) - n.addTriangle(t, t + 3, t + 1) - Next - - Return n - End Function - - Public Shared Function CONE(ByVal height As Single, ByVal radius As Single, ByVal segments As Integer) As warp_Object - Dim path() As warp_Vector = New warp_Vector(3) {} - Dim h As Single = height / 2 - path(0) = New warp_Vector(0, h, 0) - path(1) = New warp_Vector(radius, -h, 0) - path(2) = New warp_Vector(radius, -h, 0) - path(3) = New warp_Vector(0, -h, 0) - - Return ROTATIONOBJECT(path, segments) - End Function - - Public Shared Function CYLINDER(ByVal height As Single, ByVal radius As Single, ByVal segments As Integer) As warp_Object - Dim path() As warp_Vector = New warp_Vector(5) {} - Dim h As Single = height / 2 - path(0) = New warp_Vector(0, h, 0) - path(1) = New warp_Vector(radius, h, 0) - path(2) = New warp_Vector(radius, h, 0) - path(3) = New warp_Vector(radius, -h, 0) - path(4) = New warp_Vector(radius, -h, 0) - path(5) = New warp_Vector(0, -h, 0) - - Return ROTATIONOBJECT(path, segments) - End Function - - Public Shared Function SPHERE(ByVal radius As Single, ByVal segments As Integer) As warp_object - Dim path() As warp_Vector = New warp_Vector(segments) {} - - Dim x As Single, y As Single, angle As Single - - path(0) = New warp_Vector(0, radius, 0) - path(segments - 1) = New warp_Vector(0, -radius, 0) - - For i As Integer = 1 To segments - 1 - angle = -((CSng(i) / CSng(segments - 2)) - 0.5F) * 3.14159274F - x = CSng(Math.Cos(angle) * radius) - y = CSng(Math.Sin(angle) * radius) - path(i) = New warp_Vector(x, y, 0) - Next - - Return ROTATIONOBJECT(path, segments) - End Function - - Public Shared Function ROTATIONOBJECT(ByVal path As warp_Vector(), ByVal sides As Integer) As warp_object - Dim steps As Integer = sides + 1 - Dim NewObject As New warp_Object() - Dim alpha As Double = 2 * pi / (steps - 1) - Dim qx As Single, qz As Single - Dim nodes As Integer = path.GetLength(0) - 1 - Dim vertex As warp_Vertex = Nothing - Dim u As Single, v As Single ' Texture coordinates - - For j As Integer = 0 To steps - 1 - u = CSng((steps - j - 1) / (steps - 1)) - For i As Integer = 0 To nodes - 1 - v = CSng(i / (nodes - 1)) - qx = CSng(path(i).x * Math.Cos(j * alpha) + path(i).z * Math.Sin(j * alpha)) - qz = CSng(path(i).z * Math.Cos(j * alpha) - path(i).x * Math.Sin(j * alpha)) - vertex = New warp_Vertex(qx, path(i).y, qz) - vertex.u = u - vertex.v = v - NewObject.addVertex(vertex) - Next - Next - - For j As Integer = 0 To steps - 2 - For i As Integer = 0 To nodes - 2 - NewObject.addTriangle(i + nodes * j, i + nodes * (j + 1), i + 1 + nodes * j) - NewObject.addTriangle(i + nodes * (j + 1), i + 1 + nodes * (j + 1), i + 1 + nodes * j) - Next - Next - - For i As Integer = 0 To nodes - 2 - NewObject.addTriangle(i + nodes * (steps - 1), i, i + 1 + nodes * (steps - 1)) - NewObject.addTriangle(i, i + 1, i + 1 + nodes * (steps - 1)) - Next - - Return NewObject - End Function - - - Public Shared Function TORUSKNOT(ByVal p As Single, ByVal q As Single, ByVal r_tube As Single, ByVal r_out As Single, ByVal r_in As Single, ByVal h As Single, ByVal segments As Integer, ByVal steps As Integer) As warp_Object - Dim x As Single, y As Single, z As Single, r As Single, t As Single, theta As Single - - Dim path() As warp_Vector = New warp_Vector(segments) {} - For i As Integer = 0 To segments '+ 1 - 1 Step i + 1 - t = 2 * 3.14159274F * i / segments - r = r_out + r_in * warp_Math.cos(p * t) - z = h * warp_Math.sin(p * t) - theta = q * t - x = r * warp_Math.cos(theta) - y = r * warp_Math.sin(theta) - path(i) = New warp_Vector(x, y, z) - Next - Return TUBE(path, r_tube, steps, True) - End Function - - Public Shared Function SPIRAL(ByVal h As Single, ByVal r_out As Single, ByVal r_in As Single, _ - ByVal r_tube As Single, ByVal w As Single, ByVal f As Single, ByVal segments As Integer, ByVal steps As Integer) As warp_object - - Dim x, y, z, r, t, theta As Single - - Dim path() As warp_Vector = New warp_Vector(segments) {} - - For i As Integer = 0 To segments '+ 1 - 1 Step i + 1 - t = CSng(i / segments) - r = r_out + r_in * warp_Math.sin(2 * 3.14159274F * f * t) - z = (h / 2) + h * t - theta = 2 * 3.14159274F * w * t - x = r * warp_Math.cos(theta) - y = r * warp_Math.sin(theta) - path(i) = New warp_Vector(x, y, z) - Next - Return TUBE(path, r_tube, steps, False) - End Function - - Public Shared Function TUBE(ByVal path As warp_Vector(), ByVal r As Single, ByVal steps As Integer, ByVal closed As Boolean) As warp_object - Dim circle() As warp_Vector = New warp_Vector(steps) {} - Dim angle As Single - For i As Integer = 0 To steps - angle = 2 * 3.14159274F * CSng(i) / CSng(steps) - circle(i) = New warp_Vector(r * warp_Math.cos(angle), r * warp_Math.sin(angle), 0.0F) - Next - - Dim NewObject As New warp_Object() - Dim segments As Integer = path.GetLength(0) - Dim forward As warp_Vector, up As warp_Vector, right As warp_Vector - Dim frenetmatrix As warp_Matrix - Dim tempvertex As warp_Vertex - Dim relx As Single, rely As Single - Dim a As Integer, b As Integer, c As Integer, d As Integer - - For i As Integer = 0 To segments - 1 - - ' Calculate frenet frame matrix - - If i <> (segments - 1) Then - forward = warp_Vector.sub(path(i + 1), path(i)) - Else - If Not closed Then - forward = warp_Vector.sub(path(i), path(i - 1)) - Else - forward = warp_Vector.sub(path(1), path(0)) - End If - End If - - forward.normalize() - up = New warp_Vector(0.0F, 0.0F, 1.0F) - right = warp_Vector.getNormal(forward, up) - up = warp_Vector.getNormal(forward, right) - frenetmatrix = New warp_Matrix(right, up, forward) - frenetmatrix.shift(path(i).x, path(i).y, path(i).z) - - ' Add nodes - - relx = CSng(i / (segments - 1)) - For k As Integer = 0 To steps - rely = CSng(k / steps) - tempvertex = New warp_Vertex(circle(k).transform(frenetmatrix)) - tempvertex.u = relx - tempvertex.v = rely - NewObject.addVertex(tempvertex) - Next - Next - - For i As Integer = 0 To segments - 2 - For k As Integer = 0 To steps - a = i * steps + k - b = a + 1 - c = a + steps - d = b + steps - NewObject.addTriangle(a, c, b) - NewObject.addTriangle(b, c, d) - Next - a = (i + 1) * steps - 1 - b = a + 1 - steps - c = a + steps - d = b + steps - NewObject.addTriangle(a, c, b) - NewObject.addTriangle(b, c, d) - Next - - Return NewObject - End Function - - End Class -End Namespace diff --git a/trunk/managed/Warp3D/Warp3DVB/warp_Quaternion.vb b/trunk/managed/Warp3D/Warp3DVB/warp_Quaternion.vb deleted file mode 100644 index 50ed0055..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/warp_Quaternion.vb +++ /dev/null @@ -1,102 +0,0 @@ -' Created by: X -' http://www.createdbyx.com/ -' ---------------------- -' C# to VB.NET conversion of this code was done by hand and with the assistance of the -' Convert C# to VB .NET application availible at http://www.kamalpatel.net/ConvertCSharp2VB.aspx -' ConvertCSharp2VB utility was developed by: Kamal Patel (http://www.KamalPatel.net) -' ---------------------- -' Thanks to Alan Simes ( http://alansimes.blogdns.net/ ) for creating the Warp3D library. -' http://alansimes.blogdns.net/cs/files/default.aspx -' ---------------------- - -Imports System -Imports System.Collections -Imports System.Text -Imports System.Diagnostics - -Namespace Rednettle.Warp3D - Public Class warp_Quaternion - Public X As Single - Public Y As Single - Public Z As Single - Public W As Single - - Public Sub New() - End Sub - - Public Sub New(ByVal x As Single, ByVal y As Single, ByVal z As Single, ByVal w As Single) - Me.X = x - Me.Y = y - Me.Z = z - Me.W = w - End Sub - - Public Function getClone() As warp_Quaternion - Return New warp_Quaternion(Me.X, Me.Y, Me.Z, Me.W) - End Function - - Public Shared Function matrix(ByVal xfrm As warp_Matrix) As warp_Quaternion - Dim quat As warp_Quaternion = New warp_Quaternion() - ' Check the sum of the diagonal - Dim tr As Single = xfrm(0, 0) + xfrm(1, 1) + xfrm(2, 2) - If tr > 0.0F Then - ' The sum is positive - ' 4 muls, 1 div, 6 adds, 1 trig function call - Dim s As Single = CSng(Math.Sqrt(tr + 1.0F)) - quat.W = s * 0.5F - s = 0.5F / s - quat.X = (xfrm(1, 2) - xfrm(2, 1)) * s - quat.Y = (xfrm(2, 0) - xfrm(0, 2)) * s - quat.Z = (xfrm(0, 1) - xfrm(1, 0)) * s - Else - ' The sum is negative - ' 4 muls, 1 div, 8 adds, 1 trig function call - Dim nIndex() As Integer = {1, 2, 0} - - Dim i As Integer, j As Integer, k As Integer - i = 0 - If xfrm(1, 1) > xfrm(i, i) Then i = 1 - If xfrm(2, 2) > xfrm(i, i) Then i = 2 - j = nIndex(i) - k = nIndex(j) - - Dim s As Single = CSng(Math.Sqrt((xfrm(i, i) - (xfrm(j, j) + xfrm(k, k))) + 1.0F)) - quat(i) = s * 0.5F - If s <> 0.0 Then s = 0.5F / s - quat(j) = (xfrm(i, j) + xfrm(j, i)) * s - quat(k) = (xfrm(i, k) + xfrm(k, i)) * s - quat(3) = (xfrm(j, k) - xfrm(k, j)) * s - End If - - Return quat - End Function - - Default Public Property Item(ByVal index As Integer) As Single - Get - Debug.Assert(0 <= index AndAlso index <= 3) - If index <= 1 Then - If index = 0 Then Return Me.X - Return Me.Y - End If - If index = 2 Then Return Me.Z - Return Me.W - End Get - Set(ByVal Value As Single) - Debug.Assert(0 <= index AndAlso index <= 3) - If index <= 1 Then - If index = 0 Then - Me.X = Value - Else - Me.Y = Value - End If - Else - If index = 2 Then - Me.Z = Value - Else - Me.W = Value - End If - End If - End Set - End Property - End Class -End Namespace diff --git a/trunk/managed/Warp3D/Warp3DVB/warp_Rasterizer.vb b/trunk/managed/Warp3D/Warp3DVB/warp_Rasterizer.vb deleted file mode 100644 index fb2a1abc..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/warp_Rasterizer.vb +++ /dev/null @@ -1,591 +0,0 @@ -' Created by: X -' http://www.createdbyx.com/ -' ---------------------- -' C# to VB.NET conversion of this code was done by hand and with the assistance of the -' Convert C# to VB .NET application availible at http://www.kamalpatel.net/ConvertCSharp2VB.aspx -' ConvertCSharp2VB utility was developed by: Kamal Patel (http://www.KamalPatel.net) -' ---------------------- -' Thanks to Alan Simes ( http://alansimes.blogdns.net/ ) for creating the Warp3D library. -' http://alansimes.blogdns.net/cs/files/default.aspx -' ---------------------- - -Imports System - -Namespace Rednettle.Warp3D - Public Class warp_Rasterizer - Private materialLoaded As Boolean = False - Private lightmapLoaded As Boolean = False - Public ready As Boolean = False - - ' Current material settings - Private color As Integer = 0 - Private currentColor As Integer = 0 - Private transparency As Integer = 0 - Private reflectivity As Integer = 0 - Private refraction As Integer = 0 - Private texture As warp_Texture = Nothing - Private envmap() As Integer = Nothing - Private diffuse() As Integer = Nothing - Private specular() As Integer = Nothing - Private refractionMap() As Short = Nothing - Private tw As Integer = 0 - Private th As Integer = 0 - Private tbitW As Integer = 0 - Private tbitH As Integer = 0 - - ' Rasterizer hints - Private mode As Integer = 0 - Private F As Integer = 0 ' FLAT - Private W As Integer = 1 ' WIREFRAME - Private P As Integer = 2 ' PHONG - Private E As Integer = 4 ' ENVMAP - Private T As Integer = 8 ' TEXTURED - Private SHADED As Integer = 0 - - Dim p1 As warp_Vertex, p2 As warp_Vertex, p3 As warp_Vertex, tempVertex As warp_Vertex - - Private bkgrd, c, s, lutID, r, _ - x1, x2, x3, x4, y1, y2, y3, z1, z2, z3, z4, _ - x, y, z, k, dx, dy, dz, offset, pos, temp, _ - xL, xR, xBase, zBase, xMax, yMax, dxL, dxR, dzBase, _ - nx1, nx2, nx3, nx4, ny1, ny2, ny3, ny4, _ - nxBase, nyBase, _ - dnx4, dny4, _ - dnx, dny, nx, ny, _ - dnxBase, dnyBase, _ - dtx4, dty4 As Integer - - Private tx1, tx2, tx3, tx4, ty1, ty2, ty3, ty4, _ - txBase, tyBase, _ - tx, ty, sw, _ - dtxBase, dtyBase, _ - dtx, dty, _ - sw1, sw2, sw3, sw4, swBase, dsw, dswBase As Single - - Dim screen As warp_Screen - Dim zBuffer() As Integer - Dim idBuffer() As Integer - Dim width As Integer, height As Integer - Dim useIdBuffer As Boolean - Dim zFar As Integer = &HFFFFFF - Dim currentId As Integer = 0 - - '// Constructor - Public Sub New(ByVal pipeline As warp_RenderPipeline) - SHADED = P Or E Or T - - rebuildReferences(pipeline) - loadLightmap(pipeline.lightmap) - End Sub - - ' References - Public Sub rebuildReferences(ByVal pipeline As warp_RenderPipeline) - screen = pipeline.screen - zBuffer = pipeline.zBuffer - idBuffer = pipeline.idBuffer - width = screen.width - height = screen.height - useIdBuffer = pipeline.useId - End Sub - - ' Lightmap loader - Public Sub loadLightmap(ByVal lm As warp_Lightmap) - If lm Is Nothing Then Exit Sub - diffuse = lm.diffuse - specular = lm.specular - lightmapLoaded = True - ready = lightmapLoaded AndAlso materialLoaded - End Sub - - ' Material loader - Public Sub loadMaterial(ByVal material As warp_Material) - color = material.color - transparency = material.transparency - reflectivity = material.reflectivity - texture = material.texture - If material.envmap IsNot Nothing Then - envmap = material.envmap.pixel - Else - envmap = Nothing - End If - - If texture IsNot Nothing Then - tw = texture.width - 1 - th = texture.height - 1 - tbitW = texture.bitWidth - tbitH = texture.bitHeight - End If - - mode = 0 - If Not material.flat Then mode = mode Or P - If envmap IsNot Nothing Then mode = mode Or E - If texture IsNot Nothing Then mode = mode Or T - If material.wireframe Then mode = mode Or W - materialLoaded = True - ready = lightmapLoaded AndAlso materialLoaded - End Sub - - - Public Sub render(ByVal tri As warp_Triangle) - If Not ready Then - Return - End If - If tri.parent Is Nothing Then - Return - End If - If (mode And W) <> 0 Then - drawWireframe(tri, color) - If (mode And W) = 0 Then - Return - End If - End If - - p1 = tri.p1 - p2 = tri.p2 - p3 = tri.p3 - - If p1.y > p2.y Then tempVertex = p1 : p1 = p2 : p2 = tempVertex - If p2.y > p3.y Then tempVertex = p2 : p2 = p3 : p3 = tempVertex - If p1.y > p2.y Then tempVertex = p1 : p1 = p2 : p2 = tempVertex - - If p1.y >= height Then Exit Sub - If p3.y < 0 Then Exit Sub - If p1.y = p3.y Then Exit Sub - - If mode = F Then - lutID = CInt(tri.n2.x * 127 + 127) + (CInt(tri.n2.y * 127 + 127) << 8) - c = warp_Color.multiply(color, diffuse(lutID)) - s = warp_Color.scale(specular(lutID), reflectivity) - currentColor = warp_Color.add(c, s) - End If - - currentId = (tri.parent.id << 16) Or tri.id - - x1 = p1.x << 8 - x2 = p2.x << 8 - x3 = p3.x << 8 - y1 = p1.y - y2 = p2.y - y3 = p3.y - - x4 = CInt(x1 + (x3 - x1) * (y2 - y1) / (y3 - y1)) - x1 <<= 8 - x2 <<= 8 - x3 <<= 8 - x4 <<= 8 - - z1 = p1.z - z2 = p2.z - z3 = p3.z - nx1 = p1.nx << 16 - nx2 = p2.nx << 16 - nx3 = p3.nx << 16 - ny1 = p1.ny << 16 - ny2 = p2.ny << 16 - ny3 = p3.ny << 16 - - sw1 = 1.0F / p1.sw - sw2 = 1.0F / p2.sw - sw3 = 1.0F / p3.sw - - tx1 = p1.tx * sw1 - tx2 = p2.tx * sw2 - tx3 = p3.tx * sw3 - ty1 = p1.ty * sw1 - ty2 = p2.ty * sw2 - ty3 = p3.ty * sw3 - - dx = (x4 - x2) >> 16 - If dx = 0 Then Exit Sub - - temp = CInt(256 * (y2 - y1) / (y3 - y1)) - - z4 = z1 + ((z3 - z1) >> 8) * temp - nx4 = nx1 + ((nx3 - nx1) >> 8) * temp - ny4 = ny1 + ((ny3 - ny1) >> 8) * temp - - Dim tf As Single = CSng((y2 - y1) / (y3 - y1)) - - tx4 = tx1 + ((tx3 - tx1) * tf) - ty4 = ty1 + ((ty3 - ty1) * tf) - - sw4 = sw1 + ((sw3 - sw1) * tf) - - dz = CInt((z4 - z2) / dx) - dnx = CInt((nx4 - nx2) / dx) - dny = CInt((ny4 - ny2) / dx) - dtx = (tx4 - tx2) / dx - dty = (ty4 - ty2) / dx - dsw = (sw4 - sw2) / dx - - If (dx < 0) Then - temp = x2 - x2 = x4 - x4 = temp - z2 = z4 - tx2 = tx4 - ty2 = ty4 - sw2 = sw4 - nx2 = nx4 - ny2 = ny4 - End If - If (y2 >= 0) Then - dy = y2 - y1 - If dy <> 0 Then - dxL = CInt((x2 - x1) / dy) - dxR = CInt((x4 - x1) / dy) - dzBase = CInt((z2 - z1) / dy) - dnxBase = CInt((nx2 - nx1) / dy) - dnyBase = CInt((ny2 - ny1) / dy) - dtxBase = (tx2 - tx1) / dy - dtyBase = (ty2 - ty1) / dy - dswBase = (sw2 - sw1) / dy - End If - - xBase = x1 - xMax = x1 - zBase = z1 - nxBase = nx1 - nyBase = ny1 - txBase = tx1 - tyBase = ty1 - swBase = sw1 - - If (y1 < 0) Then - xBase -= y1 * dxL - xMax -= y1 * dxR - zBase -= y1 * dzBase - nxBase -= y1 * dnxBase - nyBase -= y1 * dnyBase - txBase -= y1 * dtxBase - tyBase -= y1 * dtyBase - swBase -= y1 * dswBase - y1 = 0 - End If - - y2 = CInt(IIf(y2 < height, y2, height)) - offset = y1 * width - For y = y1 To y2 - 1 'Step y + 1 - renderLine() - Next - End If - - If (y2 < height) Then - dy = y3 - y2 - If dy <> 0 Then - dxL = CInt((x3 - x2) / dy) - dxR = CInt((x3 - x4) / dy) - dzBase = CInt((z3 - z2) / dy) - dnxBase = CInt((nx3 - nx2) / dy) - dnyBase = CInt((ny3 - ny2) / dy) - dtxBase = (tx3 - tx2) / dy - dtyBase = (ty3 - ty2) / dy - dswBase = (sw3 - sw2) / dy - End If - - xBase = x2 - xMax = x4 - zBase = z2 - nxBase = nx2 - nyBase = ny2 - txBase = tx2 - tyBase = ty2 - swBase = sw2 - - If (y2 < 0) Then - xBase -= y2 * dxL - xMax -= y2 * dxR - zBase -= y2 * dzBase - nxBase -= y2 * dnxBase - nyBase -= y2 * dnyBase - txBase -= y2 * dtxBase - tyBase -= y2 * dtyBase - swBase -= y2 * dswBase - y2 = 0 - End If - - y3 = CInt(IIf(y3 < height, y3, height)) - offset = y2 * width - - For y = y2 To y3 - 1 'Step y + 1 - renderLine() - Next - End If - End Sub - - - Private Sub renderLine() - xL = xBase >> 16 - xR = xMax >> 16 - z = zBase - nx = nxBase - ny = nyBase - tx = txBase - ty = tyBase - sw = swBase - - If (xL < 0) Then - z -= xL * dz - nx -= xL * dnx - ny -= xL * dny - tx -= xL * dtx - ty -= xL * dty - sw -= xL * dsw - xL = 0 - End If - xR = CInt(IIf(xR < width, xR, width)) - - If mode = F Then - renderLineF() - ElseIf (mode And SHADED) = P Then - renderLineP() - ElseIf (mode And SHADED) = E Then - renderLineE() - ElseIf (mode And SHADED) = T Then - renderLineT() - ElseIf (mode And SHADED) = (P Or E) Then - renderLinePE() - ElseIf (mode And SHADED) = (P Or T) Then - renderLinePT() - ElseIf (mode And SHADED) = (P Or E Or T) Then - renderLinePET() - End If - - offset += width - xBase += dxL - xMax += dxR - zBase += dzBase - nxBase += dnxBase - nyBase += dnyBase - txBase += dtxBase - tyBase += dtyBase - swBase += dswBase - End Sub - - ' Fast scanline rendering - Private Sub renderLineF() - For x = xL To xR - 1 'Step x + 1 - pos = x + offset - If z < zBuffer(pos) Then - bkgrd = screen.pixels(pos) - c = warp_Color.transparency(bkgrd, currentColor, transparency) - screen.pixels(pos) = c - zBuffer(pos) = z - If useIdBuffer Then idBuffer(pos) = currentId - End If - z += dz - Next - End Sub - - Private Sub renderLineP() - For x = xL To xR - 1 'Step x + 1 - pos = x + offset - If z < zBuffer(pos) Then - lutID = ((nx >> 16) And 255) + (((ny >> 16) And 255) << 8) - bkgrd = screen.pixels(pos) - c = warp_Color.multiply(color, diffuse(lutID)) - s = specular(lutID) - s = warp_Color.scale(s, reflectivity) - c = warp_Color.transparency(bkgrd, c, transparency) - c = warp_Color.add(c, s) - screen.pixels(pos) = c - zBuffer(pos) = z - - If useIdBuffer Then idBuffer(pos) = currentId - End If - z += dz - nx += dnx - ny += dny - Next - - End Sub - - Private Sub renderLineE() - For x = xL To xR - 1 'Step x + 1 - pos = x + offset - If z < zBuffer(pos) Then - lutID = ((nx >> 16) And 255) + (((ny >> 16) And 255) << 8) - bkgrd = screen.pixels(pos) - s = warp_Color.add(specular(lutID), envmap(lutID)) - s = warp_Color.scale(s, reflectivity) - c = warp_Color.transparency(bkgrd, s, transparency) - screen.pixels(pos) = c - zBuffer(pos) = z - - If useIdBuffer Then idBuffer(pos) = currentId - End If - z += dz - nx += dnx - ny += dny - Next - End Sub - - Private Sub renderLineT() - For x = xL To xR - 1 'Step x + 1 - pos = x + offset - If z < zBuffer(pos) Then - bkgrd = screen.pixels(pos) - c = texture.pixel(((CInt(tx / sw)) And tw) + (((CInt(ty / sw)) And th) << tbitW)) - c = warp_Color.transparency(bkgrd, c, transparency) - screen.pixels(pos) = c - zBuffer(pos) = z - - If useIdBuffer Then idBuffer(pos) = currentId - End If - z += dz - tx += dtx - ty += dty - sw += dsw - Next - End Sub - - private sub renderLinePE() - For x = xL To xR - 1 'Step x + 1 - pos = x + offset - If z < zBuffer(pos) Then - lutID = ((nx >> 16) And 255) + (((ny >> 16) And 255) << 8) - - bkgrd = screen.pixels(pos) - c = warp_Color.multiply(color, diffuse(lutID)) - s = warp_Color.add(specular(lutID), envmap(lutID)) - s = warp_Color.scale(s, reflectivity) - c = warp_Color.transparency(bkgrd, c, transparency) - c = warp_Color.add(c, s) - screen.pixels(pos) = c - zBuffer(pos) = z - - If useIdBuffer Then idBuffer(pos) = currentId - End If - z += dz - nx += dnx - ny += dny - Next - End Sub - - Private Sub renderLinePT() - For x = xL To xR - 1 'Step x + 1 - pos = x + offset - If z < zBuffer(pos) Then - lutID = ((nx >> 16) And 255) + (((ny >> 16) And 255) << 8) - - bkgrd = screen.pixels(pos) - c = texture.pixel((CInt(tx / sw) And tw) + ((CInt(ty / sw) And th) << tbitW)) - c = warp_Color.multiply(c, diffuse(lutID)) - s = warp_Color.scale(specular(lutID), reflectivity) - c = warp_Color.transparency(bkgrd, c, transparency) - c = warp_Color.add(c, s) - screen.pixels(pos) = c - zBuffer(pos) = z - - If useIdBuffer Then idBuffer(pos) = currentId - End If - - z += dz - nx += dnx - ny += dny - tx += dtx - ty += dty - sw += dsw - Next - End Sub - - Private Sub renderLinePET() - For x = xL To xR - 1 'Step x + 1 - pos = x + offset - If z < zBuffer(pos) Then - lutID = ((nx >> 16) And 255) + (((ny >> 16) And 255) << 8) - bkgrd = screen.pixels(pos) - c = texture.pixel((CInt(tx / sw) And tw) + ((CInt(ty / sw) And th) << tbitW)) - c = warp_Color.multiply(c, diffuse(lutID)) - s = warp_Color.add(specular(lutID), envmap(lutID)) - s = warp_Color.scale(s, reflectivity) - c = warp_Color.transparency(bkgrd, c, transparency) - c = warp_Color.add(c, s) - - screen.pixels(pos) = c - zBuffer(pos) = z - If useIdBuffer Then idBuffer(pos) = currentId - End If - z += dz - nx += dnx - ny += dny - tx += dtx - ty += dty - sw += dsw - Next - End Sub - - Private Sub drawWireframe(ByVal tri As warp_Triangle, ByVal defaultcolor As Integer) - drawLine(tri.p1, tri.p2, defaultcolor) - drawLine(tri.p2, tri.p3, defaultcolor) - drawLine(tri.p3, tri.p1, defaultcolor) - End Sub - - Private Sub drawLine(ByVal a As warp_Vertex, ByVal b As warp_Vertex, ByVal color As Integer) - Dim temp As warp_Vertex - If (a.clipcode And b.clipcode) <> 0 Then Exit Sub - - dx = Math.Abs(a.x - b.x) - dy = Math.Abs(a.y - b.y) - dz = 0 - - If dx > dy Then - If a.x > b.x Then - temp = a - a = b - b = temp - End If - - If dx > 0 Then - dz = CInt((b.z - a.z) / dx) - dy = CInt(((b.y - a.y) << 16) / dx) - End If - - z = a.z - y = a.y << 16 - For x = a.x To b.x 'Step x + 1 - y2 = y >> 16 - If warp_Math.inrange(x, 0, width - 1) AndAlso warp_Math.inrange(y2, 0, height - 1) Then - offset = y2 * width - If z < zBuffer(x + offset) Then - screen.pixels(x + offset) = color - zBuffer(x + offset) = z - End If - If useIdBuffer Then idBuffer(x + offset) = currentId - End If - z += dz - y += dy - Next - - Else - - If a.y > b.y Then - temp = a - a = b - b = temp - End If - - If dy > 0 Then - dz = CInt((b.z - a.z) / dy) - dx = CInt(((b.x - a.x) << 16) / dy) - End If - - z = a.z - x = a.x << 16 - For y = a.y To b.y 'Step y + 1 - x2 = x >> 16 - If warp_Math.inrange(x2, 0, width - 1) AndAlso warp_Math.inrange(y, 0, height - 1) Then - offset = y * width - If z < zBuffer(x2 + offset) Then - screen.pixels(x2 + offset) = color - zBuffer(x2 + offset) = z - End If - If useIdBuffer Then idBuffer(x2 + offset) = currentId - End If - z += dz - x += dx - Next - End If - End Sub - End Class -End Namespace \ No newline at end of file diff --git a/trunk/managed/Warp3D/Warp3DVB/warp_RenderPipeline.vb b/trunk/managed/Warp3D/Warp3DVB/warp_RenderPipeline.vb deleted file mode 100644 index dd2f57b9..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/warp_RenderPipeline.vb +++ /dev/null @@ -1,242 +0,0 @@ -' Created by: X -' http://www.createdbyx.com/ -' ---------------------- -' C# to VB.NET conversion of this code was done by hand and with the assistance of the -' Convert C# to VB .NET application availible at http://www.kamalpatel.net/ConvertCSharp2VB.aspx -' ConvertCSharp2VB utility was developed by: Kamal Patel (http://www.KamalPatel.net) -' ---------------------- -' Thanks to Alan Simes ( http://alansimes.blogdns.net/ ) for creating the Warp3D library. -' http://alansimes.blogdns.net/cs/files/default.aspx -' ---------------------- - - -Imports System -Imports System.Collections - -Namespace Rednettle.Warp3D - Public Class warp_RenderPipeline - Implements IDisposable - Public screen As warp_Screen - Dim scene As warp_Scene - Public lightmap As warp_Lightmap - - Private resizingRequested As Boolean = False - Private requestedWidth As Integer - Private requestedHeight As Integer - Private splitOffset As Double - Public useId As Boolean = False - - Dim rasterizer As warp_Rasterizer - - Dim opaqueQueue As ArrayList = New ArrayList() - Dim transparentQueue As ArrayList = New ArrayList() - - Dim zFar As Integer = &HFFFFFF - - Public zBuffer() As Integer - Public idBuffer() As Integer - - - Public Sub New(ByVal scene As warp_Scene, ByVal w As Integer, ByVal h As Integer) - Me.scene = scene - - screen = New warp_Screen(w, h) - ReDim zBuffer(screen.width * screen.height) - rasterizer = New warp_Rasterizer(Me) - End Sub - - Public Function getFPS() As Single - Return (screen.FPS * 100) / 100 - End Function - - Public Sub buildLightMap() - if lightmap is nothing - lightmap = New warp_Lightmap(scene) - Else - lightmap.rebuildLightmap() - End If - - rasterizer.loadLightmap(lightmap) - End Sub - - Public Sub useIdBuffer(ByVal useId As Boolean) - Me.useId = useId - If useId Then - ReDim idBuffer(screen.width * screen.height) - Else - idBuffer = Nothing - End If - End Sub - - Public Sub render(ByVal cam As warp_Camera) - rasterizer.rebuildReferences(Me) - - warp_Math.clearBuffer(zBuffer, zFar) - '//System.Array.Copy(screen.zBuffer,0,zBuffer,0,zBuffer.Length); - - If useId Then - warp_Math.clearBuffer(idBuffer, -1) - End If - If scene.environment.background IsNot Nothing Then - screen.drawBackground(scene.environment.background, 0, 0, screen.width, screen.height) - Else - screen.clear(scene.environment.bgcolor) - End If - - cam.setScreensize(screen.width, screen.height) - scene.prepareForRendering() - emptyQueues() - - '// Project - Dim m As warp_Matrix = warp_Matrix.multiply(cam.getMatrix(), scene.matrix) - Dim nm As warp_Matrix = warp_Matrix.multiply(cam.getNormalMatrix(), scene.normalmatrix) - Dim vertexProjection, normalProjection As warp_Matrix - Dim obj As warp_Object - Dim t As warp_Triangle - Dim v As warp_Vertex - Dim w As Integer = screen.width - Dim h As Integer = screen.height - For id As Integer = scene.objects - 1 To 0 Step -1 - obj = scene.wobject(id) - If obj.visible Then - vertexProjection = obj.matrix.getClone() - normalProjection = obj.normalmatrix.getClone() - vertexProjection.transform(m) - normalProjection.transform(nm) - - For i As Integer = obj.vertices - 1 To 0 Step -1 - v = obj.fastvertex(i) - v.project(vertexProjection, normalProjection, cam) - v.clipFrustrum(w, h) - Next - For i As Integer = obj.triangles - 1 To 0 Step -1 - t = obj.fasttriangle(i) - t.project(normalProjection) - t.clipFrustrum(w, h) - enqueueTriangle(t) - Next - End If - Next - - '//screen.lockImage(); - - Dim tri() As warp_Triangle - tri = getOpaqueQueue() - If tri IsNot Nothing Then - For i As Integer = tri.GetLength(0) - 1 To 0 Step -1 - rasterizer.loadMaterial(tri(i).parent.material) - rasterizer.render(tri(i)) - Next - End If - - tri = getTransparentQueue() - If tri IsNot Nothing Then - For i As Integer = 0 To tri.GetLength(0) - 1 - rasterizer.loadMaterial(tri(i).parent.material) - rasterizer.render(tri(i)) - Next - End If - - '//screen.unlockImage(); - End Sub - - - Private Sub performResizing() - resizingRequested = False - 'screen.resize(requestedWidth, requestedHeight); - - zBuffer = New Integer(screen.width * screen.height) {} - If useId Then - idBuffer = New Integer(screen.width * screen.height) {} - End If - End Sub - - ' Triangle sorting - Private Sub emptyQueues() - opaqueQueue.Clear() - transparentQueue.Clear() - End Sub - - - Private Sub enqueueTriangle(ByVal tri As warp_Triangle) - If tri.parent.material Is Nothing Then - Return - End If - If tri.visible = False Then - Return - End If - If (tri.parent.material.transparency = 255) AndAlso (tri.parent.material.reflectivity = 0) Then - Return - End If - - If tri.parent.material.transparency > 0 Then - transparentQueue.Add(tri) - Else - opaqueQueue.Add(tri) - End If - End Sub - - Private Function getOpaqueQueue() As warp_Triangle() - If opaqueQueue.Count = 0 Then Return Nothing - - Dim enumerator As IEnumerator = opaqueQueue.GetEnumerator() - Dim tri(opaqueQueue.Count) As warp_Triangle - - Dim id As Integer = 0 - While enumerator.MoveNext() - tri(id) = CType(enumerator.Current, Warp3D.warp_Triangle) - id += 1 - End While - - Return sortTriangles(tri, 0, tri.GetLength(0) - 1) - End Function - - Private Function getTransparentQueue() As warp_Triangle() - If transparentQueue.Count = 0 Then Return Nothing - Dim enumerator As IEnumerator = transparentQueue.GetEnumerator() - Dim tri(transparentQueue.Count) As warp_Triangle - - Dim id As Integer = 0 - While enumerator.MoveNext() - tri(id) = CType(enumerator.Current, Warp3D.warp_Triangle) - id += 1 - End While - - Return sortTriangles(tri, 0, tri.GetLength(0) - 1) - End Function - - Private Function sortTriangles(ByVal tri() As warp_Triangle, ByVal L As Integer, ByVal R As Integer) As warp_Triangle() - Dim m As Single = (tri(L).dist + tri(R).dist) / 2 - Dim i As Integer = L - Dim j As Integer = R - Dim temp As warp_Triangle - - Do - While tri(i).dist > m - i += 1 - End While - While tri(j).dist < m - j -= 1 - End While - - If i <= j Then - temp = tri(i) - tri(i) = tri(j) - tri(j) = temp - i += 1 - j -= 1 - End If - - Loop While j >= i - - If L < j Then sortTriangles(tri, L, j) - If R > i Then sortTriangles(tri, i, R) - - Return tri - End Function - - Public Sub Dispose() Implements IDisposable.Dispose - - End Sub - End Class -End Namespace \ No newline at end of file diff --git a/trunk/managed/Warp3D/Warp3DVB/warp_Scene.vb b/trunk/managed/Warp3D/Warp3DVB/warp_Scene.vb deleted file mode 100644 index 3a58b04d..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/warp_Scene.vb +++ /dev/null @@ -1,325 +0,0 @@ -' Created by: X -' http://www.createdbyx.com/ -' ---------------------- -' C# to VB.NET conversion of this code was done by hand and with the assistance of the -' Convert C# to VB .NET application availible at http://www.kamalpatel.net/ConvertCSharp2VB.aspx -' ConvertCSharp2VB utility was developed by: Kamal Patel (http://www.KamalPatel.net) -' ---------------------- -' Thanks to Alan Simes ( http://alansimes.blogdns.net/ ) for creating the Warp3D library. -' http://alansimes.blogdns.net/cs/files/default.aspx -' ---------------------- - -Imports System -Imports System.Collections -Imports System.Drawing -Imports System.Timers - -Namespace Rednettle.Warp3D - '/ - '/ Summary description for warp_Scene. - '/ - Public Class warp_Scene - Inherits warp_CoreObject - Public Shared version As String = "1.0.0" - Public Shared release As String = "0010" - - Public renderPipeline As warp_RenderPipeline - Public width As Integer, height As Integer - - Public environment As New warp_Environment '= New warp_Environment() - Public defaultCamera As warp_Camera = warp_Camera.FRONT() - - Public wobject() As warp_Object - Public light() As warp_Light - - Public objects As Integer = 0 - Public lights As Integer = 0 - - Private objectsNeedRebuild As Boolean = True - Private lightsNeedRebuild As Boolean = True - - Protected preparedForRendering As Boolean = False - - Public normalizedOffset As warp_Vector = New warp_Vector(0.0F, 0.0F, 0.0F) - Public normalizedScale As Single = 1.0F - Private Shared instancesRunning As Boolean = False - - Public objectData As Hashtable = New Hashtable() - Public lightData As Hashtable = New Hashtable() - Public materialData As Hashtable = New Hashtable() - Public cameraData As Hashtable = New Hashtable() - - Dim probes As Integer = 0 - Dim perf As Integer = 0 - - Public fps As String = "0" - - Public rendertime As Integer = 500 - - Public Sub New() - End Sub - - Public Sub New(ByVal w As Integer, ByVal h As Integer) - showInfo() - width = w - height = h - renderPipeline = New warp_RenderPipeline(Me, w, h) - End Sub - - Public Sub showInfo() - If instancesRunning Then Exit Sub - - System.Console.WriteLine() - System.Console.WriteLine("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~") - System.Console.WriteLine("WARP 3D Kernel " + version + " [Build " + release + "]") - System.Console.WriteLine("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~") - - instancesRunning = True - End Sub - - Public Sub removeAllObjects() - objectData = New Hashtable() - objectsNeedRebuild = True - rebuild() - End Sub - - Public Sub rebuild() - - If objectsNeedRebuild Then - - objectsNeedRebuild = False - - objects = objectData.Count - wobject = New warp_Object(objects - 1) {} - Dim enumerator As IDictionaryEnumerator = objectData.GetEnumerator() - - For i As Integer = objects - 1 To 0 Step -1 - enumerator.MoveNext() - wobject(i) = CType(enumerator.Value, warp_Object) - - wobject(i).id = i - wobject(i).rebuild() - Next - End If - - If lightsNeedRebuild Then - lightsNeedRebuild = False - lights = lightData.Count - light = New warp_Light(lights - 1) {} - Dim enumerator As IDictionaryEnumerator = lightData.GetEnumerator() - For i As Integer = lights - 1 To 0 Step -1 - enumerator.MoveNext() - light(i) = CType(enumerator.Value, warp_Light) - - Next - End If - End Sub - - Public Function sceneobject(ByVal key As String) As warp_Object - Return CType(objectData(key), warp_Object) - End Function - - Public Function material(ByVal key As String) As warp_Material - Return CType(materialData(key), warp_Material) - End Function - - Public Function camera(ByVal key As String) As warp_Camera - Return CType(cameraData(key), warp_Camera) - End Function - - Public Sub addObject(ByVal key As String, ByVal obj As warp_Object) - obj.name = key - objectData.Add(key, obj) - obj.parent = Me - objectsNeedRebuild = True - End Sub - - Public Sub removeObject(ByVal key As String) - objectData.Remove(key) - objectsNeedRebuild = True - preparedForRendering = False - End Sub - - Public Sub addMaterial(ByVal key As String, ByVal m As warp_Material) - materialData.Add(key, m) - End Sub - - Public Sub removeMaterial(ByVal key As String) - materialData.Remove(key) - End Sub - - Public Sub addCamera(ByVal key As String, ByVal c As warp_Camera) - cameraData.Add(key, c) - End Sub - - Public Sub removeCamera(ByVal key As String) - cameraData.Remove(key) - End Sub - - Public Sub addLight(ByVal key As String, ByVal l As warp_Light) - lightData.Add(key, l) - lightsNeedRebuild = True - End Sub - - Public Sub removeLight(ByVal key As String) - lightData.Remove(key) - lightsNeedRebuild = True - preparedForRendering = False - End Sub - - Public Sub prepareForRendering() - If preparedForRendering = True Then - Return - End If - preparedForRendering = True - - System.Console.WriteLine("warp_Scene| prepareForRendering : Preparing for realtime rendering ...") - rebuild() - renderPipeline.buildLightMap() - printSceneInfo() - End Sub - - Public Sub printSceneInfo() - System.Console.WriteLine("warp_Scene| Objects : " & objects) - System.Console.WriteLine("warp_Scene| Vertices : " & countVertices()) - System.Console.WriteLine("warp_Scene| Triangles : " & countTriangles()) - End Sub - - Public Sub render() - - Dim n As DateTime = DateTime.Now - renderPipeline.render(Me.defaultCamera) - - Dim s As TimeSpan = DateTime.Now - n - - perf += s.Milliseconds - probes += 1 - If probes = 32 Then - probes = 0 - fps = (perf / 32) & "," & (1000 / (perf / 32)) - - perf = 0 - End If - - End Sub - - Public Function getImage() As Bitmap - Return renderPipeline.screen.getImage() - End Function - - Public Function getFPS() As String - Return fps '& " - yes" - End Function - ' - ' Public java.awt.Dimension size() - ' { - ' Return New java.awt.Dimension(width,height) - ' } - ' */ - - Public Sub setBackgroundColor(ByVal bgcolor As Integer) - environment.bgcolor = bgcolor - End Sub - - Public Sub setBackground(ByVal t As warp_Texture) - environment.setBackground(t) - End Sub - - Public Sub setAmbient(ByVal ambientcolor As Integer) - environment.ambient = ambientcolor - End Sub - - - Public Function countVertices() As Integer - Dim counter As Integer = 0 - For i As Integer = 0 To objects - 1 'Step i + 1 - counter += wobject(i).vertices - Next - Return counter - End Function - - Public Function countTriangles() As Integer - Dim counter As Integer = 0 - - For i As Integer = 0 To objects - 1 'Step i + 1 - counter += wobject(i).triangles - Next - Return counter - End Function - - Public Sub useIdBuffer(ByVal buffer As Boolean) - renderPipeline.useIdBuffer(Buffer) - End Sub - - Public Function identifyTriangleAt(ByVal xpos As Integer, ByVal ypos As Integer) As warp_Triangle - If Not renderPipeline.useId Then Return Nothing - If xpos < 0 Or xpos >= width Then Return Nothing - If ypos < 0 Or ypos >= height Then Return Nothing - - Dim pos As Integer = xpos + renderPipeline.screen.width * ypos - Dim idCode As Integer = renderPipeline.idBuffer(pos) - If idCode < 0 Then Return Nothing - - Return wobject(idCode >> 16).fasttriangle(idCode And &HFFFF) - End Function - - Public Function identifyObjectAt(ByVal xpos As Integer, ByVal ypos As Integer) As warp_Object - Dim tri As warp_Triangle = identifyTriangleAt(xpos, ypos) - If tri Is Nothing Then Return Nothing - Return tri.parent - End Function - - Public Sub normalize() - objectsNeedRebuild = True - rebuild() - - Dim min As warp_Vector, max As warp_Vector, tempmax As warp_Vector, tempmin As warp_Vector - If objects = 0 Then Exit Sub - - matrix = New warp_Matrix() - normalmatrix = New warp_Matrix() - - max = wobject(0).maximum() - min = wobject(0).maximum() - - For i As Integer = 0 To objects - 1 'Step i + 1 - tempmax = wobject(i).maximum() - tempmin = wobject(i).maximum() - If tempmax.x > max.x Then - max.x = tempmax.x - End If - If tempmax.y > max.y Then - max.y = tempmax.y - End If - If tempmax.z > max.z Then - max.z = tempmax.z - End If - If tempmin.x < min.x Then - min.x = tempmin.x - End If - If tempmin.y < min.y Then - min.y = tempmin.y - End If - If tempmin.z < min.z Then - min.z = tempmin.z - End If - Next - Dim xdist As Single = max.x - min.x - Dim ydist As Single = max.y - min.y - Dim zdist As Single = max.z - min.z - Dim xmed As Single = (max.x + min.x) / 2 - Dim ymed As Single = (max.y + min.y) / 2 - Dim zmed As Single = (max.z + min.z) / 2 - - Dim diameter As Single - If xdist > ydist Then diameter = xdist Else diameter = ydist - If zdist > diameter Then diameter = zdist - - normalizedOffset = New warp_Vector(xmed, ymed, zmed) - normalizedScale = 2 / diameter - - shift(normalizedOffset.reverse()) - scale(normalizedScale) - End Sub - End Class -End Namespace diff --git a/trunk/managed/Warp3D/Warp3DVB/warp_Screen.vb b/trunk/managed/Warp3D/Warp3DVB/warp_Screen.vb deleted file mode 100644 index a2ccd2dd..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/warp_Screen.vb +++ /dev/null @@ -1,159 +0,0 @@ -' Created by: X -' http://www.createdbyx.com/ -' ---------------------- -' C# to VB.NET conversion of this code was done by hand and with the assistance of the -' Convert C# to VB .NET application availible at http://www.kamalpatel.net/ConvertCSharp2VB.aspx -' ConvertCSharp2VB utility was developed by: Kamal Patel (http://www.KamalPatel.net) -' ---------------------- -' Thanks to Alan Simes ( http://alansimes.blogdns.net/ ) for creating the Warp3D library. -' http://alansimes.blogdns.net/cs/files/default.aspx -' ---------------------- - -Imports System -Imports System.Drawing -Imports System.Drawing.Imaging -Imports System.Runtime.InteropServices - -Namespace Rednettle.Warp3D - Public Class warp_Screen - Implements IDisposable - - Public width As Integer - Public height As Integer - - ' benchmark stuff - Private timestamp As DateTime - Private time As DateTime - Private probes As Integer = 32 - Public FPS As Single = 0 - - Dim image As Bitmap = Nothing - Public pixels() As Integer - Private handle As GCHandle - - Public Sub New(ByVal w As Integer, ByVal h As Integer) - width = w - height = h - - pixels = New Integer(w * h) {} - - handle = GCHandle.Alloc(pixels, GCHandleType.Pinned) - Dim pointer As IntPtr = Marshal.UnsafeAddrOfPinnedArrayElement(pixels, 0) - - image = New Bitmap(w, h, w * 4, PixelFormat.Format32bppPArgb, pointer) - End Sub - - Public Sub clear(ByVal c As Integer) - warp_Math.clearBuffer(pixels, &HFF000000 Or c) - End Sub - - Public Sub draw(ByVal texture As warp_Texture, ByVal posx As Integer, ByVal posy As Integer, ByVal xsize As Integer, ByVal ysize As Integer) - draw(width, height, texture, posx, posy, xsize, ysize) - End Sub - - Public Sub drawBackground(ByVal texture As warp_Texture, ByVal posx As Integer, ByVal posy As Integer, ByVal xsize As Integer, ByVal ysize As Integer) - draw(width, height, texture, posx, posy, xsize, ysize) - End Sub - - Public Function getImage() As Bitmap - Return image - End Function - - Private Sub draw(ByVal width As Integer, ByVal height As Integer, ByVal texture As warp_Texture, ByVal posx As Integer, ByVal posy As Integer, ByVal xsize As Integer, ByVal ysize As Integer) - If texture Is Nothing Then Return - - Dim w As Integer = xsize - Dim h As Integer = ysize - Dim xBase As Integer = posx - Dim yBase As Integer = posy - Dim tx As Integer = texture.width * 255 - Dim ty As Integer = texture.height * 255 - Dim tw As Integer = texture.width - Dim dtx As Integer = CInt(tx / w) - Dim dty As Integer = CInt(ty / h) - Dim txBase As Integer = warp_Math.crop(-xBase * dtx, 0, 255 * tx) - Dim tyBase As Integer = warp_Math.crop(-yBase * dty, 0, 255 * ty) - Dim xend As Integer = warp_Math.crop(xBase + w, 0, width) - Dim yend As Integer = warp_Math.crop(yBase + h, 0, height) - Dim offset1 As Integer, offset2 As Integer - xBase = warp_Math.crop(xBase, 0, width) - yBase = warp_Math.crop(yBase, 0, height) - - ty = tyBase - Dim j As Integer - For j = yBase To yend - 1 'Step j + 1 - tx = txBase - offset1 = j * width - offset2 = (ty >> 8) * tw - Dim i As Integer - For i = xBase To xend - 1 'Step i + 1 - pixels(i + offset1) = &HFF000000 Or texture.pixel((tx >> 8) + offset2) - tx += dtx - Next - ty += dty - Next - End Sub - - Public Sub add(ByVal texture As warp_Texture, ByVal posx As Integer, ByVal posy As Integer, ByVal xsize As Integer, ByVal ysize As Integer) - add(width, height, texture, posx, posy, xsize, ysize) - End Sub - - Private Sub add(ByVal width As Integer, ByVal height As Integer, ByVal texture As warp_Texture, ByVal posx As Integer, ByVal posy As Integer, ByVal xsize As Integer, ByVal ysize As Integer) - If texture Is Nothing Then Return - - Dim w As Integer = xsize - Dim h As Integer = ysize - Dim xBase As Integer = posx - Dim yBase As Integer = posy - Dim tx As Integer = texture.width * 255 - Dim ty As Integer = texture.height * 255 - Dim tw As Integer = texture.width - Dim dtx As Integer = CInt(tx / w) - Dim dty As Integer = CInt(ty / h) - Dim txBase As Integer = warp_Math.crop(-xBase * dtx, 0, 255 * tx) - Dim tyBase As Integer = warp_Math.crop(-yBase * dty, 0, 255 * ty) - Dim xend As Integer = warp_Math.crop(xBase + w, 0, width) - Dim yend As Integer = warp_Math.crop(yBase + h, 0, height) - Dim pos As Integer, offset1 As Integer, offset2 As Integer - xBase = warp_Math.crop(xBase, 0, width) - yBase = warp_Math.crop(yBase, 0, height) - - ty = tyBase - Dim j As Integer - For j = yBase To yend - 1 'Step j + 1 - tx = txBase - offset1 = j * width - offset2 = (ty >> 8) * tw - Dim i As Integer - For i = xBase To xend - 1 'Step i + 1 - pixels(i + offset1) = &HFF000000 Or warp_Color.add(texture.pixel((tx >> 8) + offset2), pixels(i + offset1)) - tx += dtx - Next - ty += dty - Next - End Sub - - Private Sub performBench() - probes += 1 - If probes > 32 Then - time = DateTime.Now - Dim span As TimeSpan = time - timestamp - - FPS = 32.0F / (span.Milliseconds / 1000.0F) - - timestamp = time - probes = 0 - End If - End Sub - - Public Sub Dispose() Implements IDisposable.Dispose - If Not image Is Nothing Then - handle.Free() - image.Dispose() - image = Nothing - pixels = Nothing - End If - End Sub - - End Class -End Namespace diff --git a/trunk/managed/Warp3D/Warp3DVB/warp_Texture.vb b/trunk/managed/Warp3D/Warp3DVB/warp_Texture.vb deleted file mode 100644 index 8aac7a6e..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/warp_Texture.vb +++ /dev/null @@ -1,227 +0,0 @@ -' Created by: X -' http://www.createdbyx.com/ -' ---------------------- -' C# to VB.NET conversion of this code was done by hand and with the assistance of the -' Convert C# to VB .NET application availible at http://www.kamalpatel.net/ConvertCSharp2VB.aspx -' ConvertCSharp2VB utility was developed by: Kamal Patel (http://www.KamalPatel.net) -' ---------------------- -' Thanks to Alan Simes ( http://alansimes.blogdns.net/ ) for creating the Warp3D library. -' http://alansimes.blogdns.net/cs/files/default.aspx -' ---------------------- - -Imports System -Imports System.Drawing -Imports System.Drawing.Imaging -Imports System.Net - -Namespace Rednettle.Warp3D - '/ - '/ Summary description for warp_Texture. - '/ - - Public Class warp_Texture - Public width As Integer - Public height As Integer - Public bitWidth As Integer - Public bitHeight As Integer - Public pixel() As Integer - Public path As String = Nothing - - Public Shared ALPHA As Integer = &HFF000000 ' alpha mask - - Public Sub New(ByVal w As Integer, ByVal h As Integer) - height = h - width = w - pixel = New Integer(w * h) {} - cls() - End Sub - - Public Sub New(ByVal w As Integer, ByVal h As Integer, ByVal data() As Integer) - height = h - width = w - pixel = New Integer(width * height) {} - - System.Array.Copy(data, pixel, pixel.Length) - End Sub - - Public Sub New(ByVal path As String) - Dim map As Bitmap - - If path.StartsWith("http") Then - Dim webrq As WebRequest = WebRequest.Create(path) - map = CType(Bitmap.FromStream(webrq.GetResponse().GetResponseStream()), Bitmap) - Else - map = New Bitmap(path, False) - End If - - loadTexture(map) - End Sub - - - Public Sub resize() - Dim log2inv As Double = 1 / Math.Log(2) - - ' int w = ( int )Math.Pow( 2, bitWidth = ( int )Math.Ceiling( ( Math.Log( width ) * log2inv ) ) ); - ' int h = ( int )Math.Pow( 2, bitHeight = ( int )Math.Ceiling( ( Math.Log( height ) * log2inv ) ) ); - bitWidth = CInt(Math.Ceiling(Math.Log(width) * log2inv)) - bitHeight = CInt(Math.Ceiling(Math.Log(height) * log2inv)) - Dim w As Integer = CInt(Math.Pow(2, bitWidth)) - Dim h As Integer = CInt(Math.Pow(2, bitHeight)) - - If Not (w = width AndAlso h = height) Then resize(w, h) - End Sub - - - Public Sub resize(ByVal w As Integer, ByVal h As Integer) - ' System.Console.WriteLine("warp_Texture| resize :" + w + "," + h) - setSize(w, h) - End Sub - - Public Sub cls() - warp_Math.clearBuffer(pixel, 0) - End Sub - - Public Function toAverage() As warp_Texture - Dim i As Integer - For i = width * height - 1 To 0 Step -1 - pixel(i) = warp_Color.getAverage(pixel(i)) - Next - - Return Me - End Function - - Public Function toGray() As warp_Texture - Dim i As Integer - For i = width * height - 1 To 0 Step -1 - pixel(i) = warp_Color.getGray(pixel(i)) - Next - - Return Me - End Function - - Public Function valToGray() As warp_Texture - Dim intensity As Integer - Dim i As Integer - For i = width * height - 1 To 0 Step -1 - intensity = warp_Math.crop(pixel(i), 0, 255) - pixel(i) = warp_Color.getColor(intensity, intensity, intensity) - Next - - Return Me - End Function - - Public Function colorize(ByVal pal() As Integer) As warp_Texture - Dim range As Integer = pal.GetLength(0) - 1 - Dim i As Integer - For i = width * height - 1 To 0 Step -1 - pixel(i) = pal(warp_Math.crop(pixel(i), 0, range)) - Next - - Return Me - End Function - - Private Sub loadTexture(ByVal map As Bitmap) - width = map.Width - height = map.Height - - pixel = New Integer((width * height) - 1) {} - - 'Dim scanline As Integer = bmData.Stride - 'Dim Scan0 As System.IntPtr = bmData.Scan0 - Dim pIndex As Integer = 0 - ' Dim *p As Byte = (Byte *)(void *)Scan0 - 'Dim nOffset As Integer = bmData.Stride - map.Width * 3 - Dim nPixel As Integer = 0 - Dim p((width * height * 3) - 1) As Byte - - Dim bmData As BitmapData = map.LockBits(New Rectangle(0, 0, map.Width, map.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb) - System.Runtime.InteropServices.Marshal.Copy(bmData.Scan0, p, 0, p.Length) - map.UnlockBits(bmData) - - For i As Integer = 0 To map.Height - 1 'Step i + 1 - For j As Integer = 0 To map.Width - 1 'Step j + 1 - ' Dim Col As Color - ' Col = map.GetPixel(j, i) - Dim blue As Integer = p(pIndex) 'Col.B - Dim green As Integer = p(pIndex + 1) 'Col.G - Dim red As Integer = p(pIndex + 2) 'Col.R - pixel(nPixel) = ALPHA Or red << 16 Or green << 8 Or blue - nPixel += 1 - - pIndex += 3 - Next - - ' pIndex += nOffset - Next - - resize() - End Sub - - 'Private Sub loadTexture(ByVal map As Bitmap) - ' width = map.Width - ' height = map.Height - - ' pixel = New Integer((width * height) - 1) {} - - ' Dim bmData As BitmapData = map.LockBits(New Rectangle(0, 0, map.Width, map.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb) - ' Dim scanline As Integer = bmData.Stride - ' Dim Scan0 As System.IntPtr = bmData.Scan0 - ' Dim pIndex As Integer = 0 - ' ' Dim *p As Byte = (Byte *)(void *)Scan0 - ' Dim nOffset As Integer = bmData.Stride - map.Width * 3 - ' Dim nPixel As Integer = 0 - ' Dim p(width * height * 3) As Byte - - ' System.Runtime.InteropServices.Marshal.Copy(Scan0, p, nOffset, p.Length) - - ' For i As Integer = 0 To map.Height - 1 'Step i + 1 - ' For j As Integer = 0 To map.Width - 1 'Step j + 1 - ' Dim blue As Integer = p(pIndex) - ' Dim green As Integer = p(pIndex + 1) - ' Dim red As Integer = p(pIndex + 2) - ' pixel(nPixel) = ALPHA Or red << 16 Or green << 8 Or blue - ' nPixel += 1 - - ' pIndex += 3 - ' Next - - ' pIndex += nOffset - ' Next - - ' map.UnlockBits(bmData) - ' resize() - 'End Sub - - Private Sub setSize(ByVal w As Integer, ByVal h As Integer) - Dim offset As Integer = w * h - Dim offset2 As Integer - If w * h <> 0 Then - Dim Newpixels() As Integer = New Integer(w * h) {} - Dim j As Integer - For j = h - 1 To 0 Step -1 - offset -= w - offset2 = CInt((j * height / h) * width) - Dim i As Integer - For i = w - 1 To 0 Step -1 - Newpixels(i + offset) = pixel(CInt((i * width / w) + offset2)) - Next - Next - - width = w - height = h - pixel = Newpixels - End If - End Sub - - Private Function inrange(ByVal a As Integer, ByVal b As Integer, ByVal c As Integer) As Boolean - Return (a >= b) And (a < c) - End Function - - Public Function getClone() As warp_Texture - Dim t As warp_Texture = New warp_Texture(width, height) - warp_Math.copyBuffer(pixel, t.pixel) - Return t - End Function - - End Class -End Namespace \ No newline at end of file diff --git a/trunk/managed/Warp3D/Warp3DVB/warp_TextureFactory.vb b/trunk/managed/Warp3D/Warp3DVB/warp_TextureFactory.vb deleted file mode 100644 index eb2f91d6..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/warp_TextureFactory.vb +++ /dev/null @@ -1,205 +0,0 @@ -' Created by: X -' http://www.createdbyx.com/ -' ---------------------- -' C# to VB.NET conversion of this code was done by hand and with the assistance of the -' Convert C# to VB .NET application availible at http://www.kamalpatel.net/ConvertCSharp2VB.aspx -' ConvertCSharp2VB utility was developed by: Kamal Patel (http://www.KamalPatel.net) -' ---------------------- -' Thanks to Alan Simes ( http://alansimes.blogdns.net/ ) for creating the Warp3D library. -' http://alansimes.blogdns.net/cs/files/default.aspx -' ---------------------- - -Imports System - -namespace Rednettle.Warp3D - Public Class warp_TextureFactory - - Public Const pi As Single = 3.14159274F - Public Const deg2rad As Single = pi / 180 - Private Shared noiseBuffer(,) As Single - Private Shared noiseBufferInitialized As Boolean = False - Shared minx, maxx, miny, maxy As Integer - Public Const ALPHA As Integer = &HFF000000 ' // alpha mask - - Private Sub New() - - End Sub - - Public Shared Function SKY(ByVal w As Integer, ByVal h As Integer, ByVal density As Single) As warp_Texture - Dim colors() As Integer = New Integer(1) {} - colors(0) = &H3399 - colors(1) = &HFFFFFF - Return PERLIN(w, h, 0.5F, 2.8F * density, 8, 1024).colorize(warp_Color.makeGradient(colors, 1024)) - End Function - - Public Shared Function MARBLE(ByVal w As Integer, ByVal h As Integer, ByVal density As Single) As warp_Texture - Dim colors() As Integer = New Integer(2) {} - colors(0) = &H111111 - colors(1) = &H696070 - colors(2) = &HFFFFFF - Return WAVE(w, h, 0.5F, 0.64F * density, 6, 1024).colorize(warp_Color.makeGradient(colors, 1024)) - End Function - - Public Shared Function WOOD(ByVal w As Integer, ByVal h As Integer, ByVal density As Single) As warp_Texture - Dim colors() As Integer = New Integer(2) {} - colors(0) = &H332211 - colors(1) = &H523121 - colors(2) = &H996633 - - Return GRAIN(w, h, 0.5F, 3.0F * density, 3, 8, 1024).colorize(warp_Color.makeGradient(colors, 1024)) - End Function - - Public Shared Function PERLIN(ByVal w As Integer, ByVal h As Integer, ByVal persistency As Single, ByVal density As Single, ByVal samples As Integer, ByVal scale As Integer) As warp_Texture - initNoiseBuffer() - Dim t As warp_Texture = New warp_Texture(w, h) - Dim pos As Integer = 0 - Dim wavelength As Single = CSng(IIf(w > h, w, h)) / density - - Dim y As Integer - For y = 0 To h - 1 'Step y + 1 - Dim x As Integer - For x = 0 To w - 1 ' Step x + 1 - t.pixel(pos) = CInt(scale * perlin2d(x, y, wavelength, persistency, samples)) - pos += 1 - Next - Next - Return t - End Function - - - Public Shared Function WAVE(ByVal w As Integer, ByVal h As Integer, ByVal persistency As Single, ByVal density As Single, ByVal samples As Integer, ByVal scale As Integer) As warp_Texture - initnoisebuffer() - Dim t As warp_Texture = New warp_Texture(w, h) - Dim pos As Integer = 0 - Dim wavelength As Single - If w > h Then wavelength = w / density Else wavelength = h / density - - For y As Integer = 0 To h - 1 'Step y + 1 - For x As Integer = 0 To w - 1 'Step x + 1 - t.pixel(pos) = CInt(CDbl(scale) * Math.Sin(32 * perlin2d(x, y, wavelength, persistency, samples)) * 0.5 + 0.5) - pos += 1 - Next - Next - Return t - End Function - - - Public Shared Function GRAIN(ByVal w As Integer, ByVal h As Integer, ByVal persistency As Single, ByVal density As Single, ByVal samples As Integer, ByVal levels As Integer, ByVal scale As Integer) As warp_Texture - ' TIP: For wooden textures - initNoiseBuffer() - Dim t As warp_Texture = New warp_Texture(w, h) - Dim pos As Integer = 0 - Dim wavelength As Single - If w > h Then wavelength = w / density Else wavelength = h / density - Dim perlin As Single - - For y As Integer = 0 To h - 1 'Step y + 1 - For x As Integer = 0 To w - 1 'Step x + 1 - perlin = CSng(levels) * perlin2d(x, y, wavelength, persistency, samples) - t.pixel(pos) = CInt(CSng(scale) * (perlin - CSng(CInt(perlin)))) - pos += 1 - Next - Next - Return t - End Function - - ' // Perlin noise functions - - Private Shared Function perlin2d(ByVal x As Single, ByVal y As Single, ByVal wavelength As Single, ByVal persistence As Single, ByVal samples As Integer) As Single - Dim sum As Single = 0 - Dim freq As Single = 1.0F / wavelength - Dim amp As Single = persistence - Dim range As Single = 0 - - For i As Integer = 0 To samples - 1 - sum += amp * interpolatedNoise(x * freq, y * freq, i) - range += amp - amp *= persistence - freq *= 2 - Next - Return warp_Math.crop(sum / persistence * 0.5F + 0.5F, 0, 1) - End Function - - '// Helper methods - - Private Shared Function interpolatedNoise(ByVal x As Single, ByVal y As Single, ByVal octave As Integer) As Single - Dim intx As Integer = CInt(x) - Dim inty As Integer = CInt(y) - Dim fracx As Single = x - CSng(intx) - Dim fracy As Single = y - CSng(inty) - - Dim i1 As Single = warp_Math.interpolate(noise(intx, inty, octave), noise(intx + 1, inty, octave), fracx) - Dim i2 As Single = warp_Math.interpolate(noise(intx, inty + 1, octave), noise(intx + 1, inty + 1, octave), fracx) - - Return warp_Math.interpolate(i1, i2, fracy) - End Function - - Private Shared Function smoothNoise(ByVal x As Integer, ByVal y As Integer, ByVal o As Integer) As Single - Return (noise(x - 1, y - 1, o) + noise(x + 1, y - 1, o) + _ - noise(x - 1, y + 1, o) + noise(x + 1, y + 1, o)) / 16 + _ - (noise(x - 1, y, o) + noise(x + 1, y, o) + noise(x, y - 1, o) + _ - noise(x, y + 1, o)) / 8 + noise(x, y, o) / 4 - End Function - - Private Shared Function noise(ByVal x As Integer, ByVal y As Integer, ByVal octave As Integer) As Single - Return noiseBuffer(octave And 3, (x + y * 57) And 8191) - End Function - - Private Shared Function noise(ByVal seed As Integer, ByVal octave As Integer) As Single - Dim id As Integer = octave And 3 - Dim n As Integer = CInt((seed << 13) ^ seed) - - If id = 0 Then - Return (1.0F - _ - ((n * (n * n * 15731 + 789221) + 1376312589) And _ - &H7FFFFFFF) * _ - 9.313226E-10F) - End If - If id = 1 Then - Return (1.0F - _ - ((n * (n * n * 12497 + 604727) + 1345679039) And _ - &H7FFFFFFF) * _ - 9.313226E-10F) - End If - If id = 2 Then - Return (1.0F - _ - ((n * (n * n * 19087 + 659047) + 1345679627) And _ - &H7FFFFFFF) * _ - 9.313226E-10F) - End If - Return (1.0F - _ - ((n * (n * n * 16267 + 694541) + 1345679501) And _ - &H7FFFFFFF) * _ - 9.313226E-10F) - End Function - - Private Shared Sub initNoiseBuffer() - If noiseBufferInitialized Then Return - - noiseBuffer = New Single(3, 8191) {} - Dim octave As Integer - For octave = 0 To 3 '4 - 1 'Step octave + 1 - Dim i As Integer - For i = 0 To 8191 ' - 1 'Step i + 1 - noiseBuffer(octave, i) = noise(i, octave) - Next - Next - noiseBufferInitialized = True - End Sub - - Public Shared Function CHECKERBOARD(ByVal w As Integer, ByVal h As Integer, ByVal cellbits As Integer, ByVal oddColor As Integer, ByVal evenColor As Integer) As warp_Texture - Dim t As New warp_Texture(w, h) - - Dim pos As Integer = 0 - For y As Integer = 0 To h - 1 - For x As Integer = 0 To w - 1 - Dim c As Integer = CInt(IIf((((x >> cellbits) + (y >> cellbits)) And 1) = 0, evenColor, oddColor)) - t.pixel(pos) = c - pos += 1 - Next - Next - - Return t - End Function - End Class -End Namespace \ No newline at end of file diff --git a/trunk/managed/Warp3D/Warp3DVB/warp_TextureProjector.vb b/trunk/managed/Warp3D/Warp3DVB/warp_TextureProjector.vb deleted file mode 100644 index 37e9850c..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/warp_TextureProjector.vb +++ /dev/null @@ -1,59 +0,0 @@ -' Created by: X -' http://www.createdbyx.com/ -' ---------------------- -' C# to VB.NET conversion of this code was done by hand and with the assistance of the -' Convert C# to VB .NET application availible at http://www.kamalpatel.net/ConvertCSharp2VB.aspx -' ConvertCSharp2VB utility was developed by: Kamal Patel (http://www.KamalPatel.net) -' ---------------------- -' Thanks to Alan Simes ( http://alansimes.blogdns.net/ ) for creating the Warp3D library. -' http://alansimes.blogdns.net/cs/files/default.aspx -' ---------------------- - -Imports System - -Namespace Rednettle.Warp3D - '/ - '/ Summary description for warp_TextureProjector. - '/ - Public Class warp_TextureProjector - Public Shared Sub projectFrontal(ByVal obj As warp_Object) - obj.rebuild() - Dim min As warp_Vector = obj.minimum() - Dim max As warp_Vector = obj.maximum() - Dim du As Single = 1 / (max.x - min.x) - Dim dv As Single = 1 / (max.y - min.y) - - Dim i As Integer - For i = 0 To obj.vertices - 1 Step i + 1 - obj.fastvertex(i).u = (obj.fastvertex(i).pos.x - min.x) * du - obj.fastvertex(i).v = 1 - (obj.fastvertex(i).pos.y - min.y) * dv - Next - End Sub - - Public Shared Sub projectTop(ByVal obj As warp_Object) - obj.rebuild() - Dim min As warp_Vector = obj.minimum() - Dim max As warp_Vector = obj.maximum() - Dim du As Single = 1 / (max.x - min.x) - Dim dv As Single = 1 / (max.z - min.z) - Dim i As Integer - For i = 0 To obj.vertices - 1 Step i + 1 - obj.fastvertex(i).u = (obj.fastvertex(i).pos.x - min.x) * du - obj.fastvertex(i).v = (obj.fastvertex(i).pos.z - min.z) * dv - Next - End Sub - - Public Shared Sub projectCylindric(ByVal obj As warp_Object) - obj.rebuild() - Dim min As warp_Vector = obj.minimum() - Dim max As warp_Vector = obj.maximum() - Dim dz As Single = 1 / (max.z - min.z) - Dim i As Integer - For i = 0 To obj.vertices - 1 Step i + 1 - obj.fastvertex(i).pos.buildCylindric() - obj.fastvertex(i).u = obj.fastvertex(i).pos.theta / (2 * 3.14159274F) - obj.fastvertex(i).v = (obj.fastvertex(i).pos.z - min.z) * dz - Next - End Sub - End Class -End Namespace diff --git a/trunk/managed/Warp3D/Warp3DVB/warp_TextureSettings.vb b/trunk/managed/Warp3D/Warp3DVB/warp_TextureSettings.vb deleted file mode 100644 index ec6159f6..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/warp_TextureSettings.vb +++ /dev/null @@ -1,41 +0,0 @@ -' Created by: X -' http://www.createdbyx.com/ -' ---------------------- -' C# to VB.NET conversion of this code was done by hand and with the assistance of the -' Convert C# to VB .NET application availible at http://www.kamalpatel.net/ConvertCSharp2VB.aspx -' ConvertCSharp2VB utility was developed by: Kamal Patel (http://www.KamalPatel.net) -' ---------------------- -' Thanks to Alan Simes ( http://alansimes.blogdns.net/ ) for creating the Warp3D library. -' http://alansimes.blogdns.net/cs/files/default.aspx -' ---------------------- - -Imports System - -Namespace Rednettle.Warp3D - '/ - '/ Summary description for warp_TextureSettings. - '/ - '/ - Public Class warp_TextureSettings - Public texture As warp_Texture - Public width As Integer - Public height As Integer - Public type As Integer - Public persistency As Single - Public density As Single - Public samples As Integer - Public numColors As Integer - Public colors() As Integer - - Public Sub New(ByVal tex As warp_Texture, ByVal w As Integer, ByVal h As Integer, ByVal t As Integer, ByVal p As Single, ByVal d As Single, ByVal s As Integer, ByVal c() As Integer) - texture = tex - width = w - height = h - type = t - persistency = p - density = d - samples = s - colors = c - End Sub - End Class -End Namespace diff --git a/trunk/managed/Warp3D/Warp3DVB/warp_Triangle.vb b/trunk/managed/Warp3D/Warp3DVB/warp_Triangle.vb deleted file mode 100644 index 53b0609b..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/warp_Triangle.vb +++ /dev/null @@ -1,105 +0,0 @@ -' Created by: X -' http://www.createdbyx.com/ -' ---------------------- -' C# to VB.NET conversion of this code was done by hand and with the assistance of the -' Convert C# to VB .NET application availible at http://www.kamalpatel.net/ConvertCSharp2VB.aspx -' ConvertCSharp2VB utility was developed by: Kamal Patel (http://www.KamalPatel.net) -' ---------------------- -' Thanks to Alan Simes ( http://alansimes.blogdns.net/ ) for creating the Warp3D library. -' http://alansimes.blogdns.net/cs/files/default.aspx -' ---------------------- - -Imports System - -namespace Rednettle.Warp3D - Public Class warp_Triangle - Public parent As warp_Object ' // the object which obtains this triangle - Public visible As Boolean = True ' //visibility tag for clipping - Public outOfFrustrum As Boolean = False ' //visibility tag for frustrum clipping - - Public p1 As warp_Vertex ' // first vertex - Public p2 As warp_Vertex ' // second vertex - Public p3 As warp_Vertex ' // third vertex - - Public n As warp_Vector ' // Normal vector of flat triangle - Public n2 As warp_Vector ' // Projected Normal vector - - Private minx, maxx, miny, maxy As Integer ' // for clipping - Private triangleCenter As New warp_Vector() - Public dist As Single = 0 - - Public id As Integer = 0 - - Public Sub New(ByVal a As warp_Vertex, ByVal b As warp_Vertex, ByVal c As warp_Vertex) - p1 = a - p2 = b - p3 = c - End Sub - - Public Sub clipFrustrum(ByVal w As Integer, ByVal h As Integer) - If parent.material Is Nothing Then - visible = False - Return - End If - outOfFrustrum = (p1.clipcode And p2.clipcode And p3.clipcode) <> 0 - If outOfFrustrum Then - visible = False - Return - End If - If n2.z > 0.5 Then - visible = True - Return - End If - - - triangleCenter.x = (p1.pos2.x + p2.pos2.x + p3.pos2.x) - triangleCenter.y = (p1.pos2.y + p2.pos2.y + p3.pos2.y) - triangleCenter.z = (p1.pos2.z + p2.pos2.z + p3.pos2.z) - - visible = warp_Vector.angle(triangleCenter, n2) > 0 - End Sub - - - Public Sub project(ByVal normalProjection As warp_Matrix) - n2 = n.transform(normalProjection) - dist = getDist() - End Sub - - Public Sub regenerateNormal() - n = warp_Vector.getNormal(p1.pos, p2.pos, p3.pos) - End Sub - - Public Function getWeightedNormal() As warp_Vector - Return warp_Vector.vectorProduct(p1.pos, p2.pos, p3.pos) - End Function - - Public Function getMedium() As warp_Vertex - Dim cx As Single = (p1.pos.x + p2.pos.x + p3.pos.x) / 3 - Dim cy As Single = (p1.pos.y + p2.pos.y + p3.pos.y) / 3 - Dim cz As Single = (p1.pos.z + p2.pos.z + p3.pos.z) / 3 - Dim cu As Single = (p1.u + p2.u + p3.u) / 3 - Dim cv As Single = (p1.v + p2.v + p3.v) / 3 - Return New warp_Vertex(cx, cy, cz, cu, cv) - End Function - - Public Function getCenter() As warp_Vector - Dim cx As Single = (p1.pos.x + p2.pos.x + p3.pos.x) / 3 - Dim cy As Single = (p1.pos.y + p2.pos.y + p3.pos.y) / 3 - Dim cz As Single = (p1.pos.z + p2.pos.z + p3.pos.z) / 3 - Return New warp_Vector(cx, cy, cz) - End Function - - Public Function getDist() As Single - Return p1.z + p2.z + p3.z - End Function - - Public Function degenerated() As Boolean - Return p1.equals(p2) Or p2.equals(p3) Or p3.equals(p1) - End Function - - Public Function getClone() As warp_Triangle - Return New warp_Triangle(p1, p2, p3) - End Function - - End Class -End Namespace diff --git a/trunk/managed/Warp3D/Warp3DVB/warp_Vertex.vb b/trunk/managed/Warp3D/Warp3DVB/warp_Vertex.vb deleted file mode 100644 index 3c5679ab..00000000 --- a/trunk/managed/Warp3D/Warp3DVB/warp_Vertex.vb +++ /dev/null @@ -1,199 +0,0 @@ -' Created by: X -' http://www.createdbyx.com/ -' ---------------------- -' C# to VB.NET conversion of this code was done by hand and with the assistance of the -' Convert C# to VB .NET application availible at http://www.kamalpatel.net/ConvertCSharp2VB.aspx -' ConvertCSharp2VB utility was developed by: Kamal Patel (http://www.KamalPatel.net) -' ---------------------- -' Thanks to Alan Simes ( http://alansimes.blogdns.net/ ) for creating the Warp3D library. -' http://alansimes.blogdns.net/cs/files/default.aspx -' ---------------------- - -Imports System -Imports System.Collections - -namespace Rednettle.Warp3D - Public Class warp_Vertex - Public parent As warp_Object - - Public pos As New warp_Vector() ' //(x,y,z) Coordinate of vertex - Public pos2 As warp_Vector ' //Transformed vertex coordinate - Public n As New warp_Vector() ' //Normal Vector at vertex - Public n2 As warp_Vector ' //Transformed normal vector (camera space) - - Public x As Integer ' //Projected x coordinate - Public y As Integer ' //Projected y coordinate - Public z As Integer ' //Projected z coordinate for z-Buffer - - Public u As Single = 0 ' // Texture x-coordinate (relative) - Public v As Single = 0 ' // Texture y-coordinate (relative) - - Public nx As Integer = 0 ' // Normal x-coordinate for envmapping - Public ny As Integer = 0 ' // Normal y-coordinate for envmapping - Public tx As Integer = 0 ' // Texture x-coordinate (absolute) - Public ty As Integer = 0 ' // Texture y-coordinate (absolute) - - Public sw As Single = 1.0F - - - Public visible As Boolean = True ' //visibility tag for clipping - Public clipcode As Integer = 0 - Public id As Integer ' // Vertex index - - Private fact As Single - 'private Vector neighbor=new Vector(); //Neighbor triangles of vertex - Private neighbor As New ArrayList() - - - - Public Sub New() - pos = New warp_Vector(0.0F, 0.0F, 0.0F) - End Sub - - Public Sub New(ByVal xpos As Single, ByVal ypos As Single, ByVal zpos As Single) - pos = New warp_Vector(xpos, ypos, zpos) - End Sub - - Public Sub New(ByVal xpos As Single, ByVal ypos As Single, ByVal zpos As Single, ByVal u As Single, ByVal v As Single) - pos = New warp_Vector(xpos, ypos, zpos) - Me.u = u - Me.v = v - End Sub - - Public Sub New(ByVal ppos As warp_Vector) - pos = ppos.getClone() - End Sub - - Public Sub New(ByVal ppos As warp_Vector, ByVal u As Single, ByVal v As Single) - pos = ppos.getClone() - Me.u = u - Me.v = v - End Sub - - - Public Sub project(ByVal vertexProjection As warp_Matrix, ByVal normalProjection As warp_Matrix, ByVal camera As warp_Camera) - ' Projects this vertex into camera space - pos2 = pos.transform(vertexProjection) - n2 = n.transform(normalProjection) - - fact = camera.screenscale / camera.fovfact / CSng(IIf(pos2.z > 0.1, pos2.z, 0.1F)) - x = CInt((pos2.x * fact + (camera.screenwidth >> 1))) - y = CInt((-pos2.y * fact + (camera.screenheight >> 1))) - z = CInt((65536.0F * pos2.z)) - sw = -(pos2.z) - nx = CInt((n2.x * 127 + 127)) - ny = CInt((n2.y * 127 + 127)) - If parent.material Is Nothing Then Return - If parent.material.texture Is Nothing Then Return - tx = CInt((parent.material.texture.width * u)) - ty = CInt((parent.material.texture.height * v)) - End Sub - - Public Sub setUV(ByVal u As Single, ByVal v As Single) - Me.u = u - Me.v = v - End Sub - - - Public Sub clipFrustrum(ByVal w As Integer, ByVal h As Integer) - ' View plane clipping - clipcode = 0 - If x < 0 Then - clipcode = clipcode Or 1 - End If - If x >= w Then - clipcode = clipcode Or 2 - End If - If y < 0 Then - clipcode = clipcode Or 4 - End If - If y >= h Then - clipcode = clipcode Or 8 - End If - If pos2.z < 0 Then - clipcode = clipcode Or 16 - End If - visible = (clipcode = 0) - End Sub - - Public Sub registerNeighbor(ByVal triangle As warp_Triangle) - If Not neighbor.Contains(triangle) Then - neighbor.Add(triangle) - End If - End Sub - - Public Sub resetNeighbors() - neighbor.Clear() - End Sub - - Public Sub regenerateNormal() - Dim nx As Single = 0 - Dim ny As Single = 0 - Dim nz As Single = 0 - Dim Enumerator As IEnumerator = neighbor.GetEnumerator() - - Dim tri As warp_Triangle - Dim wn As warp_Vector - While Enumerator.MoveNext() - tri = CType(Enumerator.Current, warp_Triangle) - wn = tri.getWeightedNormal() - nx += wn.x - ny += wn.y - nz += wn.z - End While - - n = New warp_Vector(nx, ny, nz).normalize() - End Sub - - '/* - ' public void regenerateNormal() - ' { - ' float nx=0; - ' float ny=0; - ' float nz=0; - ' Enumeration enum=neighbor.elements(); - ' warp_Triangle tri; - ' warp_Vector wn; - ' while (enum.hasMoreElements()) - ' { - ' tri=(warp_Triangle)enum.nextElement(); - ' wn=tri.getWeightedNormal(); - ' nx+=wn.x; - ' ny+=wn.y; - ' nz+=wn.z; - ' } - - ' n=new warp_Vector(nx,ny,nz).normalize(); - ' } - '*/ - - Public Sub scaleTextureCoordinates(ByVal fx As Single, ByVal fy As Single) - u *= fx - v *= fy - End Sub - - Public Sub moveTextureCoordinates(ByVal fx As Single, ByVal fy As Single) - u += fx - v += fy - End Sub - - Public Function getClone() As warp_Vertex - Dim NewVertex As warp_Vertex = New warp_Vertex() - NewVertex.pos = pos.getClone() - NewVertex.n = n.getClone() - NewVertex.u = u - NewVertex.v = v - - Return NewVertex - End Function - - - Public Function equals(ByVal v As warp_Vertex) As Boolean - Return ((pos.x = v.pos.x) And (pos.y = v.pos.y) And (pos.z = v.pos.z)) - End Function - - Public Function equals(ByVal v As warp_Vertex, ByVal tolerance As Single) As Boolean - Return Math.Abs(warp_Vector.sub(pos, v.pos).length()) < tolerance - End Function - End Class -End Namespace \ No newline at end of file diff --git a/trunk/managed/Warp3D/Warp3D_Tester/AniSpriteTest.Designer.vb b/trunk/managed/Warp3D/Warp3D_Tester/AniSpriteTest.Designer.vb deleted file mode 100644 index d6dfa1ef..00000000 --- a/trunk/managed/Warp3D/Warp3D_Tester/AniSpriteTest.Designer.vb +++ /dev/null @@ -1,39 +0,0 @@ - _ -Partial Class AniSpriteTest - Inherits System.Windows.Forms.Form - - 'Form overrides dispose to clean up the component list. - _ - Protected Overrides Sub Dispose(ByVal disposing As Boolean) - If disposing AndAlso components IsNot Nothing Then - components.Dispose() - End If - MyBase.Dispose(disposing) - End Sub - - 'Required by the Windows Form Designer - Private components As System.ComponentModel.IContainer - - 'NOTE: The following procedure is required by the Windows Form Designer - 'It can be modified using the Windows Form Designer. - 'Do not modify it using the code editor. - _ - Private Sub InitializeComponent() - Me.SuspendLayout() - ' - 'SpriteTest - ' - Me.AutoScaleDimensions = New System.Drawing.SizeF(11.0!, 24.0!) - Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(535, 491) - Me.Font = New System.Drawing.Font("Microsoft Sans Serif", 14.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) - Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog - Me.Margin = New System.Windows.Forms.Padding(6) - Me.MaximizeBox = False - Me.MinimizeBox = False - Me.Name = "SpriteTest" - Me.Text = "SpriteTest" - Me.ResumeLayout(False) - - End Sub -End Class diff --git a/trunk/managed/Warp3D/Warp3D_Tester/AniSpriteTest.resx b/trunk/managed/Warp3D/Warp3D_Tester/AniSpriteTest.resx deleted file mode 100644 index ff31a6db..00000000 --- a/trunk/managed/Warp3D/Warp3D_Tester/AniSpriteTest.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/trunk/managed/Warp3D/Warp3D_Tester/AniSpriteTest.vb b/trunk/managed/Warp3D/Warp3D_Tester/AniSpriteTest.vb deleted file mode 100644 index b7376fec..00000000 --- a/trunk/managed/Warp3D/Warp3D_Tester/AniSpriteTest.vb +++ /dev/null @@ -1,184 +0,0 @@ -'Imports Rednettle.Warp3D -Imports Warp3DVB.Rednettle.Warp3D - -Public Class AniSpriteTest - Private Class SpriteItem - Public Position As warp_Vector - Public Direction As warp_Vector - Public LastTime As Long - Public Interval As Long - End Class - - Private mobjW3D As warp_Scene - Private CB As warp_Texture - Private WithEvents Timer1 As New Timers.Timer - Private Sprites As New Generic.List(Of SpriteItem) - Private Buf As Drawing.BufferedGraphics - - - Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing - Timer1.Stop() - Timer1 = Nothing - CB = Nothing - mobjW3D = Nothing - Buf.Dispose() - Buf = Nothing - Sprites.Clear() - Sprites = Nothing - End Sub - - Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown - Select Case e.KeyCode - Case Keys.Escape - Me.Close() - - Case Keys.Up - Dim Count As Integer = 1 - If e.Control Then Count += 9 - - For idx As Integer = 1 To Count - addsprite() - Next - - Case Keys.Down - Dim Count As Integer = 1 - If e.Control Then Count += 9 - - For idx As Integer = 1 To Count - If Sprites.Count = 0 Then Exit For - Sprites.RemoveAt(Sprites.Count - 1) - Next - - Case Keys.D1, Keys.NumPad1 - Dim count As Integer = 1000 - If e.Control Then SetSpriteCount(count + Sprites.Count) Else SetSpriteCount(count) - - Case Keys.D2, Keys.NumPad2 - SetSpriteCount(2000) - - Case Keys.D3, Keys.NumPad3 - SetSpriteCount(3000) - - Case Keys.D4, Keys.NumPad4 - SetSpriteCount(4000) - - Case Keys.D4, Keys.NumPad4 - SetSpriteCount(5000) - - Case Keys.D5, Keys.NumPad5 - SetSpriteCount(5000) - - Case Keys.D6, Keys.NumPad6 - SetSpriteCount(6000) - - Case Keys.D7, Keys.NumPad7 - SetSpriteCount(7000) - - Case Keys.D8, Keys.NumPad8 - SetSpriteCount(8000) - - Case Keys.D9, Keys.NumPad9 - SetSpriteCount(9000) - - Case Keys.D0, Keys.NumPad0 - SetSpriteCount(10000) - End Select - End Sub - - Private Sub SetSpriteCount(ByVal Count As Integer) - If Sprites.Count > Count Then - Sprites.RemoveRange(Count, Sprites.Count - Count) - Else - While Sprites.Count <= Count - AddSprite() - End While - End If - End Sub - - Private Sub AddSprite() - Dim Item As SpriteItem - Item = New SpriteItem - Dim X, Y As Single - Randomize(Now.Ticks) - If CBool(CLng(Rnd()) And 1) Then X = 10 Else X = -10 - If CBool(CLng(Rnd()) And 1) Then Y = 10 Else Y = -10 - - Item.Direction = New warp_Vector(Rnd() * X, Rnd() * Y, 0) - Item.Position = New warp_Vector(Rnd() * mobjW3D.renderPipeline.screen.width, Rnd() * mobjW3D.renderPipeline.screen.height, 0) - Item.Interval = CLng(Rnd() * TimeSpan.TicksPerSecond) - Sprites.Add(Item) - End Sub - - Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load - Me.Show() - Application.DoEvents() - mobjW3D = New warp_Scene(512, 512) - 'mobjW3D.defaultCamera = New warp_Camera - 'mobjW3D.defaultCamera.pos = New warp_Vector(0, 0, -100) - mobjW3D.environment.bgcolor = Color.Gray.ToArgb - Me.Size = New Size(512, 512) + (Me.Size - Me.ClientSize) - CB = New warp_Texture("CBX32x32.png") - Me.SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.UserPaint, True) - - Drawing.BufferedGraphicsManager.Current.MaximumBuffer = New Size(1, 1) + Me.ClientSize - Buf = Drawing.BufferedGraphicsManager.Current.Allocate(Me.CreateGraphics, Me.ClientRectangle) - - Randomize(Now.Ticks) - For idx As Integer = 0 To 999 - AddSprite() - Next - - - ' Timer1.AutoReset = True - Timer1.Interval = 1 - Timer1.Start() - End Sub - - Private Sub Timer1_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles Timer1.Elapsed - If Timer1 Is Nothing Then Exit Sub - ' Static rendering As Boolean = False - ' If rendering Then Exit Sub - ' rendering = True - ' Timer1.Stop() - With mobjW3D - .renderPipeline.screen.clear(.environment.bgcolor) - - ' update positions - For Each tmp As SpriteItem In Sprites - tmp.Position = warp_Vector.add(tmp.Position, tmp.Direction) - tmp.Position.x = warp_Math.crop(tmp.Position.x, 0, Me.ClientSize.Width - 1) - tmp.Position.y = warp_Math.crop(tmp.Position.y, 0, Me.ClientSize.Height - 1) - If Now.Ticks > tmp.LastTime + tmp.Interval Then - Dim X, Y As Single - Randomize(Now.Ticks) - If CBool(CLng(Rnd()) And 1) Then X = 1 Else X = -1 - If CBool(CLng(Rnd()) And 1) Then Y = 1 Else Y = -1 - tmp.Direction = New warp_Vector(Rnd() * X, Rnd() * Y, 0) - tmp.LastTime = Now.Ticks - End If - Next - - ' render and measure performance - Dim SW As New Stopwatch - SW.Reset() - SW.Start() - For Each item As SpriteItem In Sprites - If Timer1 Is Nothing Then Exit Sub - .renderPipeline.screen.draw(CB, CInt(item.Position.x), CInt(item.Position.y), CB.width, CB.height) - Next - SW.Stop() - Buf.Graphics.DrawImage(.getImage, 0, 0) - Dim Msg As String - Msg = "Sprite Count: " & Sprites.Count.ToString & vbCrLf - Msg &= "Time to render (Ticks): " & SW.ElapsedTicks.ToString & vbCrLf - Msg &= "Time to render (Milli) :" & SW.ElapsedMilliseconds.ToString & vbCrLf - Msg &= "Pixels processed: " & ((CB.width * CB.height) * Sprites.Count).ToString & vbCrLf - Msg &= "Bytes processed: " & ((CB.width * CB.height * 4) * Sprites.Count).ToString & vbCrLf - Buf.Graphics.DrawString(Msg, Me.Font, Brushes.Red, 0, 0) - SW = Nothing - End With - Buf.Render() - ' rendering = False - Timer1.Start() - End Sub -End Class \ No newline at end of file diff --git a/trunk/managed/Warp3D/Warp3D_Tester/BackgroundImageTest.Designer.vb b/trunk/managed/Warp3D/Warp3D_Tester/BackgroundImageTest.Designer.vb deleted file mode 100644 index d0f2ebce..00000000 --- a/trunk/managed/Warp3D/Warp3D_Tester/BackgroundImageTest.Designer.vb +++ /dev/null @@ -1,39 +0,0 @@ - _ -Partial Class BackgroundImageTest - Inherits System.Windows.Forms.Form - - 'Form overrides dispose to clean up the component list. - _ - Protected Overrides Sub Dispose(ByVal disposing As Boolean) - If disposing AndAlso components IsNot Nothing Then - components.Dispose() - End If - MyBase.Dispose(disposing) - End Sub - - 'Required by the Windows Form Designer - Private components As System.ComponentModel.IContainer - - 'NOTE: The following procedure is required by the Windows Form Designer - 'It can be modified using the Windows Form Designer. - 'Do not modify it using the code editor. - _ - Private Sub InitializeComponent() - Me.SuspendLayout() - ' - 'BackgroundImageTest - ' - Me.AutoScaleDimensions = New System.Drawing.SizeF(11.0!, 24.0!) - Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(535, 491) - Me.Font = New System.Drawing.Font("Microsoft Sans Serif", 14.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) - Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog - Me.Margin = New System.Windows.Forms.Padding(6) - Me.MaximizeBox = False - Me.MinimizeBox = False - Me.Name = "BackgroundImageTest" - Me.Text = "SpriteTest" - Me.ResumeLayout(False) - - End Sub -End Class diff --git a/trunk/managed/Warp3D/Warp3D_Tester/BackgroundImageTest.resx b/trunk/managed/Warp3D/Warp3D_Tester/BackgroundImageTest.resx deleted file mode 100644 index ff31a6db..00000000 --- a/trunk/managed/Warp3D/Warp3D_Tester/BackgroundImageTest.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/trunk/managed/Warp3D/Warp3D_Tester/BackgroundImageTest.vb b/trunk/managed/Warp3D/Warp3D_Tester/BackgroundImageTest.vb deleted file mode 100644 index abf4d9e0..00000000 --- a/trunk/managed/Warp3D/Warp3D_Tester/BackgroundImageTest.vb +++ /dev/null @@ -1,41 +0,0 @@ -'Imports Rednettle.Warp3D -Imports Warp3DVB.Rednettle.Warp3D - -Public Class BackgroundImageTest - - Private mobjW3D As warp_Scene - Private CB As warp_Texture - - - Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing - CB = Nothing - mobjW3D = Nothing - End Sub - - Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown - Select Case e.KeyCode - Case Keys.Escape - Me.Close() - End Select - End Sub - - Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load - Me.Show() - Application.DoEvents() - mobjW3D = New warp_Scene(512, 512) - mobjW3D.environment.bgcolor = Color.Gray.ToArgb - Me.Size = New Size(512, 512) + (Me.Size - Me.ClientSize) - CB = New warp_Texture("CBX32x32.png") - - Me.BackgroundImage = mobjW3D.getImage - End Sub - - Private Sub BackgroundImageTest_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove - If mobjW3D Is Nothing Then Exit Sub - With mobjW3D - .renderPipeline.screen.clear(.environment.bgcolor) - .renderPipeline.screen.draw(CB, e.X, e.Y, CB.width, CB.height) - End With - Me.Invalidate() - End Sub -End Class \ No newline at end of file diff --git a/trunk/managed/Warp3D/Warp3D_Tester/CBX.png b/trunk/managed/Warp3D/Warp3D_Tester/CBX.png deleted file mode 100644 index 1ec8a61e5b06b6fe8dc5b7af1cb4f46ea57668a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 250179 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 $G;<7{W1*)ZW*n9_*`f&L@OK+54w z7(edJl)x%MWWrfS9Bq~Oa)jS%;4up1k4lse$9D!WfTm>Aj=l9sgZMu$;%iTcZ0;DV z4!5I?B4!B)G=9ps3`({L7ktg<1dnP)cocDJ$_;oxibOx+XwN8I7$5<9z(eWfQkCnE zVnmC`KupR(S|IY1H2~k2`{JCAg0oqA%+3htR(Y+@Bto}Eyb|&x#QGjS^+^EKAKP8T z)DM_9WO9;7K7vdOZSowEo8A8SGt1A|P38XvV`I2Tf&N%OcLC)NZT*hFuHkv9)s(M? z5gq|}V%C2;9q(EomlY*=@qPjB_`9pVk6EbSs#yy6$KCgDN2?+tFHrD9#nA4hdHr>K zVtRr2r6w&LzJsfem^!Z3rR!cKLwS9POSbKD-jnA}D}~t1z>6?Jwcdlw9KOISij>f> z_zhDx9^r$f(Lq2k2^xMTe_F&PBCBISr9n!!7}OHYC-IS!w73Yuw?yH=8HnGdc7g45 zCUI{kT!8xZi+EQzA!$G0TWoL6EO(Myb3<|gTh+Y*)`<6Wl{aCQdWt6Eh={d( zLWT-6gV!HL-cXK7d5R;I)uE5WEN&-x)PRm!6sxfrI+s?4LNtq8u}ZswEDJ13*hp@N zF-L6boe*0J^mM8aw*9?p`WerxI!|)Ff%s0f__o5abMfvD?@(LO{8H7QpFK9Mr^_hU zTp1W^p1XhDp)=GqupMf~1e44^!nHMn7TyMdARHL>Jxs8&=SABv`HzeCx~j*bX2{<%Hpm zd}kA3$Q1+tMJ4m`T?miJ$VQ38qrUkKF*Wk;G$Q-F#Lm^~qT>`Y7 zXgjP&11vwh73mbsi5)O41B#54Os7CV$dp==#9%(76QcYqu|qnZ=Bz78m^54fXQ^zYtzv9zq75~f zK%sTBi4|}+pzl-jWIaW>1ATSpbKPgE?wBLsj-eGjJ$dUCO$e>#+`ryeL*g-kSI_Qr zitlDEJv;m9kQ3hibgCks>%9VH*HXd#y2E9GY}8qGhiU(oQ#y{t+f|hgQOg;GOxN_F zu0vhxW6JeLJh#k@?tZm3QgQtCEObOh!AGFgEpM=X+5fcJr@8v_u6zwuGURyzm$&X! z1=d0VACMJ6fCoL>-FXnuBW*DI2v7UDZg*)SpQXE0FM9bPyfd>(^oWZ%90e4|3OjK> z8Uqu$$tNMvoF4}HN*1b}jw(yEh`*D#R;P+?Ox|jSzuMwDInZPHPj5R~7A)Sa;6PB2spP@B$~VJJFjh)abMOVB@5NKx5U#2uNa z^(JZP-3wXwi~+ghbo2mDI1W=m>rc=C_@;4yy4xlN=moer%X4xdKFcSM@TRl)V!q6t zj$NEg6gw+^4@m4RVCp$#8CB53;-8{K0F!tbozO~5k(neO7-pJyQrZwkoky#=Rxm0Z z+~GAhv^`bXqEkSQTpKX8zCESc4fX-v5mXfA-rfnvo%$WpE`r9 z+4Z2HVp=bi;mr}>5H8v7UaDVNsaZmAPs1M8hin%WtMuGK30LHsz)qJWa}a=FcfjMeZsixu3` zocGVSi(E!@OVwveyPl9gTm_n$7bWEq;Ag0U&@e4mL5(6a{4VWrw9bIMC8a+8oMvI4 zSlmvmr%kPGH!(wqppyVq*3bX08U0;ebLe(Z!)ma>W$}T&U4vffaosKfN zASw(8CwN!OZZ%4a^cHW)D z?^}kzi@8R${n~R3p)onTo4sJUo^o|U{%IN9nx`wB!@CBh?!_@tdN)AG?-$r3t{Anhf)d&Zyam?#cF zc9N6ap%+pEsDIVjA93hv&mkP-s}O&3~iaSE%HK+$Le&C@WxD9 zxEGiWrcX>XOMW94XnveA{(zOtZ<5fJkH3fv>$&b$@T5r` z4R{ymbZn$EfU%(jJAk`)O&IIm3B?RobgU}(XOcPr{p zqP!h8=a)e!r6niswHEq*Z#H#1$Wjf=&UfWjP0bo z5|&xzLsXuaWN2p*Lz72h)m6dgm+A#m>Z4V%1?WR$OwxD3LX3Tkfx9Btg&kwJI(U_d4qHuq711&Ho7vr za>QQx^}BF0IU_&paO^1}?|##DEn(|Dd>+ott92!hf9OEJx$~z1L`MxEoG|fU#)_&Q zTMX!#GYqX8sB7f+)a&q)AoV1~wnK<7kI@}oe`>DgG;3Lh5L)3_t2d5KMe5QW-yy`N z5%SN?nm5gI-wj4Dr$){=x8sT(kA%Fu%L5mejh;3FmXo8RP;jKFBVwJ@yg=ADo>@TdNMW(r7zbS2NG8wjeZp*B%B@ zYp6YI6TAc!98(^ua{ed?J75~m0#ZeY>?CgoV`h@Rc`qHFXTiaMsmtG2Nx88-1}kzG zOzb;c>IMH2qPUN^RWU1B4kT;Opp7xVaM2z!I8ld zWclX+5%G%XEQ0KdnCt8yXwub7UxG+3K8ayqnHYU`gZi_B0npl7H&++2XMD95X()pb zh{=Ev@yGZQ0qji9vZH^Gf+lam(?O$2Nj__`9P8bY_pbdzH4M9A2YCWNj#C^lva# z4a&`junuWg`-9T1xJ~lDZ|?i|Xezfq+fHhI>y>X%-l06Ahd9cr-#u3@$bsA2A8k9I zPOX_}#67ZB*{zfdY76RzJG4#Rp<`|4Z5-O4yhyE7lFG+_s3z90%5lHLgL4bv?No!m zipOInN)L$Uj7N*iE24Hj{%OGySda0g37RuUWg^O4k-Au5B&f9Exn?m`tAquEU^?gj zP10HcF?tlM)?sI6P?F?+SLC;K3y6VOeHKMLItrMWyqAeJ4eK#2XE?q_?EylmPF@=| zigKSq5597BhX1#S1zIJ{nh^>lk@>dXx8KD8{P@tnI}(oJm|4v*uvutI711+^)FVYx z#JT3t5|Z@{;(~OK2=GeS?vd~3N|+hp`1))nz7p<&ji^pgS#-E~T9G6th2aU+mGB<- zr#e$zYq){SKJEi2C4Hn>!@ z>HX{P-Ux_2Bq(Y1f`$Q=#*VF4%eC&4eSB!42Fn+gWoK{P2CS9*IgKq6dc4$UX*Q{3l(5y{sb$4$P!(b`Hc_ZKL&V^Boob|& z+?)__lT17lZ34T4Q25U((;y^d66K|;k_`SnnHH9<^vBswBV8Z! z{|{-dfO}kUeCj({q{enE+9!^bT@#D{q>{j#K#L^V8O%~JORPT$CrJHe0@OxP))$QO zvq&r)lpm$@$qA(*9k@A@stuau6$XElM@6Ea(Wp-^rt(IF^4F@7rr?{45XE zlI`86bCX(m@;p_#XSM@3-Pi>8y&th9kHf_*<*GAibux07cP`(Thbs}SVMVqzyW9Q>}Nst z0GQ6ODCla zikh+o$pa=JRfWYuUnSX2(EqSOUc^7C`%F+wF^|1p|4+vNsP5Ci&2@s#6aL9LbQ3-0 z6TA{a@QQCe9?Knjd0p2t^wcWFrSj|~k--X+&OAX7^dB*|B4S~RluVM(<6e=peXBXJ zV^!t%EuZP@-y5rW>aux`AVA!Sc0W2;Yqa3m)b@H7(B(by!(Hvk;|XE!tY9c~YJG1i zPHn$rFgD)jAOn?rb3k{8eFxck7EklKh-jJ`n0lU;9X&JJ@jF$rtc}QWPv1HBCd$O^ z-=_L-QY-tSm%aV7WXzE|0_)Q1#mMBidUeT-acaQ?Vi8YrxHFzhJFKT+o7}9lfpQb* zWRY)90GoKI8~Xm!sn6)C{&v|e z@Y&k_vH*gsWE^C*JaXMh{yE&I_M02Oz>+J>XT zf%{WZM$7y`(oKwWGo}u;K;_t}bwLW@1_fA;$^a(ZB5cD4(Ri_nBn!kxNhyzFq8=nA zV7nx|AMnDg*vJ`|m$>vWRs7n1dAjY*G9BWZZ`d_*!1r9&=4`qfZq@*0!=Rn%PL0(G zQ0tq4=B}>#!)5m(pKJChrdA)ocV-2&T=qyJq7Tn$Y@TU`r@z)PEBE`Yxnu5m)L;I3 zzmgTQPP3MjcG=7fm)!m6g02hoGwqhBXSz*81kI zx>>uDgq}rK+8N#Cc%3t&D9`Z@;BXQ&osCYXCbcS*&Q)KVTnU<9ilsfW@!Ey`5iczR z;p6Xj#B1BOy_f2^-}p94-jmK}R+9$RgKW>sqcpc|?9rXc@~^^SPI!qJWpZRu;xVG- zo9k!5TqnzfajI4?U!Z$oG4Kori)8`Y!G%EytxG2z+`g_Wg&sGh9}x#+$a2Hot>TAi zQn$xFQq^s^{bv-`P-3?rGGN_uIog9dIH!MQxBvIZ(O;$48;K_Ez`-|7`YFD^S7w~| zetd(bY8r19aQ4FKAH4x6-}E8%TMxpwWWi;}@el9|CO9~>3O=SMeD^^d7N*f|@a20* zASnH0(*;cvapJNWC-u>G)Oyn6U_U~3>#Q8HqfC1(?Y4Vun7ji-)uo*3Nk3d(9Q^IC z4*DreX*4y<0jyP2F14=r8%i!UovROOyc z3>unIapKF}rG_6>yy6Sg8vs+WILTE1xi0zA~ zq0#hirN+?0g(Wx2zBRiBrRH(KZUbOG{p=a>hntYGZ`a>?PUL2p+6!|^t2mpMm*L$d zsx>BX)^6J#sw&r2yz6~$^XH4ER2HjPqeQ}~@lGX(H)@#DtHcU43@bQ_Al&pBipC&r zxWTE?^-`c5EwaNTBK;yO;#qj}v%ITv5&wMwjZ=!Et2qWc?#F6Veo?6?KodQ z+oz|4_Q`wocvp;%kB!QA==}B9bqZ9c-hKbO_jJoIttobC>F^>Ja$mj)PrZ!pUX9ke zTZrfT&i=d7-v$0_-{yn&H8NzOxBqP+*QrXLSj!eeD?#w&!D)OM!*RR9snR~yo@TCz zA8)benPfl921a>-0JpxUZ2#-ht|~b1m-jaoyzn#H7J|81gFRTqdo{3^s}QgzSpn~7 z&?6&i;FPkY5F!{GmVou5spD6u8u}mvy5U1-pH2vCvh;4DS8kF|W(VdOR8Ijv^O*oe z5h9m7eh;ISVJ1obxMG!wamF7HxN;)WRfOGl7(b3)4^Q8Y0xbql-Zv@!6bt|-U&fuA zz$>%9BV7AOOvfuigge^rjX0D^GdMPJ>*bX|hG$<;mvKI>iY%^ukjTToOT~^Z2`?k$ zw~8qJJ#0qqdq-~rxGp3 zvu-IjeDvsH`?=S$o!jrvHOkqn&UP`|d7bvzzPMfdG`Fy3S z*SF3w6-Q3hWX~+X$`FLDJ=fzK!3-`x*Vh>^%90?HlXl>Ico(cC4uasFymO5@a&}>~Qw~H==sq+{Br%JcagYGWkhx@YCn}CQbQ0Z%^v7xdnD8mbUuc9GfhJ5Q zPrN)z>p`E6pUHbWM+{|m)Q=W;H>30;G?8juj=+6G2ACmgFGn7vPuu_#(n%C~#?&E8 zSawxUtn0AHD@|Orxw)K97c`8<3ly8{jaMX&2=lv|A3hH)GH8f{L?|nJ9q7mYC6PGK ztq#_0jHB4ztj$`n(gw{_eLZ@6C5yFApPQGxee#Phs}!qH_h7Eto@H*)AvcdsQis=ArfLIfX<^wOlfNiplD<8x=4G>*4lEG6Z*^G6 zS9~%8=`KhJ5sOC}LB-vyVKF-_8gI>A7YFiUJRQ(^&V~4 zP=(Yqkq{crYrX2+8pBbJxw-#gZEmbpT=Pb3=8X_a6AL|A>zIGLH+F^n*EV~w`SsJ( zMD$crmP+xvc;C=gC{9qR;Xv$ zF3+oWXEb=&u)a&p2yJfuhV=uC@t0rMP@wjHn3jginljfbL)4sMGxD>yB5n0 z)pnNcTjx`I3Yy6`2&I^|F>ibgI>?zl|J_Bj-bP{{mUTD7+lS}+=9%3F`vXO`c?s?9 z2(zbc))tgJo||Xje;UU9jvW09o?w7AI#)lV#J2y^wVoV{wYOU40De58p+f8AC&)g^ zB3&{0PtwHg(Jqhn{MT@qGoa1k{!xV8XF=OnqP`o}&KcH)%G4sBKIz;iWZhV{7KFE9 zsl+UqfGiMyh2)Z?LIoV@Ev+^e|&9@_aP?9U_?M#b{FFjM@ApU%7je7hx zT~@yvylZ2D-1JUWkmJ$D?cP*F^z?_W~j6;>NY6 zG$!+!wf*-R4Qz*XquZY8-1JDhof!7qzyQhFZrXKyKR(I)Q((PiN=V#%#7s&_k)h_ym3>MEjw{sRg=PqlC z&f<7%nP+O~I!wq~51J2K$uytEAYc78_HTWvd5ir}zp5J9 zItjf?gj)rFXR^lus>kh9pF$~R8~Ae{PIV53khbCfYO-rTQR9_zF>ZzrwRM&_In=vtR z%ZEN_S<<=GWZMz$I}!gB1Ozv9@fyX6roG{tXW~)#$5uZR0NvzJy)XfM>&uf=?-R{W zunGeNNNm5%HeYV%PEt?DYg>-Q*Mf8Lg<=D)X8?&rdVuMN4+uCqkxMZnLfI8v-XGf= z!Gb6?qqy+Ynz;Rc5VfqKVj@bTO#`*ZmTd)k&?Gf=CPleXQpbac4eVIhr75iSSXLHc zklgvAj}Q=B)bM3rW3{}i74FBTY4QIYM4IPryE4S-pfl7#m$Aw41KweK$*rfRL+6gU zAJF=yYfc=qWJA|cCUGN$Ey5 zn~8>6&au8EgvX)Ts%`%b$3H#q3L;NGY`5dNie+s>!F})AyAN|2@sQ&PaUAOx25%Q|-ib9Ox^OHUFdl6U&p^x^(Q0wrv zp-ema|Kes}ZPq-8ujX)@$2`}b6VKOuQS{R@tQ3BS}zN z;euQDHmYk&ldwN_SJO^DCZPt1OHGHatdQ@KhorAP%ZeBgf-{SDlSRZBom~;1!N2C%7kknNg zp{u^z(6yHoI*b~swDv#6MlUq!i*xi(`_3Es|Hr@E)1(`8y4ZZ%zIsBto31HmHs{(q zANV!=@gMF~%!V&N`?#}4-uc-K?&nfHeWasr_f{$9S|+bb^QtSK3yxDB6`f;KMmpW^ zw0o$-vO?6DYyXVRYChju-olaHE6e`!Z|dt=AUZN@4UzV-N-cTr25H-2zr4S%Ph{9_ z)gDpRd;Ie2nlsn}qhHlmz1J_gy2)8MS3PY32i`)Q#_-u@raSwu9_;h#P;SuwxIN5d zABX*|-gCAurOX(m!Q>`_)$0vQ`55g1@>42a2U%Fj_8z@=^Y>ny5n_E|G5|0uL`I%b2jXiox+ zTnClTf(Yg+F02VjaK%LibbjVtClsP~P|do!Yhf84$G%}{Oo{QS!rUib=_ft8RmIm159ttM-`0C$i- z|FEC#pM9~DLfhAO@~7+`x!< z?{4W09E zpoJg_P-`Oy&|1(|tKJF_^aHfef6-Q()4jTS|7D1NAV0!ovKox%>)i-=Zb1| z+F7|n22f58{cnWiQ>m^phMvO+lETj{4PPMYgdlJ&UI3HYm~!MI+VS%CW|e0Ea|UB( zL8JjLOtwQ6axSBAKe9GD!Pu2hy~M5OLA(W_`FVXzR*8ignyA9@O~4eFXsGc>M!#i- zelh*UILbUMt)`YwsZ`au#N$bUW}&4{#P>%LSQwLu;#T}sR3%2aQNgw9D-;I?aA}++;W(ak-f|^#2-Z-{rz ztm)l*y#y1P7#%l1IFP{f;ak`GYi+|8Vw(rDTD0L;L4!6k=utc4YBybSao z%X`*}jn&PqtI)JnQ3$$s&Zcs$A3KG8N<#kQFrkKAyXF^P=P@OdNk7O$L%o1=<-!eq zjm>ExL*I)!KLW9u_o0+|8G*&{mPY#kde#N9rc;@bqN>aIk!Fk}3I9c_An2TvEQG>E zX+prbi#7S`Eme2Feh6QDO;-EqAm|68@4!6tiGygg6wyI~)D=E@MHUAzJzN(+YMAWT zugGqe!*II9q(qPt{y0Wf-WBZK+V^URscAO!jH*T+3kjHYp2 zKbbGEY6PS2d&#Z_=KGiHJzk{uc+lufhBBtLcT9di>0BB{NIri7nS2 zfTIGmf&y}RC0IsK3=Pzju)ApwbNthX@aIo-hc-2Z|F3&Ofy%#P{Y&7#VIO+mhTDcR zfZ_=b6WR0fPjU`4RO2?{5sxYwfxZpoj;Od)NkaRmvVayeKupkvTmoSO2zh%W?+QUg zIM5W0%wuFk=qhOry0aD+56#yQjim+g`Zbo*N4K@@msb9bYV}%IMh;Gj&J=PC@Ugyx zQL$gJIfDlEqrIQP)GOs#dT8OGw89i^w! zT)~uGZ54J(O*4ci%Q2_-PU^?10*zw=*!eW-!?S*GBL`YNF=ZkrR*czfm}Re|ehk#b z+!YvfSh^Cf0_8`%wvO=SiCtyi!VW@(80a%vQpwgNsU8>Wv*{#AoOC21V!bCen(v>; z^pk+hC>>0YMhHP51>i8)_Txd+V~~gtxrJMx z70}B(9i?j8w(BUdzzi$OqI3W9QP7%b)M7KikJYc}MSl)sgH_G55vjcQrYKCQ0q!6`#&m=kR=CuF;~Z zK^JY)MY={Ho;CzLA0>*PRdElF0RWc_5=inK0X$kqAvuqlR$!~kkGz`J48~c40NI;K z<2HMxIC#>n=lx1nXRx?Y#>utX2K~^*g^9tz_d(4?a@^D8 zEJ;$*c2WzwDCT1UWmG!&yl(APo56_ufnRpi^ABHr`Ze=Pvw|6;Gi64gn)C(+R})1r zI=ISk(CB=GU#>UBx!oN6GsaESVjcYlvO1*F9 zvat_IJMp%90$Cq?<=$cmge9$hm{+G^1%DrtY%Rot2+yJMfG~{^gIZ?(L03S0gF@;u zO(n^wDZC~G`QGL@(kACAT755u6?Px+MF~s)^7HWP-_SP@$Sj|`Ta$#v}w5vqy`>WH<*X+?CVITqwpDoE(^%q_U~g6bOS- zB>*t!%lCC7cU}hhstCud0;_=IVKm8ZPVyAMRw6PFWkU0uA9M4ohvgTC^s9aNKfk76 zzu5gF*M8e1W5))r43{KeKgX$Js1S`2pmm}WfZ*M@OjuFYZYIU{Ae<lqtB?*Vs|-2tuYFVKu^ogHvjUE1Z;pW86vuiq8(7Iw|qSJ1v;|8;50Ce-d7B za+!+nSI90qnO(?lS2Vke3JzcD^@iZi{EZwyecfdHyZVZ5eFU|tlY8nLr&Zgj8?5ya zT5)()!sENJy|&<${)lo)b}fY)U0992AiBbo_3>^M>RD7Q2w$xh@n?5FtzL*#Ad=Ls zD>mp7PbKNHp^dj?HYc-62>2V~v}%Mh~A*QgH*uoVg$GVLn~SDiN0EYJh2r^ zA_506xgzAE04}cw0Oj+jl6kd|Q?bcOb(wD?LVnm?z(;73!of2KjG)^Q?Wd7C3N*Sw z+XW8?myE^;h?|x>46sPdbfYO3dAr9kJx}qji=Q6C|N43Omv6}pyy~SIT>QwpOL!O{)ItG^?(?Fw+l)*SQ_yA&&@gTF?ov3PK;h}m^}UFsa1Ok22yk`@=FTj9+kMV`KqUF|J6?zQK1 zW{vI*X<2mhTIydriI>))Lx%U-Ys^e1cNNxK8uaQKEm!yKVSc7aDULJ)w}j9n~ZGrC0i&)+cGkKa(Pg8h`iNyW^JNN zn$}(Pb)GNscGz>)X z*nY5~A!v-R;xpyqos7zXH5Da<=w1wOLK3ql7H~q>@ zHetm%{NR)DlkZ8}ZTb56HJ$DICrKcH{EXV*>am(xrR9>&DU-oTwzNzJa*%mg#h2u# zaDFMuriqPFr4oBcEQ)hF4KiPMnH`G*-hyr1{>Y1~5mipZ%4g;{o%up4CMiMf4#kfH zi|Bpy0h!Tac}dxnt?Hrr&71I>FSnZ;(*G!T@sB^tAMIjavn z5Pze2+0MBTi%QJ@*RDMzx%R(S|Jyp==T5FPvI5WTjpXBHk5O~YW-a!XfNRH9flgz8 z8@XQBk|+Qg>UHvBQc;H(Bsr*5?jOt_n1JJjh%|rx>+mN(r^+WZHQzrA@&iP8bH@;k zLhy-G`@!5^riw+e&Mtzj#aElrw+##4cWk4M0*K21|sFxqu9c`Y^cONSoTBBb@qMj$4zi zw2hw3NaX3ZTZJ)JF(qD*s}`mi9roxjJ?NXo_vD8zf-(_WGUyl_9mlqwxEnv3nw$AZd%4wn^$ptLabroT9&%@}+wOgjM3;8>j z#90#nA19Uk`c@e0u>QNP!20+vl5|S6x$n0}>dhIzrWc+Mtp7^$?^fw%nZ~XzL0XO2 z0hFCtEbpKGS@_dm5QYEYi30QI1CLLEK0d$8SoR1Z14oPW8xDT4$5Kb3F1`IZOlPU7 zBCWw2?PSW?me~Kpmvqj*`HIA!zkVCWBhQSSWV?1ZJQ$#sDKv>!{O}Y$|1!KkQqWp1 z69;V^{=DdLo7RN_mYqN@qQCA_ zvl_T(oh)k2Od7~sU zpYyWFHXVA9R!;*sOIi*=EqlMR`=Juk=xmmtTJz`!wvoA2bl>xzfX>&9Z+!X{;S68A z32)xfsK_&;&r*uiNI!ttIf@1j!lI~p6@;)iJjRxD{IUVEQP9HL^dDKRsH#Oc8jcOD zn8#->B-l(I=m~EGb0?fy2Z}A@n!MNBaC1XR(taNv-!d-Wk-sTc32VFQq%Hyx3jkI? z*a@&2l!$G4A>7zWObHFWy10mMmLxiD*f>VAn8VDCU+r0ThU7@i3R9o3G@ zS&yu};^lsJefanTqSd~CFQUqnRNYFYr#!nKd`yVYwijoQat<;Z8#{BeTbtUz-nqXC zyPhlO>?#n^3yF3VYAh5x(A0gI#Jy4eq1tw+^cHtpX>S+my(P@2$2V!?2rIUpE)rOP zxqCdVozmw)PZ))kQJa-49JXC!h{`v3K9dXPMpwV_vsSEp3IlRcQ+U1>k6RpiGibhk zapy2=XFzt13r4=QL4k%}St-~W0qT_m6v$(IT)DADJoQJ4gn{K5<9YYv<*WBAW ze;(C9Pc9OvU6xnt=~dT#yp7`#XMH@{G$1RWapHoBP>xhdi|?%xD%$#r_1||gPYRmJ zNXFq6fTeVuK>v-?fv{l!_$BC`fF0gGgkSz9{9iw(vnc!jaZjfI%z!u*0QL-{Grf*4$eOI>&2rV_yw0#hk1kOA zvMQi{Q7#HbmZ~*_gxhF?C>LH*x`#cl#74?RGRG~+8jIR7hcj=KM!cxZIKqWHrW)@y z0`ZqmDGLuLW|NSoX$9P5z`!i^WJv6_7^P*P`a2o83U3 z;Qln~PW0tgkJ)DT2zvDyb|%qDJy&jp2WK3D5>E__s;`?2E^d;rm9knr^TjDk+f`fd zsyUv@oxD}HvormZ!-9Nu#Pe1cJtq19hz0cBvHte;4R*hwJ%-h^?s<2vqyRZU#=qk^ zLcQxFw`ihv>ateS!IQ8tEUmK5tVN)`E;AsvGU#dN7^0RHexuCW=qrOGdiE|Ct3=~r z+lzf~8;2+g^B|69;8IV?HPhkj6tR!f=h!Lyf*|qRnWv1?oa$$9v() zz$lknND#b3W8rPXo*WvKv*OEGQh4`0-Wxt5YI zcv(mekUdn&-K4>pTb?V>&^h1;LHk9l2f`*50|-K)C?*-$kX5)z#;%PHZ}DyLCc)wh zxxqc<>_&+tXA^@H^_<=IPcAUGgP8PI)OgXlbF5(#Pk-Zr?%))ygVq3|P6;%DpyUjf zmz-zI;gjo^%UJp{~;;_2V#^oQzOz8BSeLc!Z zv=-X5>SKcVBtml9b%e{^4ehkL7G%HWe<1Z^pF=LV;|4ME4ZXZqx&i9cR?W7a3A*Kf zohCHzp2Fu}Q>!fmkaLh=4ZOp08V`>w9X!h=(+kc{O*c9#UpwPyT)IJT@;6LdkQ;k@ zNB-=C*BqI?B~H00h|?bG3R(eDNY9E`x;DE4|*Xweu7jcj-tRB#m74Wm)ek48fu;Wh@%Q%}y} z1r24eHr@%HgCsP9#P2iL)u~_Xtj&7d41tAFb6vd{TvIJA&$PJP7k4rexugQ+_kZ@Q z@YUP;4}WmGiQAe?_j%Tl&KQG(IKW0q7{iB9psn<*EvhFm>$J5HWKbnsLehoSu3V6XJkKY>XWu0O+(ZznB zG>f#@zgD=(x<4$js5N)vgaFk!;(ex7+qq}LwOIc~I=sq{i1fQoM3RN=qjO@b)Nj*W zA8*>YV^shqdeBx}9`;1)hX5Hm#V!mE6oXQ%)tS+MLZ6?c1e#b7=BocLTpRSs(cJ>y zuD8zNjjjr(Zz|k`Dw($24*@I%#-f-r;8c^30h2qo zpgRO-cydko3L$Pb%IMEJDe0)|%J{o5@%a5wS5&4!K<#aqAGLC@bAvgfl!&)C1aq~G z6j2ur`9%k*T*Z@vyzK^hc){wEy{CDQ{OjrMfHdr^AdG31mC(^KkIan1%}db*Ge}7#@EOk&`LOCXyZs} z?Vd}jHwA(a+#xibaKacXAI5O{2C%}q#eG(UF@Qd+DpTvqLEosc%Y<$=ncFJF>@cyZ6k5celP?`0rGdy zwB3ateG>lNpV5!S>{3mYyFjN4!BCM$8c3#Z&{N9`a&)&exKaw=>evdE9z;?U`E9lj znxBhte|#o37iJ6$EZlTq2Y~c$nnX$#&gp5NpU;=`a+*_y28QTrOfmsDDftJYfn_z8 zhy))E!6GVIaiwHot}3u8)BtSk3`RBhAv31ok+kbDbFLspJh)Py2W@*s}>^d6i6}CP%vP1kI?aBGRHe zeWNuQMwhTx&SU#t!PeCqqO){CA9kyb#BluR9E=4rm7WaNlQkkNu7=FvKZK^qk@x<+4kteJH{Gm&fJPugNZSjZnV_o>)?h zMfrz4|FoxnWe*=ua>A(A3VA=QXDj!1ak?V>ef6RHjd|12)#bjy%&9KhoA&S!BFAhV7f-_6-n^Asx`P?qV@n!?k#~Aj8VB7 zvh}Mcs1)@oE^4nk)@DB$0?XBfhqokW^zKcVp7;e9O;%KhO+40g9k19t*jD{e&{fya zvk-kcZsT})7k>B&F=$Cj=%~05H*Z6&?|2poAXI3R68u~314oIdyo;8>UbHkqlyYvP z4Z|`!J`*5GQwox3*r5pngC#)h!5B_d*98x21o1}!ztt(nAe8|Ks*%;hkU61_pZ_Lhb1$N}V5Z!3UsPRpF zcp5a!H-Os8AyF5tp{cEd98L1U;3<23;3a1Pu@OT}iMrOy8NQn}fOzfp?dIA&H6xO= z%saWLt-YS2IcZZI>{qAZUe=B{KUgk0fd?DP*yw^7U4f`_zpoX!i!ML4x^biR9|OV7 ze>BRtXs%fNn@-UG+nrQ*d)|9sUx4|8W-jU3sioVCPKUz&o>AR4g?C>chtD60To0uh z1pZLeDZv_vyFHTm`0B09F(-R*xf&B6gS3wk3fzT?8%oz!>S+YBWJ8Qw9*xVzhI2Xr;GFIY2O~04%@(6$hkKJk- zFrNSxv(q|%Nj1uR>A>y>R}hwF z;3RLco&#tZi2xLT3Qls-5iur#haNE;Fl6xon4*ISLplZ!ZCF8maqNuf!i&nq6K3Kq zbTb1oxv*f-T^wAjcG4$1yNa%H4)L4D1^&JRsk$~qCN=647bAU|XY$(7i#yt)kG^%s z9CgifPU<cbe_9!~mArAM>Tnif8E>LDseHx7<1T05g}WYEg#5jCsWC(RvXE;;JA zIY<$&m}!V=5$T&}xk%G5zYO2w#|Q#nU3a8k%w>>V0fJN(Qh<+yB><_9N`?Py?lhz?2nb5z&k%XYo#fwVbC#C3 zWf#@<*IB#g(bq2WOOm7ilm9e)`D=a9{dEv&HDR-aKKl=@$Tz8hHoc(5MM55En$)~x zcVq+Qhih{Y^fZjnIk`_a-FO3eE*eByL$Xy9gPw5bO4;W8th){K07RtVyWjx6{be#f zvvd1F??`Ay5Ch*8}Dwa7u$5( z$F?HG|E6VDWU-t}K0goni?@{5mz{}R9y-s^WjtQk`oAH&PK}#vhU^hx%GUHWuOpf2hMSBSFWzhjVF zfDW$Tr&jIHpoa?1d^FB6^w-%y<$BkHUdSR*3ypo|jg2x4+KCaBL)*EeZePD6i}`>5 zf_u33VZM+ZFCj&Fl>4I$xChh@UC8JeJYBCzryh(fC1`$|+j527v(HN$aS%lqgMMtC6zlDEGeC=2>HEa3|-%n$0| z+Z8l^cM8j+D*%M+|C%u|>Co&JQmeRJr;&l_yI?){TAMX&!0Olr+#5?}($N0mC@MjX z{>f=d_D;dy2<|)A6F0cb;HVaF)~E%x{^-i)X6~%bW&92nfh~CVHJr-b-`OSdJ|8r} zqgkKO#;HdQTBmJS-nsxs(UpM0w`u?yGydq`Bh7m8H&z9z-F>fAThx<$8aLKa{}dVd z!8{O>hpdI+UR7()*KQ;2V8Z*<4uH05+V}zI2D_SOLNzMnOpU-P?4QQ`#k>6QEb6{d zyJyh`Rm?=O3kNP0qEQoL3rQa)$;gzm3R2o)jU2O6_dxl-S$_*vMh%Xv1Xn)yCfvLd zmeFy~RnU{Vz$6hgiGry}B$%(SUebk^e=itoesM?EAIhVNE09pBgK#tr9c-zSpxe?i z?lz&@(MK=Y(YiVOFW2?zKK$r=bf_ci#1-$7D?$0Io>H+Km2e%uMd7trEGs-19rM~Y zRjVtZSB%vn81p5qiwW!?-!L4t-1C|rdbtBo{=i;<=#xyh=dnCL|FdvBkeGz%#w^rN zcPRg!sMB}~g7_2Mzlb<9I5{~86$kEN)W!nHc|P%wALL$GMT5x`&7vM?N`Gh-2D!+@ zw^6c|6bm*z3+`WODp{E_k~Yf0W1&qw)#?e1Z?m{$E;s`kuIsv%2k>8)y}r`OMK)sI zo~f~TXGiNYgs@V=?oJD{_KAy&IIUB}@ZQCxgNxGn8yB-%FM_$8QRN>@E4$IyKU_1~ z&B5%hb&-w9mej9Ut`nTG3S7hau6#Mb;R?u`)oK_Wc+oA?I~_i=!ktUR(0DcJFKZ=q zn`)a)1cS@D(G$pO!L`@p>8*R%-^dc8*8Q`(qE=5YDgxdTpixX-S<~CC%w{2#w|ec{ z+H@l5w(Z3SK+gwi5F2UdsTv|~H z{F441!>>LS4X<&Q=}usd2LS7~2RORVv(jcJy^V{b-&oHbKbqzRVLQhYi8)LASnDA5 zC>sfr%V=!+j*1++UL=M%uN zmP)2C?@1CB@@)u*%T0dug8uEwr@x?j*l^L{%fk-QZBAUmt*a{-zkpX%wPkRx)7ghs zHsA0i_vCWA`>?qW^(~J`^c>Q;9MX2C>S4Eak=0ujHOWyarh8=4TC=8<%7G>YcTQ zRo4-o(f|D{8Z$@HB@?s0%fP6Os*VHJ>mP2=M9PunnL0EG~T< z^g?iRY#wCgj%ihsNiV_f3EmDwXsCbJcHeH9fjpJF^;vi0#ii=A;%JjHa0kb;4Ejhm zoB_2i+KR5F>((jIdWNiVfo9D!Y-XFq1%|#ww~XxfSruXUQC-Z!e?#B2U*iO>)k%MUd`D(J|(S>2Vy-2hUuk}$$&$~ zfBE&XR@u8s#N{#hq+I)}J1Kpa`vb*!j4v*~dG}sqksx&ktAQ4|;=RhHAzc9dF>t$s zSS5x&Y?k3iA5a5Y%V`!gm&y^2CjoP^7X%($>=`BgYPW)!L?lb1%EAa}$AsnNu zI%04}LF$iZA@-Q2KTLMl(M_P`n#8%5JNe5`$$gfD48l!-YZ{%6yy)03sL08l=I^M+ zJJ97%vnZ33ze$otKxU49UyDK!ddDWyj7zdk$h;d9FKa@-s4erw&*Z98qpr!;nQyNb zP^kqlBs07GAUIvQ;9v%WA6gZC8&p0hXy{-Or|k~7rIX$ull>VSp**?l&>{ot;Tl{g zuwe|R>tcgtNcdCdWNZeFl7se$(WQMC9DoJ>zRI7Rg`JeNRO^qXp_cSsM3p}cj)aS$ zE}cWGy|^3J(@wqR*=0sXDqS3!yf_8vq@NhCn-YzQq=hC7Bmw`L5LoTzhmZq&K$YB_ z)lTRW68EVmz}{$5it8?GD`HE&e>W^|pJXpRJhF-aSLzPDI#J^-yBd)-l#mhT+gPsS zS!TH)Rgc^RP=eWV!1DIoO9e7TdG-W}1Uah*uqoRv^lVc}I4>%#@fzC2xq zAlG&;1(7Hz!ih(i6|X?e$q!U8fNPo9Cy_7QYZO*o#g^qLHgXTknU~B1V+mkM%bkb9 z8n8Z$*o^Fi(y-1E1CO4Ld6LkN#PXQag;Ed^_IdCF=3L@p$t9n)`(e~oYA9T%0u`v= z7MFiuaiJuFqc3iyr~^JIM$nuta;q^_6deQQt2m)52~Vt?c1ff_AA+tFoS!rRt94H5 zZbOg|-ex05m73`Jq6Uqcaf?!v&f)TL_>`J0plIy{y-cflE-w92+Spovv68HX_HIF5 zK{|%)CzmTcD`Cc3z|Ibbi0X$nPHQMC_G0WEtMJ>?*{E3L#SxSZCphcJS)n-S5rX!e z1U@%p1N&>#&6Ae_Y4mB2N#z$6)sbwAF!A zL4_Y6{@yk+{R36Og>Oq@{k3u$Q0(fs^8ggRWpJHewUaqA(t58Caal(r^lZ-1DT;Bj z<@*m_lDYZ#HT@Sx6Bu_n&lk*jCDHjw3_Xk{gvp9ey4i}A0Sg6Dd^yA4d_}JWL8uu0 zVz6GnAijKg%~$Vu$O(Jj4_~cw)~F{|ZSkuYbfx9#lp}YIBohk*ZFEh=jP9sC4HFsy z2m8oH(3>sukY^!E0`7o>=Q@b37Ozuo1=yLHS75xSVn)w-54e)(3m*L4>f50|E*}b>K!vghqjYz-KkHK)0p7h6gNu zwc=-T6n;bG4Q8>9kmP74;Tp|vUAk{kd~l`I)_r<(roawj;pXfDS>u~&H{uFO#p^c4 z**O^N3$qf!sM(KYDpvb7rebvGrt;>(kx81Y>`?UjjyM4SW#kI$|LWDYTK>{Hhk-jg zXvw})l9L%D*KoAjsid6FPUEIVU%$9#Y>mOeRiRDoC+bb_oEV%{@EcM{7PSV|R)oL< zEEh@nH!?*JV!zlnKt(_ajY)W)WIiHydXdF0G2P|uVR`o~dY|Wuumd6H6N1K!i$b@H z@GB5)Z8qyxggPS{L1%9M!WV#AvM?7JA74VYJZhX`Lu{f3FWGIa*4;Oj@<&XU7in59 zQGbcSKlzZtbC`_c?Owl>`*U|Im=9thwC7yPbMX zW*L?sy;xfsV$Lq@j%SxwI(`zS8D<(n1z==lRzVkPF)w%~HfA?{^iS=g}JDBG*3gA|6vE`e=p>>sGm$vRtix534oxT*pItaJXA@4v8 zAnj0BBK!%}GyBucMs`=Fqjm=#-U8bM@dnHeB(!Iea~vjBi_F5CMAtqH4P^}D+ND{} z3YCBm|!BcCpCkSG3&E@Q{w$QMth2ZzP}|eQeKAHFkupzIH+0~7oRa{8SGes@&g?iY@+hbmO=c7C#qWG5#tOyeq>ow6LF#{ z*a^V~j7LY+M+E&F36^au7ehgASup?roeAH?LDW zVn%jt7nK{=X#@jnB1`HC;`)hE?aQWHjRHa>)6c3nBuA;BPU{euRR^?D8RwA8Hh4M_ z(j9do$HD_is14^V49<|nvLpP*wm~RYLR1PWkMv*LvFIv7k@@~cejmZctEl*f>ESSu zn321xUqm+wt#@%55a&^T2~5c+KsfUd1Z&0#V0c+Me^7b?mq0PP0H8CB7cKKGeY$7Qfd@3t!jA-MSJ$G*4N5LBqT|=Q@o<(2Fte&{OK)=}=umllT_>Qt&Cx|+W@JN8mi?kF#H})~Hm<7^ z`-Ow|$qHAqlbLL3*j&!i4-6jg!rXt1cpIL>c@hH+9S8~<22t!eoOJ4^@`-J%&2A@R za3H6m(om^afGQkh3K!Q)h@c*2bD15#$PpwW(Q1LwUSp6>H1r<`7dA^TeKhOVxbWYY zpv(0yjrOy+Ks!4(VDdA;we)+-Zsmu{8S&&I>qQy*7Qz~e5FJQWxy-|$o7%xU*#)v1 zPOWUtS!)S~VHivM8?Meyqt?JG<(`FNz}hZn z@`H~lMg~0;L)*ba#TLE06~m3Z0~Ek)6*<#r4EkJx-pS4CAY&3m%wn>kcu`{i7qEKqbU7jk<;ws_0d5O?K>&!)hs6tX%!w$1wgOk6{Yd65kdD~I1!|jdamo^?} zN3M56*3Xq~W@{T!Rsrr^N@qnSjk~>vqPfp8l$ur>C?ho>m9i`2hdzgP1qYvNy4bHvtuxufj#Tq z^sTi-midlk0M@0}Y1O`0?a8xi>@w418Yz|I0?q2ZwVN*fUI?#gq`2JB$~|ezgEsp6 zP7j{1ee9i^Oj2u968>qd#28zMM=RsKbXrTR)X%_yEo8Z{%7L+(Q7|%Sr{9#9 z?a$%;o&(iZHU|1`KrknpOmaLE^5gzUeVO4>wWh5LVH*SAuyXb3wY%dpAyXV5e^ZcDB{*q0)Z+M{Nbr?o;`oMoYd{ zgt0o35sE5@{46dtnVi=FD~tQlA|nH6e8&KE;G1O&-QP)&SgUFqEZ1e!8Bb9i0Ly|R z0Hk_dE%)84 z^X7r}70qYgF(0X=?M)bc5?~6vorXoKD-N#fMxwl?=i6Vc0!OJ5hJIDariIWc5}F;$ zAI+0Unc{Q7p9xuJ%p%akErK1#l*(nnWCJ?wWtPsk^2(q7DE#avWLwLpeEu~V_pX(j zQ?3Y-$e(^mM!8%&=BSjTm8-_-#VA8-XPs%jKgzsy=x~(S|7ItCkusQ_45fjq29|xp zRoq48l*@xAsO?NS4G8!z@9267r>d{AKqM0Y>jvJyHbVxMdbgFKp0M3y?<~Nyh|h>^ zohnOjLVFkPUrR!R29&myGkIibRk}syNcin&(V!yyjg*%pJ84&aKpHr_5q|B98#=wm zXJQAzpMlK`^b+I(EJZ6dMXus@wID)p6376M9KeNuc7=O|%7g#NR>0+ zhU3}L#>q{Ui8=1ZeSR#VvjZ8Gv^K<^XD4&Aoe6!LdIL>Iqu= zG7M*uU`IS^()vMn&G!oGc#{hRYWJM{1jovuJysmf>T+v+nPm?g5yRx6%$qs+z2gSg zVw+$)fG2=}h?j*RRty^ei9*>_B!kmSn*7yU+GB{YqE2=sS_n6GoiE}H!1h7>i%mtu zLFV;?0E&M$OOncf2l_9ndAD0>yG3|~ZYHRZZZ~2F1LyvD4QMR{3Ipdwh^i%S*fr$x zP<(`d9pGJqP(Z)wT4`K>GZ1OXK}-e>HW>t8esL$avF}7%h9-->q$%oeAEXRk&KxS) z<%CgNe&h~=XZ|mW0qB)GoJBktXR_N0wZELnvqrTjlMoevgMB1tfS7>wn^(JxVvit? z9D_hrC3SdlO9%|A3&?oD3qrO5h#d7#SXdM4p+PMd#%;0~R(L6sfo$)2zF2nQ>W(d7 zA3l0b)sDIrWX$G7UPfsLA-i;O(Q#0bz9b`mk;>#C{yQ))C}@cSc}!c&)c8O9HDxWY z?zvqt%Y~HJ%M3^zKo1{)N(1;;Py{juQzz-L!;kYK_rcWb>@Hz>05ppzakE*3hIzCB z0~X;~fN!SUKx4y!jlpU8gz<1ZieLsLIb>#bb6{rIL!kb36}2=rV|GKRvO+^9Iy7ne z(&&$-O=Pr2{PO5J-AuJ`aq8BCJ7-USKl~0Mpy&XZS#RP-FS~Lyb1&DGG;$x@e4OlZ zE+YbW&WL9{LUQ7+Rv5tZ7@RAro#((wcJ6E|odgmz8;G>!EI-YRZ@{Yl@DqMhl)fJD zd5i=NtTP1RXoC&}Xkx>?MW22_#t831;S0GlQ5z2e^&nWI!B0HY#q1y;1&j{I%Odk_ z0A7O+T5Mdgs$~6l;%`C_@@3lyiiN0<8v1MbD+rzCmp}PFAsg?W$mRmw-fdPWpqv0W z{?PbE*)wXBmoa?MCG_w_{t})H-VsQ8TT4r7v1m7}q5&sFql`ILef^RyzXYN09tpS@ zbRHIZN`a+JN;(7}bHjwoVv)r*@m+;1YY1W=L6^)bnQ1lil%ysB?-kg^f^>^;75M}% z%9_-OnR=r`Q5I21F2_He(>+Js%ghaae)1;fD?-QN$KhlW#>C6ix_OC0r?T7g&7gi{L>c7y|eP zj}G!Kd}`KyF=2UXFhmM;jTCZF3Idw6Xmuy3^_RATuzHAweM!wN9j%p)EyXd58Jv}D zoHB%I%p_-Xj6zd8yvPP@S#)2ik*QoxP&wRxbfzh|Lq*5=X&gv3D@olr?$)^4sTr(P zPr_QGMu+^IU7YH9F0;N1_VDj11BidsFPm#0WePtg#~Ag>gX`?AUEQ_Uif(YyY>gYx zVe?oF$cwI9I=X+2lklvrU5@P#8|+{;XU#KW%gvT*rcv=L_NCaSvyNsxT}1V;@1z~c zYzlfKYZd&VdSgdg&6HWIIQ!0yA6a4Tq!hi0Dvj@-gvp0K8VnG|4#8H8QSfmP93dE4 zV&3xKJEpfA8xNla>0rd07;0DyP@{ZDlMh1VPVzDpA;O5w;ngbMlYu>-N!XJE2ofa9 zCRea{$F%{{C+H=1h5`im=FkK!=Q&Qo21$(m7c*Dv{-`=-uv{iG3dxRA)t<<$#n z1S@YWo)6<~sn<6UHiB3l)_KpkQ~57g?J(1oBGf%!2*3(JZSZsO<%=u8fUpFwdCPis zmr;b$ET|89hPHkX97yYLkXReY7!0l?0Y|Mu87rFM$C8lUXf{*vIgm(3Cy{tc;)4@w z1i`XYjWiyIAl>5&4+X<|fDbEQsDdCrpz%RWRVx2b>7h1=6DwSGS7|PM2L8KfbtkH_ zsie*frX^j3HvF=#Wz|)+bSWawHc)708$u7gk<1bsO>zzdTgjDAeAlP3^}Rtz&P-Km zI)d7L`^NY=X5|bi3Jx$Z$6#~BOuNjw4Wb)V@Qpg<>|#xWvnp-I9IjuMohMtIYEDqW zs9uu;D8&5^I)N>+_Jwi_%ty!g+_?6!P>$)V>2MgLT}VYZ8QW&(Y%UNEnl}cQf$b1 z4I2mMWtW}ymtW8eW>xSncI4qv%o%WxVp~NArV8)Aq#Jf~!;R3LQ2Kh#aB;Cf&&#J5 zZzukbOMge6VG^QPnFIGT1M-5n7)}hJ&EY`VLphB%@5L!TvzqbKenqhnbc4eK>OB--l$8)ALr0v2UND5Nuor+?LQu8EO4?AnPR6QKDlgG@%EIPj_Uvp7 z#zg@ch!CjRFYZ+@C`#X~*+-yWRg#dFil{FLp#QxeNPiYU0AvO|XE{60M$sB}Vb}_4 z)gw1{l?!~}0wW+}z%^hoCT`*_Ua@1J?D{Y5-PF_*>ZmOpi9I$gxvn|@qL zm{3}vtM0;w9}s?x(gO68MV_x&YZc|POP+VPlbk>rJF*1$mdriw>9gQho{!=_VYbi< zw#+Nve^hCHf`iU-fe3Qpyk{++Vwr&mPx({Lf_)m#M%J3GTlR45!}?x^IDYRVxj%5& zi6=uqU<37-MoSuPE6pW@rLaebOtdw!z2}+o#lF)B$(fsz&n#HoOP*&m(Yco9P$F-ytsWP(pJ#_;n2Va- za8{oO%x(;yQEa?BF?!N(mjz_?mT&wrxJ1lUiZ*&@J+fxExOH8oW_-U<-my*%yXHlk zv#ed){ImU=lwqCp232m}rdNHi2C-V7Un|#=F=@S)Ah*`A5k0F`83wpq);dTds3l^u zBM5NCq7~C$B3Zx-q?U6dHVBw0><9uwDE>p<85LAHRc$qbJ%VMAOxmfFijUU9<)Ga@ zOT<)u`TB(r{;&yw)T18IG%~#aTuIquOwx}@s>C+49x)o)`oZcsp4J9YFjA;mP)mmq zjU{ksadAS3%uF^@Ti=aw;I+2wruPGTo`Q~^MtpWtCuBt;@-M0&V(F^Yq~OG8a$G|cti+-t8xHm{_8F27<)M81nx{QK zlSf1#KWStDi(j!&6^b+{T#vH?_mj+phH2h&g$a4p2~<};6u`Q!6Ly&xMTTsoOVOMH(SeO#;-Tjw-7~m6p(?PB*oA zh2-!SqyJamisCJe2#z-xob57rV^OfqY?sxOEy;)u!8WO%sPK4uEdpxY!sb^N*TLH9 zUkxMaoa4zF)UMJLe{T?wPnT>gySYkJbcn9ZT|0G8Uv{?|cW}nNc6E}Zf3jkWNiQjB zM~+~k|3N#>g8R`Dw5U#~aRusL&IG+qu=utjWxiu8f?_aX#SoNOzN~MII>9fK>bw_Y z@$NkX0&G1?K>G4d@`>QAKbkO6ay*;_1D!SPMSWO8D%~g8Gi$TH_L}7^MNZ&OCAR(K zLkjCa*q;1 z^DTE35LKoYj@B@Uyj|A9wQq|JDue)P*0PB2xx1BdX&8!to7T6|kA_tjv@e&!_Ooc@ z4UL#Y0+|V{vaGby!kRcHX8j^z-E1WBlEP0C zBoLGY45dNi7#iy+a&P1|f`eq-im2s;tnFr5qbuvOOj>CNsTUQLzL(Du+3Kh&)4?gJ zdCE|7AwRycdVA#@h8f~Y=So?O?~{h)KzXYSTS?Ml*1^qsw6etPOqMACnyOE$odKPW z`R!b#w^gS#xKBL0n#A8<4Zv+pB0(Kn9U+d0kW z%H2WhB&Zytba9MQomIP@ZPFub^``f(M9hCe(-T;pu&uz;0U*F8V#82ax~Gtn!2PXo z-Z2TXsRZsohK@anj#D_25R@do2v{^TmvJ0dgcON9ObH61s|HJ0J8UUCVf|6mT7fXs z+<$O?%iErH*(PoW#i7cPKYB$4?Q-%pUlamlv_XX+2y!{qmu%hOqAF%UZW(hgZiXfl zj&cc;@_b}sI4de6VFz8ZeC{tlV`=M?>|3BEFop+o;*{|uspJslZoR=8Vimb6fazp z$5;ZSWk}sXkcW#cr}4ZO7mf=YCXoe2jE{1~!gi`rye>o$d_@w5vJe0_aEFk1p>YrV zU1S(&0*9)a@g^a3+G$TRmRULTJx>)bp19I#Ehxe`c!=UV;iB+R7UicRj3}%0$X#{Y zUJjmlbR}9tfc^(ifbuFG5yGnduxPqt)dH*22|1q_(EMLWemhR zxWm>;7NRyoL}}bv3xVUcvUFDX#UfEdiA}T8W@Xn7UXD7RB)Bxf%=heUQBXg0aUyq< zS}^}&D+4SnA=f*7Y5ZwWF#OEK|5_0gt3n%sBpJYsa+`ijrr+$4L1Q-OYu0Nvsis?n zhHl+l8>8^IPCcVj50PAMVRCPaYXwO9vd%r@O6B1^a%bMPx}N=AInardwW=1STr5)? zq76nGP>v8}8U{izU;^i}G*99!ff;`99_df;8PKsYnq~+xzXh;95N!bEh^k<4n?~%u zYyhphKyCrS7kHe=9$@U?JTQ5&gP;u~Q4ddKVSxez0*0(65GQbric2W3EazEl;y4PJ zi+^Xx#wLd{1PmEQ84n!S zU^ACHcFWQQCB#O-w(SKa11v58bdbUc#N#%dM6#%b>{%b}G73X~R8h~%xJI>AC8k6g zxHuUC{(z|_N$-ExiO2`Qz=}KIf=VWo4}ustN~yT06xVDCwNtd?VTQrYRyqnd8!1-+ z)|0ArE0((W;16CBqV?*I$z7E+yOmRIYiThNs~yC!q8Vj>6wnWGG%_s&^5APq5WUcG zjJY4OWB}7F!8iBkjjX@3EhpUL70I8b^VdY|FtGZRItAK^6 zv=URP5<4z1YAbS9y}3o*VYDJ;a=<`#Hr=>Ah9X$lZuV_)(6*@7 zU5_NIl%8ZG9}K&nG=3kI)pK#p%vtF(K}jo7-(^F}CXJ*g^BBLSFLO%PPtohms$F{3 zJC%i`w%b6V>^MAU=b2|0wj1el(5zy157Gq77S|nCJ9I3laUWcD_ZyADarMA}eVUeM zRv67DsHS5hHA7^tha+t*Bj95-10mfoukp(_WJ!ZI;&&<$}h8Y{cKoQ`SDpi7IjXYWrtkY_Y{Nv$coBPW45ubG`g}E z=m~uQJ#!7I9f8$@i(`9YnBKM}4Ei+7T;F0PZ?|Nl(bWvTED(mI1bkrAUegpG1neR+ z1qH%2NSn%i{_*$8{GBe+dTmw)m68u$Fc!~ga^mW1=-CB{j)7Jo&%>p)tqcG_1-0dNYw%&DuA}H5l1TJs zW03&PYLxXT!v<3L;6D8Ld*q&pYcR=Bf&Gcg1GP}pNQJvuN&UzUDLNU%eH#B5$e5`% zAyYve0?ylR4stupn#KUjzLiCYUmhu~~nyz6nCN(Cbt0`KK@#KUefVax>!yTBk33yho3m;SC2e25r~&*f7J;o+p567>ynE4b_{f|a>G+;O-Ks@D!JF zMNiM7kF?`@{=lp2)eEt(MkPWu2m$zBYt$hKK7(snRB)8q9X66(p^{n5G*T1zIpb?$ z)rFwb)h98F7;5&(M=aQY#j^-u7i?5mz;fifTM6^uKQSMHS1*P^n%Gp$>p5w63%FS0 zEP;-J@3XQkCvFK|W_d0xkGsI-l#f1~B^SKA5eJi^Je|ZTPPwsNC)6?%O~Hz#HBiY1 znS55I|HV$lMh5LIsKB_f001Q+O|k69W)x#DB15kocZbR+yR(9 zwK_@AYepDu{mrIAmE05_>sT|cj!6Jz*T2UWeD{Ymdsg71tvi$@VqOY0=*vtuJUO(- zoQ=5?%lNoTOfDPgyIT{?UYf?qD)X%@+Yg89CVsF3Y*Zif80xXqnK&<#fd4E zfR#cP#Z%xgsAeO`MV+7=syx0)RjhHPK|AcIhEdT|n{`|w0(RgP7j>U#+{*y^wNP(C zYuAZ)L=1uEkDhB7crO?`btTRcW9BL@iVz8nZzBZ_K&QCch|qEK(WQk-Db=NW zStO`u;0{|0OF90-17T}4sZEz|)L45_PR`8vS-G$`Z^-Cl_;6VvD2nV)>y)&zsLI{g zYSt(-zqC3P!a7BAm3hzmS}4lB5X zK}pb-$Ts+8akXNj8v3TN#Ra=YN^I2fTKt}_OPj$3=@y}8E#w~cl&_69dodi6TdZOSH554lNxCA z6G5r^R$)%gXH@!EUwdiw#kHFsZAppNdmAqLHLR;;vJFY$1$3Vy2>@ViQk~Qyf0R05 zRY~|mO;V3k^+gN_HDi<(WmJgjMu31w5O6ExMeHaf4Ji4RCEer$n_^dc#VWtu@X^TOD%NM2~tGB2p8E9 zs3Oi4sDxK!c`t-?=pePQI4a)B*tg_1jw_Qg=pYdQ^ot7jLmm}(IPi51gD5>rvpgC* z2QY4t8*R7Zhk$+{q6g^lbP!hS$m-2edsZ!YLwwk7AlOT-;(9GJR?CAJ`AO}My5(njz9EQ; zIJyOqIiU+3H69zu3Hqi%`RFK2y0CGaa>+06<$$oQsApiGA^EGd7&|lR6VGVNQnDCm zb5R}?WMzv-hde6op1D91Ml?-n^wYt_M%g>@vXqw)_sCzl0>9Wiub|e$%D+|>umC?QSl=kTZeK>-3Cc{F6{QKv$*EkB+OmFU zr?%Syd6N?Ab-27QT?~%xbI@$Snqe0$5+s)&klFk#K|t9Vdh6U>3zi6G6n($AV;p=ZpbCbKpida<6570yG6$t$ zu-!*!c~KPrLqNR0Nx(t17U-ey{X6am?~1!&lcMA~6DhB5%`Dayr@Qu~ui zI#VTRaJ3EHY{vZ4D z6w;Du1)ehl#)~y!h!o%=s!$;9)Y_#8Q~OT4BB~z$&Ju;1u=u7w4AR>nZTFM#Cl(lpObz8WjG{9YAs}v2x+R z%}pHHvYQoN^v-VFNVA|R!l*Z~*IPWh(!y5n;OOqDmDDXQvPq4LGwzGFo>e+M#R=HM3F-PcxtslYZx|lc zGox5vy_HJrey^@hEdmZ0RENf^Hgjgj2?tvvfgUhLz0% z_y`s0z?oLy-V0c?hew%~jPg%OO8(#{^a7BBA!G!HgeS7w2y+yiqT8*`6oNhF-xEEw zkta(Pf@f(MB%Mz>*S1G-js-K84g_9o699il#H{+)z-7;OL#GXo;30l_2 zZfenUhBAa{bmuHiG#D=^u085WyU-=t)T;oC8X*1g1{EG4%zT-Y{y&|4LP^Douziz3LPWYE>D+8hx|o zJ6k11Sw$CqW!AgaT~}`=ZSjcLX`Maq#52vSH3UNd-dv;Yh)-!t^b}em{A_g9wj6tY z@5AuL8?r~`8=CQQ5dIwSoC9yyyPdQI+jKB2Vrmn6l*kt}eAFsiHB$U&+pqrkKlx|> z?33UB!<#n!kN@p|efjvG%I!}Yj>Squ{{fdHt>L}2oW}p}*JJqNYqBiFjAYac@uqdj zTJt9w*{qSL*wf-Io>&E8yAd+$=`1!2VIbki6WJ8NFR(t)-8AP)koti~&o3mh)V0z8 z0i2|~?06PMAmm#y3r`;-ifNANxN;A&~#!zOPF$hD^WR$K!|U^ zthHe{#W9qX2GS}Rx+RAI@=13rF^CQNL$xw|E`#(TEx@G{1`@$qxt(0hesLN*o{RYnrOR2TDcaa#ZJ$RQaw^4Z(82{olC*2-i+#s|21&z1&9q9>)$#WtZ8$bik=a84VAJ=j^#(@c=<_F0NV*k zBV=h_M=WgYKp1fZBM`4gaq#g#)G#x3T>GD~Vl&ZUqtuGa z6_tPhl}Q*=A!}l27h`2@EuI5mwb9;%W|jqXD)*t7+7k5_gGiq{NwyIkq5|c(800~; zi_95aR1;hCq)kao4;&(pJ!Rn_2tDDs)7?`!ZiEYWH==)qEU;plaxtmD`VGDDhaU^F zhxJ)!9mt$l2Z@iyRky9cHAGd)Y|5gPPevuMiTKh?CwUolz+5CVb3BXn2SAr~Fg48| z)jA@ELPG@vEguxb74)!jg6W&JHGl^3BMlg6ePM0OEC?V#rT&lWR_{2fEfgCF>bX>b~s0oWuEF zxe@KY*Up-FttZ0cJXWr;_G?p%3+gS+Ihml4y*RkyL69fZv{xM^n3vSFD^oBk!V{8I z2rq;5wxHRvXCnCvCQ)Dz2c}-Y_-Z7BS>*pmZihPLADv@R4>N z)F9_|+h%7-TpbcWNa{hoLFv!<@CzzcAt;F!N-=mxGFaI@NDaN^2so?oh&}V|S z2Q7k?$d`>>xiq5p+|z5`KZI^0u^SA>GD|}SSu4KJunS9;mMd!CJxa5fbVoDe7P@BT zc5Q-yV29JH+k?Om;j@?4dHWEChIB)B?r$h*ri!&~7 zyxj^6g&<(3N!x|lKGjw-#j2`nllb?n!9zt7|AFmwD-89kvr-L-I-~x~5b(-7EYrtk7l~4KdExotI zF%-g=n}fQMO2T1n0G1){GL{Ml;N!ePLvVYSMS`kw!ewbqXZE$_$5vbsdWl8*C~HEt zh#nVC&(v74bWveO|27qe%T_u%D{lZxqii2DfRhX12j?4-D!WBTY01h!8C-9Z9o#;s zbCYLK7CkxHQCQ%E8ofaSoANjJ?rv ztW;g=1^13c+dHC8!xv*64Xv~6wMO?Q_+#o3#_ctFkBx&!4&CFsSz$`MRz8J=T}ku0 zjjwBUv`gUdAE`Z*aL@=tV_+MhnmjzxpGd;~y)*+ODxqHaPU7xLJq@_nO%_a?wrC>~ zj0lvZ519*h7$-2EyIptXkt5g58YSBx>H+8^)VEQ(2T)o-tPQFt3bPa-b20gbL(%g& z97lRY$dT{wBpik^516UsLM}3{t5RJ?%FQnV&Y-lo?WG+7P)yy1fBomeqA8#I_MMO{ z%QMPle~wfGB>#F*DRXVft~bPL?>VYH?J3f4IstHKhHwyhJEN9khaWF;f55XU?(K09 zreMR||2oOE8TdlvC}07RyuoP=`5}0BI!m)IRBnoqB>_&hI2fM(@P%5G1tXcWIPbtNw&b|zQ(1yMJ}h9;o}1{RAg>K;wCPqt=d_3mZ(+nM zNvzLVyLBzN*26UF7Co!k zY?ab7DQbOE5UJL0F4rNikt$8(*^Uzw_dZ=m%m~V@|9AddLO{{AKSVX7qieRZ2?nzY z-DMT2Kq=U8p~YcAlbdm2q^m(YvrLzNQC`0(oo2@`vhRZ$eand!mueXyRXr93)V&bS zq|-zt)kuoDmw`}08Enas4Ip+_VzhTG^YXz?-C`XB%M?%_nSec6qf9jBFEg6e3D0?Xi|MNL;Z zHo(xI_mWuy-Gb>vH$O(WAas5ED6CV^RbeksjU=J}+S&ToFT(9T3um$*52|@{;uy2hZf#WugX|g*e=u%^YPAT1^Q0D`n`P`8 z$osQu)vTg@L{Ka-v2M{%WoA_Ih}KF?@###JQfTjpOz}j(0-U$WtI<&SEOjRH zF%qh00oi0cT#&Vgpy8tGr;sBB2p)pqKO;+IA5IeBBaeY#Dk>Qm`UZ)o5X5s74^-ZM zJc}-frT}-}|7myn=jZtkgsN~n3tTxX17{p1VMP}5=0V8#AR~Zry9okymLvc2GkX0e zuh+6IVukw~@oRwiZZp?MzX zEO(v@NVN_{5O=_-q);5^Yi!w6+l-QKKbp$D1^dX<_li0^YfL<=4>+hDvmSy86UeL@Bb>i}HXn!iwo zM7tyS&L#&0S(p;SBqf=Z#Yf}a4^qZN?Ki3%%5EzkK|HxJynZEwQR*RJ(<5~Fi)clF zjoN9*zbwt$fAQi!`!Cl=1cnS86{?-EYgH|#|2!z-u}~!d^p7LgC(yKo`ROng*yO-c z%{Kta#YTbzbW->NUjq~TNdt8j`bs$tLbejN@7NrZ1cl}(K}mZpi|CbyfG$KK0Q7e2fS?4OZ5oR3D^pl6c%{>fSpxdU+#Ii##i_9 zLFJ-;{W-ny#jQj|L6LnUXdz`mrx-vg%IY%TOr9eovy@e}lmNp~eCnbsGPH(NX@z={ zDoM;baIK2s|FEyo7A}HXJS9zNCaszplkzvK4{DJsKCj=sncKFC$`_JGe-@q&2J6CwZ;C;?Y_~K?5lPq5tCh;^uN72fP>O_s&A2M zt>k@ljGcV#JWOH3M#Bf!Sr;|`3VH%wx#{dwMHdIgB}WV$#2-K*xmBeRoFstMO)ceC zoI64Z6cv-sJB4Z+I#;PB^(~`7j*>{dyQ)KSK2nh&xrri(Vs19#b!gbjQHomlE38Jt zaeDcE`D+Vh`Ba}i-G1`>>thjqWLQboKwW|31I;M^FpM{_fKP}r0t~8cF-la9Z4AHx z?K#*>W!r;6-zwi`o&{_H_pw&ZUQDuu@&tm`g$XufE}wXCqmC~QL9&gMDL`Jd>jD(` zVmK~u*iRJ0{VYpj|4ym``IajL>;slY1t~QdqH4-n_IYGgz7qpMwj&hlqw5HC~gaq%ffrLtjk3EbdlHvAs5KF)_;!G zi~be9Jn^7#KTRbC6*8o=V>u?pqK(`+sGV7y>5mG;*A9~iYT`!ibv^2PYh8+lWK;@) zbWWtwKys7Rj5_ym<1&V%A#$w-*{arLHvdf>K)(LbY7{1qXP1=K5C`>;J4c_guHDh4 zNM87J(Bo`eMP=)H8EpKERf%z&UWr*jUuiY>))hvqX2R|<_7q3pm`QQiu3p0>Vav_Z z6MzJ~VKy6}TZs+17+ALSLnajaS1qZM5rEFj$P)XPT?85TkY(Fj&Px!v>PREdBP(zu zlZRNl*BRe+y*>yh>D+eB^}|U*B0{53v`!_Zkd{cN1brpkBe6!_PQ@mkIS5^}he%@o zAP@>!^F@*m33Z3{G(ymJ8x5~ev4H1G97An2Rqxnz!Xd#1p|}b|Nye^h%Znsf<(I$r z!|=18g#Y7Th0mVpNs%l^MRmD6I$UU4S<)q_Z#yb2n3g@Jab@kvB8iB-+iWThn2Q~` zrN5S#v}7$W@3_fsqB;Z(MPWGWbfQt0FxH5^0cTf9(2@gp(!qidJXHzDMnuZ86ekRq z!{$oLHXd0VNn#`}coK}>iDcg4v+(lw$eER!|MFhIDEQ{SRaUzal*_&S`OibUB}E4` z<>5~dXhV{R-0t}x))N&SjH986MvG`}SF7==J7~T}q0*BlTUhQi3#I2Y2sk#?;s%HT zwOtwgF^C>5Y8dcLfB8lD{zp7jB1#+}c9O#mC{n-~fVw(QlFfiLK@IS#uZ2_~En-xt zl|fwvNLHZtK;6jnEy#6ox<6{hfCAER5yliaqcS0U)ca96m1gTbiVnn28e$%=V|+$9 z<(ttp_xi@;lbcX)tp=4k9_u4BuXAE!`>cnZT>fFwmOz%Ke>f$u@*t}=Yju=L zuZ{34Q0~L-6@r?!p(DcG5{=PtC!vN{`2tFoAB`mWI;+KxPKy3PQg1T zynQE(Z=?}G%+deZ@a=l@UZ_Es&u;CJWtWx>(`&mq1Q=*{9ox+{SyoEEi1IdQpYM-Sr_1kp@d66D}Z;2=j`#RMo(1d9S9!$Fp#0p-9Lvh!KAe*>e>b0w7g zmf4xZB(%u=Gt)W)l|yfL08EC{!pK3dF7*CtR+j-HK}=M~ex@iwswJ_4})DsFmjf!dTEDmxyx{_YLe` zs2GWMJcYdWT7$p_FMb&WqbouEt2>Dv&aB?^y^lit3tL&j6OAv8YoLSbH|j~5uc)Mzc!Fi)h*m^iRXu`AXaI`rt2LdaKPe*!)8yg9Vi3&| zq&`CZ8s$gSc!ojP*g>&VaRy0fZ*;UtT1g0O+)(f#z(Y`uf7XyRXhhN~-O<1q(|9=P z8#h|qsucx_&SW=ku8Y~p4Ff^LH6N+cwtyoa+^EL#v zZIu$<5F-nPFAy{{$Ka?<*`xsgyTA~V>Lz0KKmETS{Lz1O?VT4%S!j4uMoW?nPZ$=*6`}$EjLJkm4=q zlfb$~dl%HL(e4LMFd~MM-)uYWxn)aze@p0)Wvk@|+}($-4n)JvN^7Pma_Z4#iZ5hP zAH(*Ry_$;GT1qX(CQ26wNSS4+eElx`^oLh{*VZ8qGc5>DqrTS3;#wa7tx26w9UbX* z;_T3bb(3}lqx1rgn|0VHI!gu>3mUZ}A$vtn!|sE_e6q_AqEmW^&LzNjUYuf$O@%a? z|4Cf}g6wB~i*>mM*AA6kU-9UekV&DDsO14Hcq`WZwYL7R{IUvgc8HjHj;QC6^yC`7 z;6vWwutsZ_ZNXqy0>gwEc_ugmk?^|oGImaAx3{A|vqE{3BJJ-)+T%aOBfwE-N=BguP zYCoBV34F$B^5#vWBGb2r_g)A(UnC>Aa^-oXOB{t%`W%bHIpIxKFwe`~2ahO=IXRMf ztEU&t_YV>`L1IHF$AS)F2eMa{C~G1#fD#A!Hs{3g3h)sa+)k_oiu1qu(m(n~ri=YL z_Z9#7+OPb#+r1wXNdwbyM2Uk*U<3ush++Dv*QRvK`fk$Z9VJZUYIBBnF61AEv$v{P z0L?PIEG~;Aaoj8^G%*J|&^u|Qcg!e_G4~D^Oy+36Zm93)Sea|RBq9yvcdKNNHHj{W zcXytl9K0Ju)C>d$vFYe90{py!~ zvK>P=x{LSUeDKxBF5eUJQ4`F7cThYqIt6DcRofp2QKKSBr8#w;(Ds;2Bxj?9A(tR) zK~Fa8I`rx)(|TTnGHX=P1v`o`V{C>hGCZXjeF#PSpgMl$ z_AzbRDWl{Nr4rrZTUyLzYk3`lpHu=^W8l_!gg8I&F@bx4#e^L`orvim3{2pT2{b7_ zM%t$tB`!Bhif&ad?+pnuw%=?b=SsW^7uReN%w$M zlZy-Ysb}3A-=SjwR|!;3DD7axfpX7Yr0%3EzzP}o$bv69K`L-U%Y2YZQpZa~whcV_ zwa?RGYvq$bBI?RC z?C8tE6hRzEb;cafOt0;hIZnM2Oq~-=f0xPRN7IPsbJL3Rfk{^2RKTGQmy7aNtT=q( z)7kiIV|!1|S9lLt{jqK2{J`o0#sbtao(*@7nNm^9*f8D_ikrAd(4siMqBn*)jG#oR zaonLmxH57oXbS;dTpOk%KJlm=P(A{|gBX;Af>wc?sa{^$sm`6%XNF>-35T9R$TaaC zlWf>{iKYNC+zxk{Mx-uD&z<&uD@8I=nqr>>v_6SotzsU5arI7N@H}~np&%|H%Fm5~ z`aK>1{-bLGr0OPD9shaAZ(^+#N~TdB0}CCd4s_7wQ}OhuOM!G8x3l8%jVm78#sRNaN>Zs77BJ*P&)H|fl<>Zo z%|7JjfF*+8NEe_JX4@D9uRzub$%?g?v3tzppjQdBYBH1Q-F`SwSDyvRFd8^Rlf5oc=ha4Hr9W;^261^0s$G}#<@9Bhi zU!Pz?kaeOCh*A<#WG0=yZc|fM{zpU6I7%Wd1 zvSZSXM0Ik>KuPEIWf?w#WNiF-OcBs{q|T}np=RU+tBuTj;HrXsh!zVJp213(vz8xb zLE!D|RK5+e%xK`pr;{`xWbAZI7qTBF>FV50R~4lLa*k;sVmK|&ZN=A#5qYr-0`ogB zRQb~_x(FER28DNTCWUX;sZya=?wq=GVG~`iq$+}{Iot&h)8T6H!DD(@+!3>h&a%M8 zA&5XUwkk4=Ox?kp@=g|TLQg69;vq{k$k^@?rSm{g-}1F-&WJh)35(G#Ua+Iw3kJo{Fm z@74Es0DKH0WLLpBr#A_4vs2)yQO_2&bD?)>hm}~=EBIs5MK(L;6TQ>+w)lomssXzn zE)j)x$%wKkhOR#0ffR@rN-0(VHCP@bIdEBTbHsLNl?&aqV#iFlh(w8E_K>(Hm?(i2sO@ zOT`naYuT>LPBD5`6QfCmQIgR3T(ERbkiqOqTvPuCp|CSPR*#D)UTb=?=W|bvJdJJ+g4;4Ai_+6ax0H9R0jzj9#PPi2u=z~nhoX#z7Gf}yFKGz zC67zq;#6m#_pRH&4_G8;pegxG62J@K)I7o0^4nFCS2IY{cDAXmkbqzKs*^YDclq6} z9{``AK`NnXy-N^KcoJ={mX0O18Q>l0Lm)eVb$fhF%rRrucC=5?AF%A*Q(Cw<0}wT4 z3JS%iK)(=s6~HL6yk6rkX1FG7K;JQE2|q*;5R~a37w*H~-2aKsf5-t4)3KtE(F9cD z6P9b2s+mbLc_I5#JeUSq@o*zC{q&4|CHMD~vuK=XC$+_vB`tCI9Un-}RdDy>;)*U# za59Msa?Wz4uC}GXtntVMnvBjtj9fP??ci9)xQBmwtM{}_AWp+QbuolYxctE1b9TqY zjuk?BT>smoKZNewETPS<_*dL0M|;kqaxu_zLbD3QT&kx6>v^_d6wCWgY{=?L0uveG zmSS`hpL={LJXD}J@I#Kzx>(DcN4#h-*a9nT*LA?yK|}g$$cUd_(Jekb7BfyL9)pH} zMz_70EfYX7i07OH_xV(&u`nqe)NpY=l_d?jr1v{gzb&pTFQ+9f8}yL6PJPWP=}wa* z+=2Q(dzmn&LpBzFm*Su5oVqD6)COD*XUUZHW#dymcqDZy&DE<~pLx6x6Df!+o#{Ng zT*i7u*)*5&Nl>#ye|MBYV#vpKEG*Hh8z^ltE*-=vK^a6jN^`)N%tDrI($=0$mF5W{ z-Y3#;RkB>Ind&wAS+Fj(q;Ls2-gu8*&yUev{-*Z8EY&u_Y6R!09w%KglMKC}i%&`e zwFa*_9#o3&=LyErCDRHnA)f|580LwT+o(rkrFgETc$un!Rth4yiZ4 zuZVaaTwl6|y>4Q_f|lpD6+$Ey4~j4hXA!Yya?1x1Gf;RWXfOd8w`w^6V~H_t&^|}} zrcj^A6$|eijp_w9l^abi1zVW{32F-rpd3XBRVR&WF5K*d3*4|%>W}a9{vDa)TWw?# z4JSbex7OD*9*4E8G(awB0>h{hplG~_uz`eE4C>wZ-j4R9tc;IbwZfFckYGvXS^PV@qn8Y2$T zA2bR)#z7gv1n_gMN-a6w-qx3FlDMC#YFn9*f}F;yF`@UE%KeaNKh(*1SJ2|M((zz` zKTAc5MopA!{RY4(N$Gs=Jpc=}F3Hw24c|73R%ig7CC=6;u8oY6gf@(T9KRu<$5d$*MG6QK4m%I*zLR9w8O5{gFzx2nj?Wh!uL z!Q>y71;xJjm^VEII1u%amX=VM;CcckEfku=PG13i+ANa>CQL=d z(~*tl;hZ&$`S_?jdgeoJ8q)vGQotf2+wAS8x8Mr~Enk{iDuhr-7=?~X7HW$DE_}Q) z2Mg-cqLhZ60O=TS1imL6X}z0hy}Xfv=4K_5JKZKB@^Y5o8OxqC+a$)*7>?slVof$M z?V5~yCnRJafA5>`x%VGY#tNgZe&L3T+XZE>I4OHM$qq-^KFANXWjU+&z$m*#2_BRpsS9GK}~9%Vhv&@AwAVVfwhMyK#R*Jz5yB#LC0&9Q3I@SarM#$1N7#^JPyryFJ7%QT&?suC|6@h z1@C$6h3%aiyT-{7qLsqv3yM7_PH_`)YZHvYf@Gs1-X&vCMPlaOClg`4hEQw#T5r|q z|Jqc*?E#F*Wb;Hnd86Qrn*1oj^}7RYfNV0FCq?ch`B3Sk49@|0BN^wK zwV1R^aobXLqFjb$VptRx%u~1FO789nzhPE)i1+J;2fsm00YV*b7Uc?C5y|NqN%L_q zhyaFy41lwVlodbGrQnts3oQ`aip$NHpXcs0)>to0fB4lvg&$DXy*?fs~YL zrrCgG>^A}x#(!RLZHgn@I|1vfQm`HUnjD`}jq9fZd_m~K>@ElsYehb!Dur%~&%4oX z`FfB-HvV(T6OJe}Knl_(&EnNm(m7fAUM1w*Ad@%H zQWORqB;G#NOYow=3*&};`nAbtZJc7lb(ETQxm`N!agkih+ALRn1PpQh80Cp69P zvK}*o6MM>-OpuvALc!U|S{Lx34FmJVN@=Fwj~ZyuL#)$zHnZe4Jv^tK=uGjJT0yai zDxl61_{?eMWskIOEq-Fw?M{DDrRRqYh}B8Y#A}*wLl!}Jctn=axf17hMNNQ24_agNs{<`E?8$H7|V_hL=z24IPn9**U&ks${{L1t?xCZW1*Eqfg0}{ z*H^p`^$ZAHHT#Jqp{|uzxLztY!poPS_MS3pscKicB!U*U15?pB-``%#D%!@+@5kt6~@3eCQZn-lRm#5erl3FnYAS=+(y0D2dst%8r- zCsJ1gz3@gxquwdfMJdi!_&h>}&UlF`G`A~vf~;qF9DzPpF#&h%mE1Wda{w-3^^A)A zm;!TZOJ!ttuW_=`U)t+yhJ+wvGX!HoqDhmLl#EoUL`to1#-MT=5c|XjfJsq@ z-4i_k1u50a$}ZQ7hykg)(b(}JAmbscxikSj9x=$!UE@}s!1F&QLu<6ao_F?$8b3t@Lk zsMqp)#~>NdlXGfzIhCNIt{qR1p;pMXJ?m8=3pOK;v$M^&reFHe54l&USI#e``G#Fb z4arIn{F{{=4Cq*(YL34;W{!h;YXlyhMG%Kb0QegyDdH>8z^&?CuQrn3VHlY5+>XV3 zI97&icc%hJ(s2--$b64ICS$akQI6j+k8m~>ZObOm;~S*>9QTJ(*IuiCO3fPp(LCj4 z76aUgTRqj?0@|F@#b&!JFtTsLQ|p9bjIwn?2Y}b<*0D)se%I1+*j~B!7}kR@wNqkA z7^McHQXpPHuvtdM8MxN$x9J{^-sX>dBD+`_@NreFvwljVWu#^_IMmQv13Bq;vT`4%|zTG+i_U^x!UtSD% zKTmfb!5ywR1Mdz^{cY9*7Jw*P5t=bhg=$e2kam8=LPU2O66Xmsf39u_ z>H+%coR~~yPMo3OuN^lV#+pio#R(}YXo{!pMeG4fuu@-Nn`0y*<0vpLs!p6(;GX9? zb2Oi2mmf@D{@D+?Y2FE>gI_TzM9s}PW&5x|O59optic-#f9y#hSExmx^f2wTZBP+A zdtj}YBHwjBF)i~@rO zUE-Y<(Y?A1VR4#w^q`yVf?j!*vC`j02^GdNu!U_qs?yE2r`3R|vhV>z8$3_;_MBXc z(anZ1?|N|46E|*%MGlG=1sX3MosOBQu$c=^4sz(y9pRc^I9yK7BWlKG9SkCB8f#U zG6u+>Y;QGzXLnvGe&eqVr-$zJa8hR{d&PF}7fl#fEz4+Ev>2eR8-i4aGU8AYS7Ou1 zPav#hz1+ZYDIQ%UA~I*ki$bI|;@>D?WqQtw00xG5GiHAc!w$2B(i{~=NuS0@)n1ii z*Bc4n?XYW~;ORIgFtZI)Hm97Z9CCQ2uI;Jj`$LkQjJj5h&fX?xfMMgE@(#)bz;Ig8 z=1JXWVMsr2~D zQ~_hAEs=~FI|pWs2HpRy&WPoSxR9~DyTs(oBmr_ggvO*0VfYBjoi2!SXO>GE z1zZKX>Q3kKoleY-DxDTItw6g8226nd*UYenU{=goAmIXqAB1~)%vy#9;FKMMtmx`6 zpU1p~bC!cArRaPoxbKx~Bnot1P9X3vQPPfM<}dTb(TChU7(yXQ!2yP5G6rr(?va)% znB|!H6Svd#IfV=}Ho??FUCA{(zZR?+U4eL^9zK;+s9~|pe#7#dNKBe!rCQggzkRMZ zvh;@w!h)zQIG|%-ow4^`rvm6(9Sn53wF+HARWjvg2~jd!Qp`ycCbWv!=x*Q5oO?bk zQtyhHF43)S%O)vd`H}gQL?GM&%M5FL?bSxEg=o3N(#`C|Kx>K zqA&_B82XUUc%=wu%KG31K=vks0Czy@;Qx-mn)%jReUUrEe_LyO6qV_J~5Sv&4L*Klm0#f1@*0CABa;l=pGp=C%q zv_1)3E*a}}iHz}9<6f%-%T#yB`nP>jzoM8i-eaZQIST{Kc>p+P zCmC?DV-5@dCh+s(!o^G@cCT;c;DM(SjQ7wbL+*xQ(X$hAi*>5-Jef#ql;{&T*|hxd z8@Q8-3#w`|5S{}k4NRpqoXeZq50npL!47!Jt5UIPA{zU`@yNoGi&j(E^#%9f`*S#m6RL728Z7Hpx@U7SU7sB6xG{bg^zhdf3{cMkCC}^FUPcg za1U?t7AzykU39%rdm+Muy%1j+>|`V~*pHCPh?&sYF?H0%vW@ZjiNarTWyWn47x0}E zSvAOY#2Uego4g%7xDKemFc_HYHa9>Y|LjI7tR0U-k6H~lRf`KM;l7(Ic9Kx;{Hc7h zGL3z1Q9ji_?h|7#cl+1~db@4T(IRlEHEyqIN~z&GOU?{Cii|Yx5~qPu88_39Isj7b zhxB`EaSXaWiUf6<=~;B3kDRJ`?~uf61Mw&NI%Sd-+I!9PVj0e3%}oi^_nKZWS8Llxh~^^6?=p)|kJ?7`>7g?U=S}I@EG062$@nEYXSsV0+Q_u~Ahzg((CT_mdkTDT|$DQQzpwhb) zWBowt=1L3BFFT(n=X`y>7WR zfnBn?41^stt*&m*kdJERTI&&IJZ}D`Jfu7n6GI~phf`X5k=R#&A)bkq7_7k{T{t9l&bmc6}HCc7C>rj2Y)D+D6AEUazeJD(}Dx*Oc?=%+7n^=8Y{f-WfRA98iLYj z4*;pB;-e7R9Gv$}D-u{3c%*Z^-sz?#U-?MtCd1Lu|99m-e@a8OQ)zZ~LV`k@w^xlh zi60pqV93d+WNC$qyf=5x-=i~?Jd}74!F4h!=$s6%#K**s95)~p3KKD822~%K4Kn>g zSygf>a8U?FTbwIc%-D$;+YAIHDYc^v5ST-N_*Xj_!td1a7&9~jw4^x1g>*?9oy^kt zF{$BFT;0g)shguUGCR$-GbJ&PN`EMoT;nt_ZWID(66O!O5f}XUnQo%%kCB21dj6Qo zogD*qfMi;gw~F52!=EJjb2j5JC@CmYn7-D$zSZd8ssdqV=A7eDJXZ;%ih31rld~18nB~sUZx*B;mLl8nG|H{6_;RKwNsw) ziR&J50S58UoT*Qq(`oWb_9W1Db7%pt6h%7q)0nbWsINL`HqJ@r(htJ$yMBH0h0lHX zJp?TW^*AQo2AyVb>@^RaFHxU%LOz*PLRAtm;UKc|nc}UGP$wGVf_FJn>!K!8CR1Y|j2<6QSrh+Y49%ou zp^hc)*@1RkJOG|vxr0I8Btkh7b}Zdk5B1~D;2!X4r`FB*iF}4a2!6O?7&i-Q34k5v zG-b3&bs^OD(&-s_CK+SKlBxz>ibF#FvDRjvBpfDAJZS9hHKA!0(y=mhep_v#Pv{J3 z!`0NGxB9=eVl5l}esnu30=~*G)7%Gv`%a%@=zpe$j;3yE+*PmXl1aar{Da9m7di!2 z?(#wT%ofC_y6XlVFt)*pL8r#7w6{3}`=>UU^Fq`b>T(ysf%qc@hIb>4t=GHEdK`BJ zW3E#BT_=hn{UEI{v;ktCf)zmHOHLXIF_{v6cSno`qzo7x#IT9EdvDo&Vs9p9jab=^ zw?t8h-6QDXun+;UIyn7Y+)VCimfb)2KlXm&XX?qcQWfZ(9Q5D#AGT*dE^KJzLGj%l z?@KF8w1OdIG|CBwMNjzelEMMl{U!zB)Lt0YCB$58WWqU&+AIZRR0-*22WU2uhQtyf zpXxmg$v$zqF&N3o=G+4?!rWHLIbKtwk{Fyf8@F1LgZwU&YE@2Z)T3gNSofJnP^FLW z60(F*x$|U;>Ud}T&!ZDcPDeH?_g=Nzf(|_lG+O0zVW5H*1w&x-6a>fym}$kGOGYpN&*>L;cPLAXRSDgNs7E6UlS z(T15@Y?)sE_ul+XlY{OC`uqG_Ut7QR=9t~vJh*)4+C43%7wd2`^~<6f#sp0r8KjzW z^USGM5|~jqkYEdO@6_Erqj#8PBIt&h0CDlmq(X(;<(j+tU|z%(m?dMnMIpG29biK3 z8+OeJG|!RFW6L8LVoL&;EmSyKWZRv9pD;XVI!Uu|+>X3L96LYzA;I@kE)3eUT>_X} zbZs=gnY4*v>3sr^Zxd0uG3ljQd0}OT8C9AF8UPjJWX7l5q!mEC7Qc}|D@Go&m*^6O zPD`>(p#jymoeEvD>rgZ-bX#_+2AU=GA)oLuQVoebIU!RS?ooTf_7o>?Y~){8YW<6( zUOK2wda9=N>YUoksqi|fdgYQegC+zY4;EcIYOLHpqokz<$sBoKzm1A<4lbuezy4da3`*k+|unw?O4nyEySF%A0 zdFpNio<^CBPC&JgG6>)USWoCl(8n32XPzsuIyeC?3Kf;SSthy9;MSLl*z^hM7+ji) z?{nu~{t@@B-`2ZkM|&apL4Tult1-T8&$yku>&<0iyI~EXtyYsxw+dV}Hp%N0++4Mx z!ioO6mA;=WL10@^41McOI@@thS>WqLlRVNxIeG`)NZG=V`P5R+S0 zDHzp!s%d0KH!Gxsb!JawLp>Zv2Bzeeyv(Y^>Ia1YO+d209il4LXNAxQf?B|r9IY@~ zXdV7o&K}IDkbKyCQ={>Gh!-G@C+Pszo)ju;IrtU|M6 zUN#Zhv%|RKZaAgD1toyufE1Uyp1r0fqP&f5h(M7>1`IZjTs1<10+xCBrI5aGTv5fH zMQSd_M-STjv?+mom1<}bh{f7b#<(doSbH6u>J>7wf;iWQA+s>Sk}|0t(zB;gOtn!A z=DS%ymX2jfqMa!Mg%{muBR6Qfwb$;mR{^+?jIkNcW!RSElOWYZ9g;`ZdPdoZfJ@#| zcAE)m$)n8x^Rs*=q=H&)T0s_4lpc(LFFK*karUql(6#yy@JFN{_Qf84~%8<|qc>2j0xUkuZ=EfC6bkHfWz5v=bDLq6W%$0fr3-l;Ry0B-&ynBg`$= zq7zpYf@YvQ3K3Ss=$7;1tK}|dH}?JQuY=G2!^Nv#e)M;Ktd zuf);b@Z3G>Iv^HbEyZJJF%vTA@qx??#yu7I973zP&|ypfEH)q=oG@HxQ#p+upA*h@ zbRe!Z*sx~h=yiNo^n6BvdJGfBMr+xDqiLidz`M=$@s8WPVUP*3rj_#s=a4lHL1dzP z)F+FoPXe8dXcc;vTLs+efnibCX01$jy3j{1G#}dPugJAwX2xV=!VOKSarQRM9QVWh z0IUiglTyO)Qyb{TKPx?0R>^0xxiuSSaQfyF)%6_~)awhHa_5+I8jL@le);4|r94^w zVV>;{4=e=`AHn6yb0IY%xaYtV6sWD#f0^L#R_aigw8S+E&>U`4WiBe7y^7Z(3zGqp zAZ@+)Eb!h+-l(7+T`#q&7{wtgR}u*7?hhW(R>1&H&?*=(W#A7&&co-~*|Q&c0FamW zHN|>}K8`9tjdt9?9RfOOScl+dO&@&A#@Q`P1GT(Gn?_y=uocj=y4=~q5Da3(N)tge z4xDv#IxPhIq%8zY(~_N1=raJ=|&$z5Jk_!}~@h7M|dwPnUp{Ox-)$$N}O+%!Tt zE7{~0Q{u6Jdvq>?0`cy@_W_9;-aVDm{p?tp*e-n3TARH5dH-v_9^(6P;k?MFuO8pM zQ@`IGvs5C-&C_Gac#x5R^NQ%~pif>(J_O1cW?ypU?*l$Ht{T)&<2HYkmoc7j*>+t1R?1B;IP5im$V=Bo?>sV2 zDT^GJ;y;t540{0OaK>c;fKC(^aXUdtcv9;;I`@qMU&fvA=(mcOe&pj0 z030X#h~xstNHVXGDA+WEP-CRnI-yk;825*N<@;x@zZNZ%vUu;#(Q7CECqFxz z6tn;Rced>}FGLqs=FYVA++WD5o^gUz6*7g6lMi(~f-g{)cunS&AdpCpwk%+EUD4tM zd=E??bBl$les!k63Q-4Th*H+&iT;ls&&_goJfNh2OJ$beBS70wi(sARkbT(^@N@f z&`N|R;(RJNhB@1rv?oLk(0@ar2l_KWJwWidub|}TdU(L36up6%dH~t9GXudC$bcLP zE5UpKn-og@ESL?AYz3Sjq&$#Q$KZkq@Cs8qp{^p1$5j2|cd|eD7u?5uwY?~YVhSJO z00w~v3;H-^A?8h65f+u>2X-+?dFC^5CP|@B$8RQX_}Vh-ple+VN1}w5nx`9$!6_H5 zQcjzaGLcEmW)hx+qg@kIUV^ww4h$(&0<=Z(kd7O?H_@tn=f_ zI+KZH!JwR()d{VZQmO=(Nvv@^4UjYIY|ApVK(R66JD-ZmbQpzIjMK;rRnYB6at+zq z%~mAOEMO6RvlZvaxEe2)RMUj;F>5W$%MtU2F_Mq{bMx{?j@_@m>)J<`?ydJl+|ZP! z3a&q<%#Dtp{bofC0JzB6q#??MvJ{b$Tuqf7A9!T*$;&lq(V?h8^K6@h4_ZU7b#0sET&C8Nmd$6$8yHMMCuQK--;E|*PS-@Z zJ>8HeIy^y(aYJuR7|u}OQG3FpzB#9_(`rFvO>?7XSn1%BPckMxFiA6n(k1470+y*O z;pc#*j@W87Ag~w2bQ513lpzqeE9m^tG$-|*oRXmXXT<%Ff1aF6b#DUtgaTD^ge)(2 zhfVx-mpuA=>_vbRJ{WZ+U1Au70SUF?otkwzZ&vaqopKUNMHoz*di%sr_C9h)hOiTX z3F>Hybs0BR{2<6#S{8a+s{noPWb~n9-`Z^}kOjgqjw_sM7|g*Q-rnfhue0nK4~R8e zz1K!qZk6)8)EV+xS3f(dua-m?DU=x{gPpac&nS@Ni^pNeqG==kh)ygb zplz_=20;7Rc^1{_xU9Un;VixrysIchJ)fKywt_?Uj3nTqO7?2J5w@dRFX{D--j-|H zj+y|gy{rYHCjMeBtDVxC$&LsQcJja}a|ZLpp8lL)a5xK88Qd)8!1%ZmAn;gkL4$;^Tb4D8h83yT&1i506Ro|obZ&nrid->(c3}gyMM>+v%>zS}cIpWi9 zzHuVXc*8K-#T8v2vxVjxFI;Qm1wK~vS%bP27w(|~Csx4l|I zdL{BSya8{C!C6h6QZnqNb8WlrC3z6Ghxt;DN&PY;r2bMX5%XrTn!VDikR{u!*XO23 zf)PgZw{$UVrj&J<cFX&v=aUQ?C;fRol{WS6sa6sEmGWtm^?sRz1fEPDg>Ds|DJUy`{988gV z(_}-C2Gr4KHvi>cp8womCW`upetGq?23c*!Ib-|?m{>-081nQo?%>7Nao}G%s4!8Z zQu5R`pO8>p(}=)P&)}7aa|BUWh7=N2MSRypM9joYjChl2ytdX6XTI@FqD$IQ{F?CV zlyh-8cZE#u(DO`I*WF%SHZ-tK7|dQe1c5I|yJQJZl}8VaySWxFW<1Q|?`(mlCQ1TvS@8x5Y}jO(iS$i{7YVFv&)D_A3ByA?i3(+I>d zDiaKN=2}PM;}!NnXpVsU%_0;$76Eg3F9U7IFj~8%`%WxmUO)Q_S&*n*3Z^-1ShCHe z$A(_|Ix^7kaq-`0K`_-O!3f9v4ICa^#Vq!I(Sqo2JieO+9%Qe2htMRhcF^TJ(k z{D>M9H7i!W5s*qzF&g9hwECdt+2DBgm_IAH-Soj*^|;pw=Triyf+e3`#5|wP zh2jAe-|Zv_(kB=PY1AV>1LaRpJ`+$#k)Kva1x+!cPpG})?GhHBx74#CQU@@aOyK3pWts7BF@eKH$9Wz6z7d#Z6c`;MF9^{|>C>l!S0eMNy!}XOO z_W;hE0h=)URKT5F`ct|+FtIN7`j*A{hfN(k0G14uzqovGA5wo5rsxp-}!6L`B z3iLw!AQavhd5>9e4M!AN0`zj^UoFLIc*UIHL7Ap7N2KGYm6lcDd<(SHu5%xI0(dHa zHv~w;3gE%x8)+SLdO@-!XDp&MsZJKfq*!07!(~-Y7X_8axqI4B3ci{1AX}N`2UD!# zs?6FgR2g!?GY8c*f?9QaO03HtJmKaU@AS&cXuXa4TU&Tgj=zmfAddl6)To8MP7wo- z?S|b31VI+3T2Q@6h-Y|SW}|X{r3f%B&$P{3D5)R6vey1tzXLYt0hMM>Z6fQ|YM32w zZzY#N_d%h{i9X%y1K8q}!>Mubt#@o;J<|@gF(Pc5AiI4`SxJ&7dHPDr5Mxky#Rn`0 z#GhL8dZ)E~>LXSpr%{>s4e%^+UP)A{%N@jzrYrs_*1jBngJPi0?TR~qs+b59RV>h! z9aRjNH+k(P`YoqNgb&297+3k@bCyY&$>xdQK*TYwb-W+6dE-B`Aa4MtLdlkgJv(#Z zz1f29S*Qo~0UWX6{DmUDRG(7ejOKz-R(FP%|HTLY=YPNcfBwb~|G9t7m5W=Ok_^l0 zopTgR6yMR?DFrD+B>#l+N-XSIM8uEUiQB`Y`G6Ijgj z?BcU(rdq%Bto!;m3H9F9wz=4w5b|S%W}y}wfmMS%GaYg<8OPl9q!wuk%Iqp#kezDy zOp;V6ou^;&A5@kr-8o${hlsheYhBf*K3hool9v>wYbL8)UAU7|4z)V!fmtE&&2mm$ zfFZPA#ze4GC>C!e9=UAy_}N6psvYAny^+3JLNmb1M{NN;(NP;no=Ge)TgP-5M$iF7 z;NV2g5iiU2jd-efC!S@Qc0_$99UuyMTy_MmJTNaJ`qdxJIgal--u+nITrX++#FXgm z59ov6Ibkp-o4jxuKVVt-dF9J^`mERmA-MhH$=!Xw>PVHUj>*{E53_g}V8=g+&wIqt784z^3hphA^#Sn_+4bFx(}~0;iZyp}1(4@MVlpHzdHOu^0?y zPkBU!d=ANseWt&3nXu;F3oOhIhclMP{u`}zr9c150KnKdbtpi-ASNSk_urAxJxFy3LC?tSgvew9pwNm({JvGzxK-hG5KCnFI#R)e zwtL3F1x?$Pat6e+^R4$eRu1y`y<>NBOgUOi+}i6~mFx%|P+nlw)GhYpJpdS)Dck`! zcD(tnWj2$!(0DcO-eY*g>m;q} ziFB zRh}k;nhg|0N*xfx$}~e=5@+TbCCi2QfI6eu`su};!~g5mFaA>>a{%NAr|!Xp3kR$@ zxF&}F*%4IgCi~St@?tqD+*RwoaTUvho_5frJ~^xV;2y2QtfI{M*|~f5fQo>47+kmR z-4%V)HKSW@2^oWZMcg$l2fjuDeLCkRqJtgx&TJ~VxwYbY9ch-~YDbrJ)E{EvAufBV z81(aq0taN2v>QBT!h_f}YRsqhWObQ(=Bevfl&q6Qy z{vG=J(S@7pn0v!1w)fH#gOqfxN1D$BK(L7(oKn&)V7&o?NA^Q=m2Sv>{nU-`x%^nz zDH}$g1}780n6X^5IW5S`H*5Fl=cP`K@0z{Qteva4_ay*dV|rE4qcyJAKO zvS?R<+n6c$-)mmqC;BICA~1(ivQ2a&G6j5!gf_}cu3%FXgkVgc_A#LJdhqMPP%;f+ z!w>;oA6D4jda=VTr{a1~BeFaTiVlHyVx)}8Z4t+3Rten>=DZKw7Rq^*LfKG|4WwSZ zbd|gpWog)i#XB;aYl_Z;UE5Z2h?Xk`ud?9~DT%jo;Ndmog7aB5e(nCJo_zUF{?R}1 zGynFw&(_`OKH@7oK6Beg?&z-MPc2i+;-6_6qkHeYh}|otT?=)-@7&Y5HEl#b_!Yrr2l~yv1iHK z@^;?sm0uH*)E?on(d2kgl8-eByv_uKvP>I8-OXUVK)qabY1)1}f5MwYb2t7M+b3uqoih7GdI zso+S*+{7c9Gg|E5OE=`7{ty0>hrj*R2j6&ob+NoTzqz^Wme+^v{3SPiahE+AT{^yv zdo$t8$uJ~;khs~_TiJWo$8H+gS5-~idF05DPKxhrQAnBGcG5h|Jy$B2x&VK4O&pt& z2g>S+YfQ&G7eF?CGjclIXId6|>fd%y%$~DL;}44bv`V4#yVSv@sv)E5 zMhwXidzIAY#xme5Oct2?boZe(+l)dl0jh?f6R4O$F_@r_xm**do}uF^@rY%SD%Rnl zRpG>|Hh8h4=y@W&=NnP#6bKCv#2R$5YwV+&MPv9HO&~*5*YpSD-;-JZB4Pn35$=E; zU?A9uL&(>{a*2no8xHQg@#)VLfBYAJ{VP_Fjt0%At)uIb;S!gqk$VkvwpP1D*S5Xg3hh;WHcMFb zE|Jo4DknZBWdVLWJ8QBUDE?h0?vWO$TiqC5YnG{Y6)FYjVY3&Ke)oYML~{jj%=*$L zBhFrr6H|mX#SE)FM&+31$)!;qai(fhPJtlc7$q};$Zjx5h$JdPDZ_p;1I&smgUUt3 zJmq>Nq-l~YZYiwCbm{IXee>%5UKhxS_3QYBSD%0RGkaAw zul%CSVhlKc`;EW*>wo(jU;VX<%k>-Y9xWGNVxXXxt5g;{tZa9MGa1<@-UVk3F%CYy zkmG?adptIlihhig6vH{vSXeLw7AYRCj`sEokOPBlmv-F8a1*xa_;jt{%XW1=@YJn57Ch(}>X|9P4;sGLTB20U>* z1FnH!&ZsovF^IlRRf^ye(gNIWz-TztKp4l|_|{ALg7tuN0&YUkCjbhB`B;n>3|yW< z{ToxSAeAAV_bm2@aFa9P4LWOBcsTNn{W&c7X!(}}a(k3@NDo1uz{|FU<# z`c8aoIGa;i7SDi9{88M1Fp|VLOISkyQB=ye>@2@G7m#z+iu`RX7v6o~UU`voe02o? zMMu7If_i~6>$ErE`O*!rZ|g-kU|-t#1u_Db{&iC$2qC&8$)B|h=Xvv%pIK)Q+Nn}3t^gbgp`ZZn&}t(+1E($-K~Y7(ChLvN1fT)CVsE2ZVSthppE3k# zt|IyXxoTLpp)6&Lz_rEV@MHF8S=BFp_H&>4eV@zug8kXA{FATuUy|wkJg7e!w`bN{ z;iO|8*gN47BJjmiCnoQ+nKZ!!xNrgo75sQ0%dOICbLN%0J*jYG5RXT~b|UQ9ZnYay zpH8INSd=pBk3nwaZd=|Gfgeu^6J&4-I(1qoKX;nZXSzdXMC_R#(d%6DPs%%doIIt0 z0NNK47 zZ^wGDBz^aVMP3oSBV2x_>kJxjjq6MZB=ZOww%A>7B})ZQaiTpT+-30{^2pZx^4p&} ze*ee5@H`Uyd-&cV1t>;kx2o~aOkQNI|Pp!PDg)hE|oBq>71Oq>2PRO30D}R9rVW9o#-@r z4>b7QCt18#w4+yKrB;eTsj=53qhWnAR#oWZQ_bg58?H_nG)>Y*HWbLjLCs*%uy=#^ zeUV`LK7mIYm29h$gM_7CVfLr1p+b6aA5-O`Gms0|C z*sD4gq@~D@Emw6qO*hvGNecVwNPABQ8gzvsvm{(gX|$J-Re5& z`GfhhFM@PkOJLo=LS1ni*E}#04<1^v3trPpdhW0xiajM?*9m#7(WM9{(QCH?Gx~zL z9M^7`OJA1^mM6F6s(eCw8~Kpvg&^iZ;q=mjAZ_j46zolj-7PzJ1)KJX486f??UdvI9U5sCv ztImp*fVjn0^7>LmHHyTV(OB{(ab}Z@rRLu@M1~t+Evqq!+ScNlCZ&MWH9RW!(i+P) z9*<`2O7ROk~Xg~Oug0`3x52K!u@&j7VBh`tkZop--(SlP0V+5 z#bzAuZ+C+WkwN#l40<47<%;}FYiXZCxERnUa3NrS4(ZY;6CBbm%jFLMKCh}zJrn%n zYaZ;ouYN;F_tZ$(atoI;zPLtVwgtr%q#K~t5DvhjUNM4a6VW{%bpi#+BbXTHm*N4? zak2)VVJz8LQj}WFfFlSh&f%V@R^ix&v>cKAR@L6!?|r-e>0kWCU-@f)@j>>}qVk3r zH0+}I6Ow)$rHL0y>Fbp=jm0>OIe86_%Z_fRL^yhiVwh&K4A(%6w!JOLlWDq8XjXFV z4qp@2|At5QViFbd|i<#QQNy3OWKwC=Fldh*~>Y*^L zr#lM@h|b2pV>tWHdvY)%+*{g?^^h@xWmHk|Dfeu~VHe_o6M82^UeMJs4&uk7gTMFM zYvG^%#h?3wKlRgy`{O4M{kt<@G7T{Ajg`u3EllW(t9QQUmY;p*{(gREN>rcgm_Ch6 znVT?SG@b!%d+uMP7Mk-r6FOY&m}6nq7bQC~Druc|GI@)+8CrNt8MS$QK{qAtRvLNR zQ-SD_Asya^;E4c9LjnYSU(~O-n<7r9V^*R|$|@`(GBId)@uIVYMmqf>PE13S z`UJEp^&MMJxX_`sRD;y%snzR&k#eh3%SI!;nk1@r^e*Jul@~#3vst z1P$nz%7(?-54-j(ketO_VkLy(tegicIsU!ooEp6W$LN2~Z3EzvXc6NWi@#;wiADtm zJMp%OybOWQ9{Q%`;hpb&uO1wqJpXL=;JrW>Eq>Veme2qv^q>(ZlT0CF*ogqjfN*KX zechJPOrMKNrQ_mve@@e3h=#Zzy_&wty~et4G~pNo-z;B}5eI0(tXKgNnl{6Y<^jE? zHl6+xSav#I58d5nhjoT5ksxhpTb|yh&+_zXVqT=hwP(d$WOL~27MduKrc)uK-6qop z!al$m+#O*9>&Q1^mY~K3ks}eXHk>!~Y9nDDEb&E7kEqZ@i4aeMtEGS#So6amKq3f8 zASQO4pcJ{ZyTCxj0z(yrq5-S)Ab;WPYoB?w`WODCUwZBLeeU-d_jg}qC5rjzkZrcI zhF!S$_S1_z|Lr_GzQ4bi=XD5O&ZY(N_>3VwCQ@&|@9y6fkS$)WCl}ZEefM%k_<9TL)oOUAwig;t$H zK=VYzu1em3*N!wF1{pJdEW1aIY|_L49AIllyKb^ukx15z=;lYkZRPJ=l;Dt<$1|hl zyyMOZ@jbF!)YHs=HLj0~D+=x)LB?zyhrg)wWKxCL5HdzrkkO-qmUEQKlXS3y{`_7-%puW zeC6{i7QCC%hl&v#V-2}dr>9eyV4A6MLi`}xYr2U+{UvCD?7O$$qd?GVR}-_KBd4W1 zrE!yhHX{cPg>kn}r^0PV7;RWdEr1EvB{MI*#%?oTEi~t_xp|w$ywJpjL7|u;eCj#( z=DTin$tA2QG8zw!-xz8U;O2B?SS%>Ug?Qgl++bt`qH;4`bIs{AWjJcgL{P7yiD#zWHx{rT&pWQvcyU&t+EF$+z`f*Ir(;mqrICfXj>OmD73d zedfzmTMjT;iXS$X0v|jko1KRDMGWFgPW)pA25VB{Vg>1GBM||aqU9PI2@1rQK-qY5 z>E3_jUVK(Mx??YKKWC~HE?3Yfk;)ta2?z?@bw;lWay>KcI}VBQ08&7i-hd#4jVL+| zgM*22?U1ngE6;$!{z?RVG!fGsl2 zPz=n33trPue2o8$E4Ai+sngya(r0I;7MbjS+7CCg%Hv~WsC2hq$Oz;*2nih(Z2o1|JXnASO3cY_-6hEZceOZ5l?kuIsS_H@uiLC zZ>|1v}Rrtz3jPiMhBr+QxxMa!tjJpn#uFh zeeq5-UqNH9YOXko9sA2HMQfcPD{_f4O)F|2G)Y&8Mzqz7q%M_-z#pEDNj)rA6sGaF zpcznV24g%$^x-Ko@_07Pt1&(enbNgB5fkQJ|H`XBe0t~Z_W|^O=vSD&a`lZx{yTqZ zyn5Yznn5sFthhozMU2hI?@#tW_5AG4l(X63JD@l-zLIep#`hLaWs=WRadi^3IHU`B zbt4=(0I-FsgP7D6IIP1=oGoHe8?QMm$x3ueR0ako_o)5kK8Uzm<|MVsm3WPQ2Hkot zVS6rNp$LkWDS3LmcHop>5Pg1AVTP|4pKEV=8Jvi9KelV#Z;{D9w_o;7l+rb;jf#OFec+WIXiaWc~=0zHptEgyB{dOXVl1N zf&)Bw!rv&ZyXJYZk!2KP(v4}gNhOm+XjpZ80K@|Z24R^mruo?U5h-NPkjsLw?wO3Bwd}rLzP6`#ihV}ru8pw8mIiSe~JnHg_8o6>?!w$`(`&A3K1l0_Q zl5Ufc_aSLXv0@VKw~DV)C$d~^!^gm|OAGu|T?eq}@2k@1m2Q~g_LRxM!TneV8xw)8 z)dTm&mUcd+T2uZT>u_JWbU8JyXQx7{LA=0F9_avPQi)<3*|eLGo1<*Og)#0Hs&u zmILOq`gA<=2kpG^aYujh`(hz6=qcYW;T(}yO>=y?t?YWdA`dNQf1&qDikPV0a| z&n0uI#{_`CJ;`Q6US6p|A^9-VgdH^1Z+H*qm7MmonXc?y!ZgNe3f)>jSD>rxup2X> z-^JQ|HkHF1=>vio+Q9U<}S=>^N>mpdc`M-Fx<6eFe!=5cbmM>X%7#iBXc7v|+!7FqmU_fD}= z4`PDovMqQEa9-Uueq86XkI)4D=&xV+^Z(4>{#X8+>*6N~V}Y765q@rjd$(Gv@qH$| zMo{wOZ=~McwXOlLt0Jc`?Q^XmcxRHC%vzgKebU-dIZQ%$`02EBJC6H%G`|{4vCW!J zf{-Qg${JMo+Nz|_BH2q`{gPPQL%LH=*WL{^!8${VOhVl!nUI%r2vws*1eI8b_Y^X& zB6!C)J>JJF?%U&l#A1_dqoXw$A0N|&cz@&inKEg8%^A91?ksJA@IblVIk_XyqousH zl6t}hHPA7JlNWTHd?Ab9CdSdPaE#ktiK0fyth^~t=Z!k61T z`U$w#-~x$|oQ;DGbh~A}^|~xwGWKNMDSulCs8JoH=@%5l`_wlr&kiB=yoJv8P?i?~Zhlc$QVV*4E>47@z47@Vel z6a6HmRw9)~|B{Gn01(Z~1&XiG+RmNir(QKoKr{sP6G<7qxqn9rcBHQ8*W*yZzO`Xs z%zac$HjjTF9Y~*+T6U%Qq5$bD*vhfu5ECQd`IX4%3z+C7qlcYET#F_~9hbg|M1t`N zhC__A*DGo5LU1kU@ER0Dk!3(I?);K^Vyn&Nav}_n_^=z6pdg}TU(EJD>F)jP=RW`3 z>_7T?T-KKxdM6;I%-EnKZ~&qVE^uOiT{^fYH?&Vyn*@k&)ykxX+Z+g2aMo^$yx13%d4<8yB;L7g>{T6p{}u)TxR`rcTaCDwiutEDqSe zAuh$3XAso0QMK(%+C{m_fP-#yu(xyZ#1qrOKf$epSxSk%K1Fc7kP~7Ta-9Y zE|ihs#e|NoKh4wJdGY9U?%%%}me;&iH(Sxk=$NCt*-*ZPsj)(#U9(qu>jU=!za?yW z`BL#dAZ(8H_2v`l1LI%v#Qah0nwv+S0q?0q zXr+vxQPKE3(GjwtfnGzdoiR3ZFp)!!e$ln&--nvtn6_qs9{_%|uV`tL%mYu8ld4LD z97Yv=+wuvMX?AaCQJs`9*0Y}Ihc7kxDw5$|{-t>>*vqt*PMS%qIDnY!9|XZ4uP{2e zchCdD0bt(0t?GKq@OKc28~R_xVTirXje&y&js70*$JfbE4~F*{u89FXCT<|2k+RA} z(B9Qr0B*-KmK7gYaaUKRG&4aN25&D@4JlZKfJ_298ot4Xgv1-hUy-edE&@xJKEb|MNR;S<&lY+rTp3=&B}y=(+xlmjVp~f#Xva zO(3Q}5HPWh!Sbnjdg~}zf=-u;Q-VaRYl-j3{z968Bu>ER$NmWo6AavM$oAd%M0e4l zd*vnf)n8BMR91=BY)DviCMOlY`M|m7bze=ijF?DiGGi@2G-Cl80DFXP3<-oB?bzi( z+q^bv8=P28VeL_{2to;4a8*j9Qv5x#{u!Sr;M)2`uP_9$jCb0ZEHc5S#oTISC0bUa zYMCbkjKV2iftZ4zMxE*f%M{jvQ2ijjx~oSapGp4=*kIfvfK@B4V>X-;O_(DT>*?de z@r}3I!@V{h5{p?j$tTCtZS{;40bBM_fDAirw>&=O!QTrHVrB-K+;T03WgTA}lC)~% z5<#A;AEbb$y*783kEzX8RT4CCVeJS6Eikaw2%0Xkui5Cr>*B7cCdHepwm+MueH0nsMavmGI$B0`yRBGQrIUh|&* zcXbzXgYVIlSS0o|*=?VePC@^mc$U{4YetvTL{Y2W&F)GOFlY%mEPLxIeG1g+@7_$i}lFARKAbaAsL! zycuNuz?VRoMZ%fwK2RX*w++bKj*Yst@KXHhuO&LQd7|s-b*?bep~6bDq+>lBCYpa( zn@%ej(_SsuT^&_mEZP=C*k7E^mMfl+07xBlh_};!7L2;U6gs!@qDBS?JTp~9g>ax) zIqGza5y>{{?u+Y*>;XBAb5bwjmmaZ&+-jrBgM%zf%5@t0EjXNr!KI33KcKI%-40c( zwwd4*kL`HJ4xRG9N2*JsqdvlfJJ<# zjJrYUzs?B}$ehE)`2*7loLdZ|GM)`)w`Q126c((ywXtCxjTCQ4gKB~v7{=_h-a!0% z!?_nUV&hkAbf|04?NI0uLRu7sVm>x_hVx-hpD-pW&3RG~@diD8Hh6+Q7Z-iRIm)!OF&ikytc16o{WDo0`%cOghCv<~R0nAjvzf1CxQVY;Z zNzS#jRBE`hu(=h++TL7>Q2N{yn~Zd*|BO17+GVdnY2@?{x)H(;VbCqVy5YN(5G0& z-0FbsB!M)&YOJ*hg9b;!bNus-3UNXTWk^U6b;5|N&;;(aW9D^`Y_4a3Wm2Z&Z_bXU z)-WcYDp%(Ikl4Mtbo6*pdm$j8J+)ELl#7ifwIFsi zV2tmu8>DM(w=ZxBB84@k1Olm2`yW^jpuN0w54q@v>m1Pho^yqY+qu*e)-f)z<7UGE zA}O^x`ksqCHR`8WUdKM! zChj+Yle*aoKs4i@ki$$bM;cm8;x-rLt;RP~mLh9TI?SiERbr%wF9mUk_(dcKU9~aj z#0avO%PXuJT8q-{$Yro-Sbg7n_$z<%XaCAC|NL7QFY?V~sCtu8pf8h4hY3|0uI_~b zG?=WQ`9)Vm_uT0E?wW+=oQ`@7N>J-1E_+_Gv|KZKg(b(_i)-a0tdzY|C_)N!abE{& zN*xm`^^aG?$)?1!OT+{YH1i|6+Oe!5frt6dfC!VHH>)uo z$uZEM9TE~9xD^RTSOc@0MEGw$`(`87K+wRzS&Q#+NpU=2 zVk4;i5qx;i>9IDU^I|t*8IN;P&Div%HG5EGELfW;-sq>7RH;B!j8<}^D*A)M`gv0R z`lJUI66T}kw${Q_jTFut2i)-VW zgGxJ;y1^C+ODQA~VWRKJ#2!qUdQ8MY`I8`pL6bIf!UO=xy{P4i16>ux1yx}LdnZ>L zcVlbFm>7@YNZqZSRqGra?#VjaCw2AZHvILs+(ld@Bq7Ty04lzdi8#E|csfsw5xcpT z3}QAFnez7^Q9z&Z7(sk9`*SKap1n)IH?Cu(>LvVRdl|fnuOGL>-4l8i4Z%<8MPfua z9Ys_A@Yfr;+-Fl6i6eZOB-UBC9q@mv4zNN78jIHdpAey5*~L<~cx zB%vBVc--C_UBP}w5a>BwMG-9#mSc3rPU~IE&Mi(C5--PkPuNrOmE)C(N6VupZvB`; z{EgNSYt26_w{lvEj>=RHnpjPenMAL{jDyS1xM@8lzG-JuHYQS1$^irN5BiyL4V>{k znsWt)DZ&`A;vJ!ba7A}>f1bbmTz))jI~FnSc(GxCAZ8MW`!e;7VJM)N@sveB7IHMk zouBg(ia-3?8(PJr(6iECeS zQ@@*Bi@$otXl>U?eJuT?l2{V(Ai@HJb_@BQj#Add>j^Cl(pll$ylo{VLSrC)k1jgq z8`_-B01DxVqnm;S9D3njOl!GHm&|WAj#icnfQDfsXoccfif2GS$_paS1eFvsl8>FW zIEi6chS5KoPi|QvB~K!6opPIS7LjL7eFY@yOVTS(f)PIr_`>X9tjv3vyiY*z%} zq_r`6nLE{5)rgq5=+3F0Pp*b}%rk?KIu4JVYk3q6azZGJ6cFv8zNtli-nf&wKi>?i zO`v-jw|D#-Q~vRshzl2@RDtDpi~+Lbu0Y($<_*+wKRG6h)1GznGs^xDC41GC1UyC9 z`lXP9;wwCJCPH%Y&&8G0!Z;eCM}$@GoMxar8U};FEX%^|_p*)u>_7Jlzwt}|)ph@Q z5kSSTt8m?NH)nDow4>t|0umkf*hS3mmO2OEcDSdER`OsM!fOoiP*@^-|2=N%R=UhM zty^=Q(QYl`%k8Gd@c+90xFaazYbpF2^otw)1*xZ)b23+vD?)3LDu(;`X8b51gtx3Wm2n=l=W10c;_9FQbJTv7(QwS~ zCFmBjF0s)=v)dxiNZc3vf=f-p?BF-?1v&<@#7EnH>pV%%Vf0ugZD^lleC=&#m|B5U zQ}-P7xi*2ORlofZmld{)6=&Qc)sXFK)lq3%<0z*B$mUKtbI659PCsE)2+H#2s+&CDI_<6#u#PV}h&98am! z5ZWvEd-(d%FMj#iz4xT5&DmUu#MYTmv0#`224`r$9~}r~qMRrTz>fS0w29bceAqGZ zkx;+)kghGt>UzP=e=jjQ-mjWzQSI8r&(d=gI9Rw@ya;!A5t=Y~%P+fh6*p#O#7ySv z_|4S14JzF^>P6ATYV4`&9@4qxkKE+U9X;#zp3@BGDLt~Ng^fcC1_D#;lyb5!bmVv* z$NPnd15GOMYT|o-_*4otXb#6*b;aV$F+Rp;J$NK(N}0VqS3cl1qB*%NW zFa`lst4bz^FhxWkHkbCH*zk2Sa#5Dj+L0!Iu^Rw33YJ(fWx~*d24claBDa8}H5padUB6eOxe!LS;RP;Y( zed%F73=&67mdEL+z1%R3GTTNtd@-xbbVdw14FtP$l2WnULX6IbT$9pPnf`Zgx+f1- zq}K4AccuJ4I>-(e6lj;cI%ASfgbgQDqDdh|Nz({t89gN=J~2wJ)xa9-(z7>gP(^4< zSmNW~exF(kvsym#v=-z&Zg|l1@k^^9>}DJWn1CaLnz}f7?)SKpzwpH${{NYK6KG4b zt32%d^PS#(Q`M`nTRo{;s5KzQ7P3(rBx6AW*b5Lguwpv4#E`^UHukc^B2Gk>6DKy9 zm;}cp3~RAu15Ttk1TfeZ2!s$wSgnE9)Lq?O^Q%{Hxbr`roV~xj&pibZ*ifSSu3EKT zy}Iwdd;kBOefIDT&%DoVj~zKmN#kgNkVI^kh~Ge_%qDj!$jbPdS!FzOPx(Igh{=KI zZ+IU@>ZgHog}ej;)yArpwb#@#<%9B~YzBVXkj3|p24-JH_ZtS)9<@Y=9sGn?n4m3=&=E90I95poFb zV@T`n{?U}KK*bsumoC%VSd~IWbYb0vxl`Lx$)RC_)-$<4?@C+Jy~5!My)2yy&02>Q zYLrPVSuOO6-GwEz47&y)Gc~GW7OUSO9jlFmxw6dW&prBiFTYy{fQdKd6JgK=b8Ppy zh)}tdZYQ=L-jcf-7xw6Mch}Z!J(#B=;2Mp>wiBJyULgQH_vB2Q1VBvD9$~to`vN&% z5z7RkRj)KEk`$ut-h;cUm=2;z5Obynb8soJt2Co;^7I1eg`W*%>mx2o1OkMB z4jDxp#TfXAK(1M*{2=lAxjd%%R-Hd<&O4e|0Q>HJwni#Dt30w)g}hNI;}==GY~$yz zuFUmA%2HwE!ht)&QfOKci8DsZ3jwNTYqT-|$SvCiyK{vWStn}1;?bJRH~~Ev7QBV4^fL1%tT_8XcKO(8+ea%^fk>Bf49WW?DDF~T^VZ+vf*+n2OTU4&f; zHKv`L+swpqQFV8V+AoB2jddwoC9l+4N~Qre6rG%D;0+lmK&W9p8V`7J_n;|GQ$0C4kWU(7cK|8l~A=&_JJpy#K|C~ zM3Dj?L-mo{y1VQSNLNF+m&#LNrD8Y?#uG|pOu5jr1_d3F9W57ce?)qshjg1JGr^A% z*KB6$>hb*7o_gC)+^zWEE{|CwB&Xd+-I%4QzhS=Z-nlzv=>Usm!@3jq)Xvskf3oPh zD>qnYB@y~3$ZjCbz+MSmI1#*S1q(+xP%LetnjJR*o5tuK4A2of;lM%_&~0}sD;9Qy zOPa6ajb@pc7kZ&qu^MC*pg58qH3$|6Kpnda0B{J>I20_1ew5158!;VBPMc2G=OQ5V zM%rojQ&<~Rv{r*^tPssi&j2s#V0dl!IHLy=q^Hrp)t*fn(BO^gOb}Z>Rod}Ve|{Jw zO{qSw3H%4V$hFnlKU0Qh!F#*WpN#^Dk%s^&i9brEgMnHJj0tLUYt7}^cMY?4aUesm z%xmRKZ_W@81;rPdkI33^CfAMZ(tb~N3mq7d9NTs;t2>vhAwK7>E1=VpSvy&p z@j&!m$o*p=Hit;-TsY2Dzk#GqDiV@&p?P~OC2*>atgU*^L3XsPgzSc9)Xt{lO30qD zi%_g!B_Ny2W0qCn(gCy}gA=aKw$7SA-s8;q3m3-I8^*{T@gsM@QdcYKO<{;vw{rd= zFb#SlK@1TgP?SNqLz&#-3tdRI#{xl3pl{WY7Pna`__&pPaCXBCALqO8&5t~fX+ztl z6-&i=Hh_l!nLFoOu~Hqm|AWb%E4<37^r@m$CLg2&IFQ1>Wy_Z&>87kMd3B#5WPPEe z0zKjd$d-!trBKB(2Jmgi!+n!+z?;43u+wHSri+WEoTh|VS(@G^4a{-QWtmVK-N^)O z8=mRj-m(;kGbT(>k@C373uiemaaX&LQlqN(nqU3?zyH@0w4Uz9!!|sy&6w2o+!ZlL z1IiOBMmU+UfZaE@#+#@5+l4v)(DN+%e@fW4D@G_mNvTmB2Viw^BJEtHYd9?cgfmv) zvw6Da%>j*yBtZ;6xQFI8@6Fp{Er2TqnO>A8hNFBIt=0Uc-(ZBBiSI}{q3Rtu^1M#X zhn0hd83ujoM3ZSR)i4MOf+pyVH$j45YdXKs^hIr#)D6PV8Bxq!ypyK>=glRMYQ*^wQXTJV}cc0&a zagWH7lsQy@;4BY(G@(LQbTwe=M1PlpL#b0gMCTLKig}9R0>}Z!R z!sg4Ub3*C=BA}ainUqX^);`ax*MpCvz=6*O`$2^$dJNUI(B^AoQUwUjXrL_%Ub>Lp zjJcG##p7JJY}{vb%Lbzn%;YVr6y&K)3-?%1c6XZ!%GN6rP(~kbk4`GHmRY4kZn+aqNz;q>t zcvnTa+KApmA~L!SBU^g;nswzq@>XWf?(}=fi=W)5f4=%rff~Db+A@j(!e3%}tp#+V zln9K(P#D#%b{DxIMrG_C@L~dvD^dg}`u-a+f$k_#TQTccoBl~G;C*U87=ed+)ga#v zLhIH4QhK*mf&g_U5>l%LZUR#Zfhu{rZ>&ImFQ=Aj%Hn(aJ|AjzYhc9=?ldm-if!I5 z#_IA8jpG}Q+bcbImVq{62N>w@>63aUR~j@@@iWUn<=+cT2OV2EyFAL(s}rX|nD3W1EZGRA~o^ z_BlD79B)y}rCzZF#VPs~pm6~u0wHJwWlHV2dvG$Ld)+If71rp+J7J^dbEjDq}8PfmI(wRttjC_k4 znG>LE2m4%TcN4V!ykN(?j<$SYCn);v$nw*;+ADB`B0q^jmVu zyYFOG2Q=SsGbAlx5GskM4sJol~KRNCbBu3+O!_N7Hjgsjr(RM zgHWn1+;@%xI{Qddo}RK@S~b})%9%8p^?PJRs@+xIgbhTy&@b9$2?_vh3*k%|BRZ^r z>d%*=-i$i6RB*ZrD{js7xEyp@1@5m~3GS$Hsl&|!5r_p&jE&>l+LkNT3qq5@{ja-^ z!@ji9TwR!{(W5j%S%`bY{U2z@%GkLlJqHwO=#}GS1zyg*2Q0-n-deoxzxq3W+1=v1 zN5pp{*`Qj{4b~>NgbX8T%15*d+$KWP*oS4I}n|5(7GI>=awJao^4cb2K zI;039C=uB>0-;(_hxNQ};GH^UrzWZbg4-v3azOQG0i?})$7ey~-h0SIL1i2(`o{AB zyrz(^2E0!|6EGqT?~YlJsUstI(f(?x{N7ee2BSGtC}f%i5)N&UVR^<)roZ0T;AJpC z?(}CHrK|COiQZNsCpL6`B6VcOT1PJ)jl47BX04=EmF#W$cA(^ak2ibP@1omZh|hj1ead*HGI2QT=j2_>El4#vdCoaht(hRi8x{1P%3#- z(bkR%>CvIZBpu02=!a2{H}H(&`1}T0mPTI6%I6bSRUej$XHVb z=}u)WXL*)L#+pXml4TFPc_HF{zb7+KZ$0n*N!+j4V)^KjQ~T4~RCobT={FJb%|0Iq zO&k;fTy&O`*FSjs&%Eg??qc)DJyy3alSz-;*BMiGYaWL}4#6E`fJLC{owLhh+kWtB zn?~l94-KBVQg$;Qo^Nl)8~vi7K1^M8&9oF)1YQkhyu_SfG-sq1n0`-XiL`opT=7Hp zr&DJ@@nqH5O`5@d5zYg+);;>#tB~eTESncg4!A@hJLNfwY6WrC#A}!kkOfIBX-8RW zmv7YzgC)LrKytl7>I&Q9h+;QZK!@4yqq@y zZi8K9bow0WCQLM)uYxIrKQKJ6xEH*86UfQwTX72~PG#WPHw!~7sW+v7{$@TboeKX6h%B&RI&vjC$S zjm_~PCk{NoZ#rQq8}5uD`XCjRZIGyIN-kFhfIn=irqsD^EBJkPHn>Bg?(-V$BxAB( z*3DxiJdeibL`DO>(PdWXs`JQ)0bT!uwFR?W768fuc+Ww&$(>;?)W+OM84W39pV|S} znrBgodHm(lKTK1>Yq{q`Wz)U#jav*Y9Y{|fMIo49SoXtyoTtS68V&@K?@kNf=BDpt zl2XtsD4cOT5=)bk0rC*1GVr3}a0b~cOo=aD;UBNn(46{^53SzykACon?q=-A^{rQ= z&mGNZWQ{F=F3QPFhH$7twl--bPL7XPyTvNH@6;`K>bY_-ZS!;6!(no!Pq%H>m{}Sh z*2P-pD^Xh>uciizmy6s^==eWoRK_$&OpHda|7+DiCk_;;bnzGv`;6A288ds;^iwdLwb!d~I1 zQ+%sejqd5&vg<-2%DJ~|>8y531b`V@G^u#{q{4BPE?d<|8Hiq?QAzIFC}LMh899d= zL}!drk%Hl7pq-773j7~DjJj4p$HX1yK)@c>g5jfFrlNrX`rQ@JB>H`+U1F^+4Kv!@ z`Efj>PnV>W8sk{Po2OiINx%B+DfZPmK}C7%Qr=;|vF@Tz zPb9He$11LF-Njw~C13Q|Ctf@;Ee|Kvl{uN$#4cEtg% z!*VGH6;A7duf~~Ej0-re-yJ(l~|=tfu`hqyQ2)pBhC6&o;x zo@S>^0EYPaWL6#z&z#TVC{A_<_YckKzM0qN($uUPQ@V4uh+R#)SfzAywj#H%Ii?#u zFKshxg~Jcm3K`eIM4J1hMmtFOzIWn73fRjSW zc%apxN-0xfE4*dU$LM|X8o)um)>ZSEcs~OO2LoPn0hx_Q{Vy~ZkAtke3bfklKyx9{ zEwj)DkI^Y~*w~M}z-OW8IzW!npj*__lfaiGR@*rJJFSZ20C^ftEn5BE{q@JT+AQi? zb)97u5x0oF1P7`xY8NO_w>2UKiW9!yTMNcvnq-VLY5^;9uS0C!KIz9n=!24O%Tk58 z5OGCFmPMh*BPk?}QSE;27%oeZbdD4ukfdVy0()^+`=iN-as)I2r~~3xq^T%LxRtlb zP2Qu43V%l8v*>Md^M73O2GFz%WP9iRqw4%Cf=iJ@e)!+GFeCNOV zmG8ZI`w6+cNM;+B1A1~Q{5A>0TtMKE`VB$9LA$;Z`>>! z+`%}u-SI-yrHqlYhv?slbRj0}7U_!7Q7_J;4!x9Aoz`b7an1o!$g7I3N?9%N1)EM@ z_t1yF{o8-?F1G&tqdYv2BNj1H6f|2NDJmyQrZry8l%|l}f+9wt1 z=DD}GRnT=>G^F}m+lbVRx+u$|Q4!rYqPu-7jt;8SEL*vWYYs#ttuTCK@Ar~0GZcJD z=nEOGq{Y0UReo6{SFddap@%=f8G>42d{c>{03Jwt5!5Po zWYT46^9K)p^=CG|>Ray0uD)>p%PyW?-E?UPClnQt$Iwpo%FRPo1YxR2Hej6}UODIYx-99)Y9h+Gkg?t~$5S943SRT3b-d#{*zUF@8uC0ss`%4P?`+akDZdR?i zv7lH#O6en)ZS3lUt=tS#68<=@jCynO4NZd02<*5`B|FU2CNt|~9Js31Dq-lDtxAC) zLPiwFzc-qdhJ?0Tk@hv6fcip}UxF8MiqLSS-qw-``Z03EiMd^Aluv`^if^HNl9!M8 zAt9jE`Btf6whCYl8$oMmsjq|7+*6L1!EiVBGv`=y{8WpAL_L1JQnc3x?E=^AT%Y4j zjje|DJV?rn=4GXR5&*qD5*F-Gji)rOQT{rvtTF3|kE{)FD|Gsh=I06&lcv8qD|yX0 zuj%SSk_+o3<6H=mr{5DGf&1e8p5*3uHInfKDJ^YahSw{+E4@4uIwD2}Rz#ph(hArMm)DD6mOKCp2<%rzRvK*j%M+ z?3bT2=LY8dzzkBe1A=BuMS#owU6SU`gQ}(LFvut#3|*jQ(%+q^L;E^UmJI6_Y znBesj(^NznGOeG8y4aU}+I6C~op?PsEASpcQEFvl7zvVjo^ULUYf9R(wV{|`Boh(s zpxnaSKo*Lc@jZPT$T=wgQHHGEUf1ZF_bLd;Z~A&FG`bz)0H|50T64&N@tFRa+qns> zHoU)Ztzp_by?E)Oc|iSb_1Aa$zD;28Yl6RZ&bHQyNCV(UvWB>N6T3zgx81I|cvkKZ z(nc~U?+HjFP1iTTvj-69BR=E-2EdPdsXv#Tg2zOzIrKw^ z8QJ>ULoQx>Ps#{dYYr45?#F9}4`G?^^XnjMhJFBGJWCcraldr6lKwb;q*JeBtU=6v zOO>-WyulE*rYuslSe3oET>66(NX6)FQB!&8&)ex#OCu_``_RUx0g6Vd^!_9xemTI~O1#7E1{=H9uXen6Fn zL|h*BMGX*8W`KD>N_XeqnOz3&E=`e|W#xY7^wwO&3R&MRKDGJqPO{4gN#zJ`or2hOw|w%J+)xv``pAuA$bW+BP*D9k7p^5(E73=FE+3Q_){H^#zwnVRciJHt#Evunf_L=uvx zU9J_$aK^a1?apb`ktm3*ntUXR8}`LqmI#yFGL9oJG*tR1Z-SP+)hTHbAS&_Oz2K%* zm_JhXLcwosK>hU|N1h@x)uvOYzBG-VH!Z(oIU;KP!W*l`!5NTikH}LoBkd?ffyRYL z3i;V`6dZAW@{k5RVI$`fM1V1~HCA|7E^9#kjsVnGHjTFnMl>{P(P@LPJ%!R38Qi4EKSn*OG$Cn?0DQnnhJq3)cE zV-dba_{0CkvCPlu@+Ojn0Wn2i^ym*+BsOZ#65Uyqdg&|Q%?#=2QGh`J7;eB*7P;Nj3eDI>k-MA~(%c>~0HxET#X+)M`XYLxOBPx(n{ySMN*P0XMUo0Ch<*F5Z#+Loqh7PXWsuK|I2@S>dchj!t>V$^CpFS~%rRnkaT?v%&LD-M&ZZC30zylk`osKtMU0riuG1khM+K(qx z0U*#bav>h&Hq8WC4z&zy8AKI~15x_R9N0*GUu)ceCSaVb6^IeCBO^Fz(c*)j**4+;EbUZi{-ly- z65ZxbTMVpq1Q(nHVD`eb!zghq))7AvkkdONK57{9H5{xlXZT&Npmv$m;fYLyJisGm z+X`GR5sA$NxLtDDv}B<{7(+t63sggS|LhS)?>1eh#t;G;G4v1#Dba{lLOTN62;))wzN-v?8pAz8~^s*LHqrcw?Fl^?|3TVopST~)sKJVBfs&!fA^VB zKYjD|?C7L9nC%^wuOQfiJ2>4(bB84$)kPttG#=2uL$Lxu4m!m-7Q?~`=2|PIMGB6VT|IP{a_92c%k`zwr0n~sW3mG66oE%$>Dt{h^);G0bI4*>2lu}*)qnV zZwZ`t-~v|~QB!A-KCo%-8O$ZzdZb z*zUjmi;I%&exIM3%QK4m?h53t$mH;Tu%aR$rX+?g#n(MRLjrf#e>2Jsj#=|DQ7gdh z4UUSj)LXrj@`XI2aZ9Wa!9?9Cq1u+P~;2-eX!wdkZ zFrc)NXo3RW#S#Hx9%LeMY;E8W&}l?1w7r>Vk3G_$-vo$f6C4SvAkU7~I>xFqD6fETSs_v3DP!LxLCiw=@55Of^$WbOngLcuwa%avT{ zL1sN?R0*R5znjQ1rJo|{GQK6{0IMd^f>^1{+`F`cp>`>=(xpFK$#s|d?P;2c@1}wYyprM+!=QJXqM;y@aSy1 zxA}_QXd^clhji?@^S~Vg2}l3EKGg@0ZP8`<^0Vf?f%%2Y=64Rv(aK1!Z5xg3%(Oso zaFujLm09OoPi3vnl$KdlW!1jg|swzy^r#tkWXx1ugUx!D-RxW*PB+`L4GNY zOWVb;QM(#LPt4F{Y70?t#_3(*rdYr<5=xw*SH$CI^@Bp9BcjUe@=#{G)Ec2DzM zkL60ioks37s(Y)t{DjL~h-g==3IT`5w8`Bb*guqNKsX9U0y^Y|@=QqTG)}D6D-xR0 zFfhV{yZj=kBDDp#SxA^V5e`mEvT;@Q1t0#W|I@`E{Hf3F)_3*6Q-5i9ck^$3|G)Z7 z^<{L9;xsZw$gYXr0+99LMuHFG#ZrV`5DClQkQ`CwqN~ z@Mroo^K{ALyr$@%#b(@#W(!Lz6G&oY(^!zT(2R%ErytLL^Pl|K-+9%mUQLPr=Q#S$ z_b-=|zTCT7ozu~%M5hZ_N$>+Q7S+fSLAU`lF(K{i%`?OAdS&K5`_Esd1i#>h=+Kp9 z9Q4l)%p+qKz%}NB2j-)P97I6G85Bttw+zdPlQ=EpEi`%FRvnF!g)pq0dg1qS`k1u> z_sX)0$ol(j>5wqJaFEXwmG?2BS@(fi_p`08JF9fls$*0uKZ7u?dIy-C965CU3=DgdQs_Tq zbFPxlu-SyV+al(k3ADgdRM1I}RP7my2I#RO7cy{JN=p&KM_y)U#pnf>nACbG&S?62 z^8EPu_x{|g-t@Jf+W=t9pZ~hA*%*z!{d<1wO7vEGx7%aU*KIq&StHSQ#f|&a_?u9G zIbEn;p}jk6W+!C(wF2O}qE%#L7K<(dO~mL<+PSYOS;N_8ik%pe#2Yf=dSxcJdH-`w zKy6RJ$qG@{^guEQ5kpoJV*qIJCvjEU2T!@Pg0gaQLSv}nlEai^JOw4{jdQs9#F%OjRlI3h&}+nvk> z8EgPr*NxyZ-}%i~Oy2dMeajoa`|a;+?Oinc`hyrVTdxY{^`lDKP6pX~qQtKahH zi!}Ko4}m}Hf0^~)?(xt=54`5l-S_GWf6!h}oT_p`u zZp8vBXX{`EwwmA=?L(SiaT*;4%(SF6RO*&13jOuM*oCe%UI~fbuS7>ONYxSdp$>+! zkLte|7dhV@>=cAnbcv>m%MY-Jp!@q^MRQ9RbiU%edFI$$KG8q}0RSo!dDW4nTCCHN z9A+l5%Ue&DqML1PveCPLJ9+J{+3OK1#{IgI=fE!T&3NY>%xyd2v5xsdrMesuq9Zm6nm{h!J2VvgbU{gBdG;wy@}cpMpDrl zeOap#lc?t55Cu$j#fXeZ(>2s*U8~W*3A`SCr@aki;H!99k^$aNWNH7|cb0xax zfj^9o*hT|;q=4xg+Wc?^(@Og9B@CO?><^poV6#v_0a3S^mBax&>8UH z%U<*F_Iuv*FD9?~k4Xf-<`D>L?S3Ko6u7bwhFhp*CNZDc6079TLYt(P6%q{th_p|0 z+#)HOSWQX*U~?HWC7II^%H+W6AH{?htg|NMvk+Ed^5O?fW# z^*^x#;OU?J+12uab#jej&Z}VJI4o5s9Ic_Q6$y9CR}J$QXn{D zG`MM^ARWmj1>AEy5=x!>`gkgufP`OAZMe>^LqBpd56MH~@A>5T4mwN1o9TkCP8~#l z6G)}`xY`87U=z^VO#lkYbx7djunp|iy&^-aJ)cTdc?zv9kQmL=z$h|Rfx4dl`k{U? zS8rlPrc2`QRf8gZmsXoag?^+o=of|Kj&A+2EqoYKS>Mp;X!JC0Q{j|*iO@Wgp+Atn zX(9@IlxQ%@(0BAmK#}|MF5IBHhZ~d{+mT1q%J-=MZ!lk|{ zPe)cu_Eu9sy1QKCjc$DQQ@{Pwf9e}2!|l6Z67YvU-t-k;{^N1{wjcQ?m*4o`H0}z! zD{zy0FQCi2e@^BCnT1gax}uAvOf}r+q9M;;=jJ1a=7kwyg}(9v{qxzu;Dt%QU5=zz<38O+Bg=r{iSfAKtr}U$ z<57Q9%uD;SF(tMahcxq?@|Eb=0^^!{4Gw?OWJmjg!C>*xbFZ5GUw`X6zUEur`d|JD z+~42-IJxranMQ)ir3odT%cQ0#zatWHrTT zJHhP%;2~CU8h;HpTW%b%NET!MnpW~V3{@PdkNNH}=B4e}kg z&TJ?B`ejKoTlZ#;rc?t8`GA{)9piJcjPOhGi8#TecXB)t#Wc)|rpz2}D*+&b0kB+( zE4?w&QzpsyjJfPgn#4RKQ*zwKsBF&7KJl}!dgGfv*A)OB4?S@I7hfD4{QM6@SKqg2 zySf}uv_(U2dsFNoQKhA({HhIaPR21}&Yl1&6c??ieX9e?2@P6kHUjFfKeZ|4g{^)=Iy4Sw?_lM>`nF`?J zzwk3JzMn5_&9}8I>Bw~ZC5iC)!gmFA z+uVx2vY?T`Cr`|^ISssyOF9%kGofaYs|=P6eewL%{JR75+(B1P%5tLq@?dF2>Jo!Y ze^tR2O`BL&0*LuQdEHWGPIS&B^!WE0WV@bdje zSGCtL&vYtlf(0K3-5zr%3Mkg2!nbM?{XwIr0s^vU29(_G_eygW=lAneG1uO2FArd+ zyTOdYGrz2!NFMJ$*Bs54Bz~^#=NnOA6_5nq$pS?SE&_laFS;GI$nrEeU{Ph z=DFqBKK<0k4(VJW71EhX7b^9f%9pM$? z{2ueCg$+7ZHqgEE^JqT-_G1lmCzh0RKxB4cx`V<4OO~RLA`6WXLg4aU$z#Fl+Q1Ra z!+}gECouZ;Z6~Z<-w^Ech`{tv!Nsr;yaa(uUjRhsD zJ3aH}3lye*>pJ!8-8Tu56508j*8px%M=Lhz=das~4p!+W(@}K-L~lX|JM*4g!uy#+ z%Kdlvv-T3|GP%D`+-Iwp$G{oGqes8=3;*(;{z=}=&-Pdxs)jDq*%H2$1BUlh+>9mZ zLoSgGoAeHQLeK1Tu?yQZPXFW6<5N5NZ``Dh>@MbcroXwv;M{<+``f%l+!c0}(ED!C zb0#wyCc6sxYMb+Iuc`DunFv`Dqcv0^KxUKvGq)B{9E;>%D`Hl;#icrfDkj@ss&UX3kPZ}v8r17|^* z>r?wE&`k6r2erhYR~z$YLHeGAkf2C4MS<6BG(h{%-`;8LRq1EQ^&R6=<-wRYR-{l8 z*p0RN)&qW8q~Z`(DepDg4B_HhPO)>qc#U-55F&v$@QNXDAVMnFsZ~IhNq9w5FG&Px zL*Pz60O*j&WtfBdfRubz4F2c|xueHZ4NobmcqHo;#9&y4o)X+j=L zst+0zW6(cErBc@N8;NY!mwXu*N`TYR-P+$b=gx`56;8ES4J!n35ec$80n9t|$diT%0`~Us*PhFnBFn@4zV`L^gw4Bt&r|~rjbflb zMTN!6R>JJfy(I{{BE!RffpsLlzMU{tK~?dLFr$!=zV-v~0UK`N;f%zumQ~tm%f0|r zK&rnBzOFU0dv_zNoZc$vy+>LrgdXfZ`EFGZA`9GH8vUZvrhlqOg~8TH^*=Jzb{_Em zg`?d(=l3GWyIsD8oBFMLhk?>d{p5Penlsh{znq@j>xf~7!{N7n%Uj(a_x1bU_r9O{sh|7Z-@W$f zPp__DKP6r+mM6e&sg#G>?diC~Q<%w=BXZA-cg>}x7SXAqBl4g(YPFr11^_dogM^yR zAS2O*hT2lbg%nMFIqs8YCkqA7+85^03pgH(!Q3+MCDoDw+@HN@zUVZ!suOd4X`Y)< zv~tP&v@tK+pzh5^VvD$c<(iRrROId9>}nD>?o7@&hbTE1nfT?K%qcrDPoAUd!9}`* zl6+Cz-z|4PB+GG8<;HJ))7O6Gy}pz5c<%l0S(!&@HNulCQr|rYdmzZdDh^QW6&tTp zi^hsxo?D!!HX#`2QuAkyXaMdG!t?CXBthxdYy~ziEbPKH)EA<_GY?eK=>+yX=@b_ z$MC3mH_ZbJFf>TL1Et3rd4cCV4WyfWE^h+C(jq7>GUbx>bepZTBNPS3W+oUC;0W?g zGDYy_{7+@;3Mf)&fv4?x?`*p0Iw$n-e_?n91s5b`#1TTxm|R`oG5iKEj^-dCJMG%L z+57lF%m=4PWJK2x2wzCWVi=3J2bF&m>9JA#cuQ;}%IF(9{3~d?M>6P+R5cLc9&ebc z<5*6$w6C7vnP|nVxU7a@8H!3Yg;3|hIk^X#LL%SCj4MsdOYHFmez-5LUcLH;H@xkI z7hb8&P|NEo3-$>kJD101c|Z!9_N=BI-YF~zBxV=7@EXmV(m<#x6;zz%!(%N>&2wp} z#km9icuEI=yOr+pj)yYSGu&QVRn-FKuGZz|_YWyLpBvEf9i`?i_nA*mD0_YF4$W_$ zokY*h4D~%my)=oME;7fns%%|SxRbgYm93^E=JD*U-riPvaY(`sLmmL#SWv2aR8sQW zvF)^b``Ngt>-OCKd%x;U@3_}@j~>@Q@d>l}q=ZzG9$HB^9AXb3NMczg3el#Z%%Vxy z$m9~UMNkW_gPUc$$`f~St}W;&y)@-M&w@1Xu3nFCEC%hYe9eQsa>@q6GnPfUNcKm| zm0i|M$s?jSpS9Mqt3dc6QThEwlbbluT5c4u;~Sw~ z^}!EfBW=ADnq94635ktYsv>lvl}JA@5Az~KkY>r^`bl7 za018ISY^H)0g7wdwWu$4W~3i4iL~|BiNgbK9#Ze4iHLo6m5gV>Sx3_l6Qs(E z_GJQ7fw67P6alY4-l*0MghW==T5%eI+q2KIg6t1lC=f(ksdU_SvqEG;BZwA?dRUuC zDD2|JXf&_4s;tTUooRsuS43OEmZ@w5*ter18H)8 zqubovyw^949@9f^-?_4h#7A3I!R$o;71J#2VkFVt-5$Q1@M3J5ble+mWG7R%_|4&Q zGbxg39ij8Xu)2kGQyFvlu}cd|0&+gQ4^L>RZ*I`7;T0Yai>_c;1VSe|Z-x`EULxRB zTMJmuJ>lSxoj(wBcuufL<#+%{MCOP(1jhTf3N4|e&90|?^ge6#pGjrZj0i*EfnzNf zlAzshgL!Nfv~*0Md6lUMzbE<{eG#v-*#ybA)ssnqu|9 zxL+5f&oc_`Os4C!BVxnnJQJuf|vNL z*f%^&t-HzJ{mbS1uTf5r4$@vq?GATxkoG4O1&GCR_}E_mUf(Qw99(*4w%jqXTVr!! zP!9V7mV*QcCcQ{;8bDV|0meW^ADyD(X>)tl-`*bYB)3l5)#0K!Y!0?YNs&eng4`T2 z!Y#{VyIhss&D)aGxYh2?p4mbO|J?KJ4yW{H`h{>LXA5P{bL2(y79DwT6gGx(DnL-H zV{qDhDbxYtZ4@j{Zlqy=L=As8jf5jF4quf5HUS=#E=wiTX3%%&;=~&FJQ}`HK3A+= z7Vi__kqdqo^fiK4zi(PlseVuE6@Ijj)M|#bREDo2ZuBThwZ(5WvU`CCkK*^71slM4 zDs_p;0@hisA0t+u?qQJAc|@tlw|e5T9u?yog48K7T*%5qe&cUNt(A;Po;TXX8Wopf| ztc4QyqfQ3G#Q5zA(*)fox7J;0;tCY^eyjY6M zop-PUYYZY8beyE-rTmEUAcDu5+F*h8l;Ud`w@@m*s~;#M8m%7MU}bKb%~R&&S^zh& zayCR6u@exa!1Kg`?f&fTnp0a8sxH4k_w?dfetQvNYF+4Y_siu9TN?*6`_DdQpZdJ$ zQO14#>UEL>dipli0nbkf6}pw1U%z2K#uLjtCfCDne8~KzN6b4vV{R@fz5UdQ`P7Z( zp}lmxH*`;a`KI~dr|m~SdQ5k4Z+noYLx!BX!(*1Zo0l9fdu<$#p8bXY{jQ=Dpjk*Kl?dNo7US4jej zjV~*_t!1ju@iIY;=5aPai^c)BAVemG$PGhJ$aB%q$l|rxmhb?WPf-*i-zFEZRGd#L zAbslMr4n1kk%yNTOu8wjt|`=J+1f!qwPIs(ZjWB@h_NUrFW_;SsuPY|m$1XdR2D+~ zc%TTVl>r#3@}=QnBMt^pYhX!8vdicTKGm>pA}lA}e?bn~vi>vKN%Aq-=i{?j(DNsA zN>A!Ga5}XFa;I8{%Mo~;y94j|C4n3HtPdhRZ1BEN!G5~iCceX@egW5hN)sA~Rlrttt ze-M4cBhkyp=Ho}^gSUtgHs}802llBN`1o!69j}U3EEdVi)Aom+Hvi^S^tWGY{^G;t z-Op3*Kds$4lDO4-8~=&;Mq zpM2nnC;rEKeYfb*QDMr>Pe>o9iAdljv83lMEA_)SQQXp*90QFF_v51>JMPgA>ZZ#{ zt~#GE#KavLV)@bw7kH?1k;(nrL)X_arX`r=@MieCSF?UqG51E&5Yl4x0uU5jA>+(*K z=QP-se%#@S#3tZ1G$JrpRlHUbxym5!6J|>t`>=r_;#k!(6h-oj=qXBVD!|)mi^g+h zD}`#g73|7szK_?qX7@I(-=fb5o@&zwtwBZ?i7aKfUBZX&WVZIndC5M& za&Q~3%XvKOCH_5e1Z!*=%$ZC8negTq9trBj5xYQ6y^{(9h6FIS1Y^iu%)L|O|8?Vl z0*YHsyF35@lFxl{|9P`DLZ!dA8NK0L^omVt?_6C_s~W=~_k~OUFOJOfv&bd*tA-RK zGBSpU&W_A$cis0Xqkr>7QjmUR(-d*^!pwZ)m}C#i*1YHWwsU8>I{@5zbHC{J*3tP> zlbuoBq1Ghn8#ke z!mbYOBmBBFTQfktTyY!e*g&aXaU|mhAkOL0N=@(9YFlb()&oXRHj4o8lWB9MRt%5d z!v4%?6!5bOI{yBg==AlM`kW--j`{NdZ)2JUaXHrLA8RR5F=R6dL>WD=Y#B&8dsT`e zfP02RYX7yDp04z*_txh@1f_()X2Fy3V)YlqY$x;^iKBJcrS}*K(%;>Hqhn!vVIfjS zwUpiq5Mbcqx|=s_D?!O|Ulf5`PL`Dc6FI$SBt3l5Gz4dD=iq)($WD9h69 zy-e5%ZZU0b(14-G`sMSbfc+b-F+CBQd&Kgx)5=UI^!BDKX_sc=I|>Rrz)J}$?etjK zgg!X)7^>;LjuwC5gEBz|)EdUvb?)Acj4gE%(Bo0C=b-o#0*_pGg8OqS@WvbHim%sd zC2>!Tz((u_+;D5iou;l-TCSu~fSQaz#yuR;`Ki-e<8=QBdpLe&p$rQir zJas`nGofPjcaO}28>Hy)nG+fhJi2Axc#dR(MwxlbMIy59vx=Fk0KWP@`lox558tLj z;e!XJdhr&`B&Q2mJXdda*KTz#HMw|J+>MT3{NhK>-RoPW541btMB+6t8YOccsaS{e zS0to#WXA>jYvQwjh#M;s&t3e?CwU1~u_Cz7`^TKt7zNfwx;IR%Eym!3S+5)rb-kPtB9%4~Qd`BV%G%=(- zjS-NR)#IU4y$65f;zdN5z7;ET2=qtV0i*!U&xBnU>28)nB7-*wrQUWuH4=U4T-aww zK!|CgDSztOE-KxHzM*>^Ot1@B117MUWx`~wiAhAwO;ppsm>wLna#kraBM=C(t=$CN%08w#TkW-M#v6zwxiV>0aNeJ0C8`Du9Sn zPj=8>+&do*6e+KWj3I`0Y{NorlU&R);Sy>zs)D)&-5#SF{ZJ1zwe)X0R%$Woz3fsV zS3bgt4{#5+Yeq~?0)hxKz?W~B2QIL`VrFg3@UzZ)P; zlp+Ax=SZ>ULf!9#YmzD2m?pzU1ROi>v*KNOD}`pR0y~#P8#`UlKIsB0G3@J1gLb6l zLZ+|d<8!04gisI8=&6&YiulAM*KSdyvEH+3Ja9A7hL1;{_Vw44Y8Bv_U!I!mh3K+? zGo0x@&lJTU@PUo0Lq{synyT}cw}X$=Oh)Xb`1Zt!;AHUR`BH$MR-tLo^@K3JoG~1) zd$}mP#lUO&o)T246H%86dY)$9RkKsU6jF7)z(r`Q#k(QV4gEiV0|rtY=72$<|^IyD3Y-u4JUF*PFE{)yK^VOx!L=_ z@C)B|ukVyTBIV&nO1SZ=3255fKBA{#rYdtdMm-?N##|g2E(>h827R=#``DNt5HE)t2B|n%UHW zoJp&}*}vLK%LuQU?vr(I9fL^Q1dr%MCkS*t%&1dSjMQ%yWCLebeH-JH#xn$J;? z{-*(P%mxr8k1VQ0eL5;c6ahd_=oz3Nf*F9}f-BRa%%~28U^jU&rF>Un)oTSz7+w%S z`{EJ8_HQ3ck?3OR_9kUslj(Zui`ug{qW9)DDoueBnL9O0!5Tr&5{A9vJjWHNd%@GY z^0x7Dhdt@?Tj=^Wf)p+oU$kN|lbucZXwayVp;i)1U-+hE1q-6F(L|+!snq;Q#qmbE zUN7wmAW7veBPFDE94kV%nR3qY!TX8=N;Q$m6c{&GNvyDS$$3o5zLGS&Vc}I5;+Lf) z`|z-w%!QcRV+f!NB16&%Pj^R8-!@lguA0*BL6YQYyqQbxPuH8%`7?bpSv2!DkwR^@ z#6+=u<^?)(cDCaAJX*%9G`kk%7e~>5{y34v-u(i}OH2++bL*IXuUjY3FaU33$a>oD zpYDCSr7~Y$+<2*+;?;7#|LKpC44im!M55Oct5Jvd?*mB~1vDgh(@yJnNJm66*Toqy z=q0_hMI#;`pIqeBpWR&wm&hYU0K$j%RJ3*@a8JI?^6VJ(VQb^WMHiY7uG*ok)S^RF!mRYZyfH1j2r(U@Iw=kYxxO{; zMH;-6Td8pskvc?hc0u3XXcMIjG?*hz$BpibMwwoIAEA<-dZ13Kqv4+Rj5dPup$ja% zyxfWnU`Zy(%Y3&dQ{Dhj-h-e~6=^tAhE5bqJ1pm=7ugz}Jw`psGcs55U}TAh`qJiH7aKpp_`7gGS4`gy;fz&#PMf)MBAVQwNhR zs9Iyhzx&3 zF9f*nj9%ZJ1T^n40aGzx&(v%5i%*ZMs!0m=>CWuc+1FN|P0F zU+Eq0jOjie9@DI7b@@$S^SXO`muAPef8k&J%rhT;=GK8LdR|RH+gkNb5OBqrqoW85 zc9k*G8ujRSaB5W zCkU-h;jM!4(Qip(DLj4pV04-vu^S(Dth?5fGFbUNuH=_-kd6nS3IfI~_PM+F*Kdha z1oA#F0PD78+ew0efvpz;qyjbIC6 zAVs*jxW&0A@9oeYKAO>OZ8iHV3Rhbmm1dk%1u(1ZC?|FQXUT<%=7;g9-?`96-0Y=H zbkIydN8-kT*+0BgKPn}id%_W8e%x&(b~>xjfFFyx4b+gEw_R3yA^zR3|Jv`ohqvh2 zkNwU&zUTWV+uvZ?H&Nd|VfYQ2;Km3ZuWi>m5t}Pf<`nRkE(KolzJT)5%E(}^ZRZm6~{a@iH$<G@&h$0w;N~$Gf5~eRI=FlsMohK(`jkRviPA>5R;zo8e+d z2U!~{-|JYuS!c#&-l#( zSQ~F1_e_$F;!~DbpfOQ--5CI*P$wrZr%VLIJ`Z0Lbj(NP5KZf{r7ydoWb* zxx(OtF}hXV-KgyLi1a4Mqj-C_7e~EIFD9KkzvoNQBO{PZ<33mZ=zYcM;rt}+K7B|- zei!kPZz8D87XkyTYsq%qVsr2C+Wua8{obno-~Z_2{f(W;;Ecqz&aTm)(8M(g0EH4< z7fAwy*;v02J9u9RNIchTI~uzFsQhdv*6{d^G^<-lHGo!?)iM-d&D+NU&_En_J7~!UoFeILgs5LNYRlTm zlMRFYJU+#ia`|8&LolaS#3a^cr9PVpO)Pv7;HO+hVG(seq4huOkAyCu0sE<#;lrlX zpK1aCCnmU^$N2a3zx|O=2duMY0QW?*Xdy;RbkvOX)vdniIuK$s0a?tK^EUWC_l4-Q zbMP|UU$YE}0mux5y&@JsJpjm*lJkKPqQtPN=pc#Z`#{`Vvp!t_M{~zMx(#rTJDv#i zKH;fvtY)_Ee_c>mRqL`t8jGE%N}+RYjbxMv`lErEe<8jjN62&er&vXH(&z;47{~-` zMK2|1!g@_ZMe0T3e?2yt(vVt*MYzJLC|LPob5%+E=%xH{2ODJKA?WxYey-s~A5Y4KvoJZ-@#|)z*cxgSg)trN^^wyNI*c8|IhT4z+~;edDn$(cBC`bDycBn;smC@!2pbkxlR8Q4Yw z-iuWx+6Kp!=LShH$oGG2(4~n2vTYQ!Te@Hd=H)`WU_R`dC^&3VJr80f0p$8$k)91+ zf5Mx!tVv!`fEdm6U79;5x}7%hW9{9?!F<{3f0fz}^7CG+Z#@Ynz+O%+kqejRiUm^P z2czsQqk^D`YT_F{R~w%0*1G;gE}v5jEXQ7J0b8jR~e zOrw+IMA2ZrfvDGnmOJM)4UfLlmv##%WdkX9DcrW-*)$*dBw?S9CY&0Fv=?_OoS{$Z zVyny1sQXpuPUr{QhV=rN`RqbQpNSXzsvEz(tyB}sJYxv8X?ZL7inRu;hFarL34po|2qkP41IVGl)DoxnlG zy=NqqY?GOqt6%>gJ$bKhlDT;Qxlev{-=qvrh;_c&1P~w`4>1@0gJLbU?+KXh6d$qO zrc3fbssgyqJqJ}+tEn`qB4lZz0jxw$L}4W3ZKF|@D-uf5ttibwJ{=VX-sHxJ)&p{O ze`mW^pnzl`qq%0E$9woiXbQEhm>d}85VX1~)`Fl`rU)jmuoZVA9y7RnwD!&OMwwMf zfX8q3pH>OEI4WxG>O_Gogb8ALr4<0|f-8-*nZ9zP(21p<0g-MTiy1(rNxe~JP;X8@ zR{`f%vvpsR^b~>A43UKVm7Tf)-xH zC4X6WH|d*g9Le$Qmcj9KttNt*mRo+)BPNBU0%I= z%UAu^_xcW**Z9gG9UJsG1oAT0ex_AZ_!TPVPT44rz&yMpqGM6mPOTSqz`rjoJH z!4Vx2K!JB^EaO&%XETVky^@?!SYrZ=+#k&`ffcDJz1MyRqVx`AXC7qz^_}JxwPxY| znI1J1X-(W}IQ0_Fg^t9$KkzAIuB)uH5AVp!H&|77hyx%Ast-S^Z3D8I2cEb37PG)+ z%Io2DXy~Q< zAOsGdl+ssis9)~_XuVK`123vYL||N!b2(CYLSZ&{=@z&j@7%5A4UEm^0tYgBH1~^K z-6K*`e!Xyp?h!h|=v|-@(dulUxA80X(oftn5?@-DrxbGB*LBuO7 zZKzVY0r3_7O z8cFp!wzQ<}$pH<~AJGG?0;I4=E3uqJmlS)}BRFjkGmVCO6I2P6{_WdDMqk0ZpW5IE zY4vPCXgvs~#0%{aWdRIn4nKf60P+v?0Lj;7wY;-Z$JWE3DHN;Oyw_$i!Js(Oo{#?w zelnbDHPEoba>v$*ktDo{wr<6?+sHiwYXcQ1$^z=j)ne0}@)!pld7Rkr1_F5<3KL)p zgUt)_r@K$bte22!#~g=ttcpWu8X&(T+zxjVt*#*)C#VLXh=M*NPARN_70-$XeG!k_ z7?|^?dFit*ZdplMnxz7GK#l_<@nkM4q=Z#pn1#28=H^>Gp!E%r>aI~RC=(0Zr#n0` z{l&eG9)Hjyih1X_1R2L9$|iX8O2&}u%5izjjIun7r97aNpM?LIytCw+if!yZb!6mH z`&MC^iiqslQ)_^Bs;)c09OFBU&{IEgWhszcL>&Au`#s!CsstB%UZ_N zR@w6819f^-8PhSh6bDJi8KLE~ zpAyH0%8ry9mFWB+XSI!>&Kj1Tzm1ycws5lq~dO-DcaP0MhFhI*yWwg+DS*f*C=uwdC zeopl>sF)}^QD~cD)B03Bl=w%2j7E*81teNkAjL~n0vfMo)bPtwh0%KzSdQW;(?rs3 z1o4>LFEvjBu^TaZa=8ZbdZg#Fyg0ribEmh;3k%<&mC7hUKw3q*nVSiVl`z7V3M6&g z3D%MgBbuo%xg_mkD3`haEqP8zt2}3HSw`KDA+z3r`!tzUB!CaOZ*Fc766PiRc>J-! z^ZN^ev7-KKD-px!x?m5ax@3m|>?cvz9c~%9$m@!R8wYa7tw$p2Zz7eXVr>-BsKPrG zeLGbTh876u*&dKakTC7+gRttpn9k^kB_voa9SKV3F=S>OA=W46$u4_!PaY1W4PCN% zp?@3rjYS~4&5CC2gh^;aPZ^#2%TWUBke4CJ4_dJzAjh646hRsC2m}2#a+Yjt_Ph6 zy#&Lt#Z_t0Sfr#-g+?IJ>`lIaA3^o(zC%@bBWFy;vAcov0Qakn;y#TcUmGJ#h*kwe zJFEUwvCx?DgKIu;s!e~-G&TVY)N3#|n(up&pGq+`E2V9D1(an#C-&$dqp{ta46i%z zp23^we;9sSwWj>7`t3nz!v7|ZNwWH1zLrUY_Z^7zuBX9V*F*yWGKzyaPwK%QL=NuZ z0YH5Bh?D+8op2 z0e0Jz#qlF;#DN*GU<9hjo~Q$LmabEw=p}ss{BQs3|M28jeb;BMKFQ`e9nagjVv9Ix zSRjm%Pe21|MxQ+$bC)^L=#E$m3|T+gKA!ar&ydlOmyn`XaK+kAT7ED4N3&}siQ7}qRbey46(x)NN zea$DHeB;~i^(~^u|Nf4@d$@d(sJylMT9eX=5}iEt7rsouL}Gc5N9*2>`&=&ZAF_78 zyC6UiAqR4gA=eWiWW?&xh&uvT9H=@PBLIi4Q^!ZXl5HjfLO|efA0hQ9g-D~+9HZC` zBi113!FnlEa2JT{AimAwZjUV%Dcg%OEwi=^RmA+c3SP2s-@d!pJ4*Zf@eYsW~wB^}Al~%!T z@_&0IPiS$O=@(uDE)L2Q^}w{PFECG1#^;C%`J97tGgU6-H43Xt?J*f$S>^ zNQ{JHk(3e#2`0OPi3-ddfJ5G*B;jtg+bSa#DgYwLm~~?WYE!me^KoE20IAVTh4TP0 zd#O7Q&C9b$O#hI~0ELuM5S2{I`bP);alw*^$ug8EsC+Ew*cb!n?*D^6wG zYPACiXvtR~GAUF-sx6=?;6MpTg2_B)GG!(?yd2&f@gm|5|J3K4wbuSmq!t1uL~_6U zUdD@eG&3n1@CQL5Bk{ z)G{`uLR+z5EIM&IcHnwW6!Sw$q6QQo(64*>+n^B*hsbd1H|mV`NxokuNQqMf-c3Z< zs-!GPd%V^Tbcytv9SOC5Y7!y(h2GH`w3~RHTs3u_{8%oG-X@H@y-XpOoJd8I=J(0W zaHfuNYIJFRkDi%=(+)%j6%9AUuc{n2Ip~r$*P1yx&rL=oPWUg*I~;0EsK}!A=U3jw zdLZz?gC!L21xZ8!b&btl)Ot&ak{fVr_%9UM{ImUWQkKJsG8qf6R5@Z6*uht*qyYs6 ze8wX(`~dOS4SRs_fXrlRi3T8u6QC#eaU8K$7t1+<#Xfj-YN3}U!AI1j06HR@Xg+$_ zhu`tG{f;4@>+$nH_Y;r2^kd|PGrQ@e`e(9kSa^{dk(Xre_{h7y!o7`^vl_7lrxee{ zdGhg?+*w@w*^Gxe4$(HY6T6nj1JZd28#EmaZ$qD^W((JZLy)GxM%0Kg{>A+P-~)|6 z8+;%Dv-8e-qL^#XAK?Pd_$#bThMp&0c^NUK=G-H$IDfxyj+^i9yy2Cv+ugZbm5|e% zyki|>m8+9%7fcq%8fHXdhtvvgOLraTkOYoWbVU5=7^)~u^+OS_j#iy@!=8XnxDt&J6@c0Rh=r+s=VydgI zhe9l_)k9M0j2 zVl^1a10;v>B^>_v6X6vg9hw0UnVL+P(c5Zh6a5y45tTY9t6&**9aFh1M%y6nw%{$q zd*N*8b;!HO2CFKndEi{ZbA0K5wQD-ym<#hc9Zs5MjPK@&fyRb;WCvnTMT$;%nhbEj zDCi?sx{)Z#D9#Z0$kIFd3iT0b4PFx?RuwCg0mlS95_8Ocdhla6edN@gx2-+!LHiv{ z{{BZ%6uoE4L3+`9G|0jrUL1okb)$iXbI$`3Ql;0QyKV`^B znCz&}#I$yU$?M87z#b_f= zbPs!dz6o_)GCNTI^DAR(dytPt{xXZzeIt|* zbUmQ$v>DRqBa}pAtm2Eu!A>TgMjk*#42&3KoU79W-;ev>hw1qar%!!c*q!nDK11Bx zj(v;xMp%^o^?iKto5yFAXCtq?ZwD01-;TVXo*ih8@Vdfh^I!O=$3t-uBXSBShQ4>a>C;$#87JiY!$IgNC}2;>k+n`z zkr8hJ#TG#a`wetV61O$4-?U640vus;0FkrXNBDay-X<6aqPy$w`^mGMT!Y&TSdSp2 zVgLn;(8VPOZada3P{ExUD^a{7C}hj}lI&Ao^EF?yzxU;qPk#K}*WK2&2cr&JM>RAk zF*J#a2@>AE-%~&N-)nn^YxU3uK~W@9v&d}=l(spWw^*wyQ!=LJ5q#U+3L9h&esGNJ z>nnryGO7p8{l>)qyhCxeU*IQ5bS|OlIk9q4njmd*j$u8tC3+3*N9$Rq24v<2EiYiL zz`hVk8V#A6Y$ZBO`0?O5lM4YeL_O0Cze$~!VgWS?(9#Kb?-I8Fs}F3dKwVY7>{#qi z6Jc|Sm3%3$F&;nu8RsiHo9KL&@Q17wJW7-sMnZ?O1Q9ZJf0_8#jFOX}REIi(PMM_Jzz2@Aa>^*!#TXcD1e3@1V@p5 zl%kO04A|afQ^-`DGA)8aBfhN!%^_h1=4dN`3#9|{0xUJS#)l!VniT`IN^&)$7E69q z?6C!0jp9-Ud%asZgX%`hdxwZ@^n6rK^daddzhvQ26eg@nU8AmGdcNUpADj_e#WFdL76mQK*MZPYKRxp~2Q3hIX~OLh}E2YCV4zl}^v=Lp_HcLDHy z;L$GG=kq(|mOH~f^4U_b39Gs5!65e!e*lDOn^Evl*qt%y4&y$Pa2^B9@pr^({3WrCM9dzBZgGH}U( zVF~nHn2+^`Q^PN(4ne24s5JqQNfbI)p)faTp(-&1wuXaC<^XJAOor(#zKsb#m~KR^ zma@vjLF(G+cg|SBO(K{xQqz@w?lJn86%WtRh=2)tt*D@v(xf%%R~+N`daPOe*@9EV z;Nc8r0P&nhX%Y?s41nM+M+>mWXIzd5APMgZ$3dYImL>>mTVq#+_E8{s9IF z5jR1kfm~p~DkDee?76{6HfY1${lv#TWPk6-wXc26Ew^132`!G-3aAT)+w)ZCCsxwH z^l>!$g4O?ruE}IXawm=ul;HkC-F_GIC!p=8H^V``tQndS+*2}$|NfDU&|L?tkIW1u zh(8|w zO8==fsrf-bhHOX;N3W6gssL6fZ2nw|=!&H$%G9Q=D5 zLpS1;Q+CO)a-m;ltk-l292DOokF6Ut&~V96Q)9{( zE!+S&PGaJpgt20XM+s2xz{C(k~8(IXOW>QyML})hUZRr?w$h z)qG9@kBQB4QZXm%%dZR+83@5h9CB&Zp}O>Y9%M4OOOo5}nENAVpT?25>4bp{r<55H zLv7qvWG=INoGxWf!2?)k;&S=*?ceu7mxK#)Xg!qP{v=qN_)mX&;~~vEfB*4MeA4~1 z0`QN2_RqfdPyh6Hj-7Zw?9Db>>n0mj5r77gzA|R_$lqmn0iw%Nsg;T)fnC>WDAcKp zg9I3khYpOuVvz9dB;&p%QRt@O9FTJ?FAN}Z7yynz%^w5MpTXjR-Z->kaJh1^5|@!w zI*lS9r_Kb12}l8PR`!DR8=n8O-*eu1=Y0{E@xDs`|KR1ncjLz%z#OR7#4I`4`Cx>S zNxsDfyT}fKX?q*8dvvp^lJFNEYpaykb?V-Q=Xa#%1J%JeE}|cbJlqRR$Xia02=0Tm z&whM1K>W~gM!|o1@%i+s-OGRFeq@If*Koa253m6K9;NsWj# zmMiUZnng9_8OcZ23Tw#|lRIMs86e*(oK`v*Oryc+$>#fLheWGQ^X0`*r4%UvyTZr_vzUfJ3-Sj3=$I#a#sX7ral?n$B!;#1Txu z04g}0{@pWGuT($pLaGv|-;oD0pOaIFlVI5lW6YDN`-X_Wj24nmz9Z%!t{doRFb*rt zpt$4~nofC44oZqq+cG+txJA>=+J18Bb)P(Q&mFhk$6@31kmq*8$cX=IIGN^TC_sb&tVcK+mN^HB{TZ`83#sKoW!!SJ9Okna6ZYHU~=5J`S&d1c^~E|5EF#1b8u)h2byf zIN7rhh%}3Z9ZF~WekamrFDM4C+Q4J|=Q(*MWCIl9E(j&zI$v}&e1UmDoZl-`W{u8~ zgw_h=Ij|N%-HxIIPMpyqA{Mi_K8teC6e?(7NF34d@UM@sgF`MaXz5|jP6OWVG>wa| zSEIi2G||;}+6WW<_^R-n)D{Mz6+cxe$2T2MB;{j4I3+OrGHE@VZJ5*4ZjmrmUE))d zCH28dGF@ha0;Nofo4u+=8BND>NiuMhTyjz90bnQtXfJ|wE)G7HV3rRz&q;2{>7=b9 zglE$OgyVgzm+%X`1Ta_PBS_ovyy1LM8wmiQgo-HQMDs!+zZILz6cd)mWLJ}DyfY)` z2OfldG%wqoi)>mD`N0J8Xc~SH*iK(isdNc8F=m&fY)Tg-QL4vLyQ+vJXum&KV+V3F z;t7G?$+EE-*SjzJo)`X?U%TpeUcBFt<$wCP^2#fp@|4Sd|MyRI9lT#ggG*gd0QNU1 zR!fU+U|Yker-|90iz63Z!J`7FJD^zj(3VKO3nsHDq;}$j5el!3weVjq?iN4{@Ohl0 zd^CEG#Kbek3uyXdJ-{L~{FJ;BTTQNV*0duEVdJd+W!6@h*^H_yE?(R3Tj2<0z|*FZ z-)~hBvxR;iP>!(%_|NTx>i{KAhXXZcY|wTDOawd~2LM_Ea8~JhrgzZNz~omQr9QG) zNEI=V)tb)rt9>?OZVtjUn3qV`M#{TKkvr})dI)M&bN+VF4Xs-q5>Co}_;DZ;$Q@C} zA^EGLe&5POGB7=VyIkI9kYxmy)H%Z1pq6DZPYse4{_amCu-_;sFBGqBObidp5!myh6YZrlFB(Ax!9aIKLHBCRN7?mN!5axS3LYt!I6hI=RWs!0Fptt zJmdLUPW5RlwLbAOMTxhz%ATrUY6 z9UET)Ly?x6G&Dd`to|&TltL{TDI~~(PNLJ}iq{YY(BTc1L@QJ3jH2wAEyLajQ%Kzn zXCH9gTmN#uL(AuSyy!*0{;-FACa7@?v*k;*0b;{^XD9GOw&J`MoLj&SWDO@RalbrH zoMF~hw*$Wr_zxH?TakHXYb`5vAWPo$37eN*RT3E`0Vr3#RoQ5nHf3wE% zP>1M0Vqe{GDONE*XcVV_1jY!M?cVa#Z+zT---qzAhL&|7|B5~n4C%}*9j6!g4&xE^ zTA;gUC?Qh#dE6a4GiFhgV?%1+Qn{Vf+c{6rn{Nx3(Udqbs{vcFzNh&jgx-n>AOo%S zSNoQmshcvcco#+^Dni3e1noc@TZ11QxO_+s5ZTe*$6Fv!AdK|J08>D$zf?5Sy?%hQ zaS=>m!lXk%MWy&cwRZ@&5MZ7q1G8;1Tva6SPMh4OIvL$H%dkG$=NZsHQ6x88d4u{| z<7HNQ?_JUSM@jd&N-&>N(`e;h0a2UvHKEGAeLVgqQ-VdTn^5EsZelE zy3hqz7@F^hjF=&86jcGXUef;^@%Tk$*a4zb@$iD>gwu`|EKTWxZs$pR+1bimb(5P z&3EEftU22S7`=yZIU5h7iYT-H+4XpApWck@-ey40efT?ZhAb}}28Ez4I#LvumNz`(Uwqqs z-v_sO=9CzEG2vJX*c9`9|4}#A2>4(G2dO#?Q!$M{8bu%_g7wZ3rayj)(ZB6j1_7c8 zc6+Pb4q#hgk3aMZ=0nJ(_!bp`DcqDIqIR7Q6`)T?&S!On!vg?7BQ;RQ@zDSh;8x;} zKuL_)QKSBcya)P@a_(i$zL9a(tpiLNSi;~y)s9=-SsI-wb?y@t2D4$W6NJY+Bk`yt z>t^Riuh%h~ux&+eoDeJesn+5tdILq2jc${M+bEIp$4g8S)oJ_arFsr!asarbL_nw- z>#VCJTAfqr1uC1SR}Ar%fWQik!I_N7CZu?{yI_^!x3KoTwQ7ANoh>M}2BJOEz$URR zwVK05$z4ny(X2;@Fcb3uOal_e6MrAzIi;Y$zyO)>lRGuX!q3iKr9uZ~W);U%S0@}2 zo-Yz>Q;k8nsOY&K72>ee#*=~kgI7RyhO-LY<50L%Ty~H;aItxH&q?;smdmrd8}r-$ z;_JTt>+f$(V0%3FF<{W45lD&l7AYXcYv@*fC=q3mFKK{|;5>@`&uW95O&q z14(RL67GO=gNt3Ixrj7H@sPte{=^S|{}+Ar?voDi?>zsizkYYO%r6=^fNQb61k$Si zdgB23%0Nxmq9|c5(tR#JK6t%RMJHpnv?{|4h_xJu!X6N|LhqNpsyS0Dgk$R&K*7lx z^&tKqIuKrV+3=r;?-jHR8OIEaa~M*UFXaeiDSuh;a{@Dfq$9=*o#15zca({ls&?d# zR3$=vx#TiK=flhrns)D%o-4Aqe`gA;OF9IG?X)^Aj80lBtS^%1cjA361?guR(z0O! zywPr+2*Bk@E7??iR@7v0Lh##!^6!#^p;qN$jb$eaYCb5QT3ttaj}_N9v7_r>FtFMHnQN8cMj zt&5Jji!KP1*6EbIsqvVY%<6;);UF0sb3Hujy}%$cZr76+u#kK=f<>LkhxsHuXgS15 zrE@!>jfv-@w_mrsO=v=NJ)b|1%^o0!h>3kC%ekH)p?{qK#5G)^kemc$H^ZkVWO#D?3A6s}k}L=pRrI_t62Yh-#1hJB$i9;VV* z<1u5gixO2h7;rVnc<}|3RYCL zy3+v$j3q*fwn3}{-7+Vhp&7>lQ2;`K*MYSkZY2^;ur!be;r9fyIO=*7q~ zAsT8N*iL;8A)F46Dv`Z5zG}f!Aur_g3$k`Q@Z3Rg zG;KKe!#FW^O;-n+w6g_CU6AvP{;L$2HLcBF+-)Qd7B6zBQ0)@6%;5g4Hv;X!NhAQ# z-zaYAEWu91iQ#LuA<#)j)C?hB_GIWT&@VpLn9C&{=M9%{;@G|4Iq*vLKYq$5n6ua{ zDY)|RyNvZxI2Y}}4sog{h190qNz0yO3Lgbq$)N;|)fE$#tkLse>BnW~yq2s&ci#wn8*kix= z^FN*&qV;7z0Dk*dUwG&2iSc?m@?>xYh<>=C7&XOzrtq=c+?g@?@D5)_9ozFG#+mpM2vl*Qj9Im*DOucm^qd$*L?W-B! zw0W#8MkUiV+~w6NPx>sQgDkdW$koO?(u{-}aIKC_ICHc3ZFK6vB24JE{f3H;Lz0tAn9ba&HF0K#k7ojh1Bs;*S&Qw~-E(N&&sx zixC;g#}upk1nS9?)52THouDPn|mT_IF(Omw)-L8*cpU>C^L5o8`&P z^XmFicjUngD46Rxy&0~64?~DV4p~a1gpH%}Ad-EM{OW}G3sTu~##>-bMVAfMB31`D z0lv*bGa?;vLev2;fnerXFi{;<97rYuIHFQ;I_&#=aqOv&yz!5&eq~YY>m31Ww(Xe$ z@63kwRS2~jE&*JIr3>jQ=s9ES`R#mUBYbhsHVa(;b@(;q#SJOnb2}8=#vF`)&c=F3 zecDLqsMOkJwbV(=z2)ab!Uq{}n6E9H!7Zv6GXgYdlE0r4ZM_;F|z%0Rnb|S!JTBBtm z_6Z$`)nr(?R5?=&!(ZW?bnMT70S$HyE9hcCcr!KS$?5EQ5}>QY?wn3q!03x5ofPNG zp{*ZwsW2b2pEmps7QQ~F`&D>$EAHV1+q|eHAsN)9wgGt{EM_80G*Le2z$C2cfbT^S z5>&*PZwxw-8N1EBq)%JHg^LCI0W^|a#NCpSv*dy`AK_yl2{(yF z+m@r18b`S4)`z|H`7ij7&;7~$3^$+muVs+hq z%w2RLi#g}Gc<^dCEx>4m6N7;OHp+yT0?G%BF2X7K?6#*q>XX;L@m2dA{qX<=nL=;T zordHVSuY^KrJnEDhLFSZKLS>d>18=LKqa>QQTRfY9hp`*HV($O=*6n+c$+wik+H|% z3*wD~1Ow5G!Ho+^SV3HLE^GiOf|G9t4aN(%J!f~JEQt{M9Ad{mUxS}Oz=G6kbovCg z)3w}^s6TMDXL1=bC%Ae}n2{Qn1wRjcziZC-@L>+S=Ahom5XORPC4a`0&}m8!=GAB; zStbZ!BWBBlPMSpsXx*PBs2XYs0l7p#Zk+T6mV)@liBM>t449d|DELCty<8yk0bUN1 zz~e+Pr%$q4r<&a+vr#Yt$;}e(qj58wqa0gSb5_7f-W}Z}RQg#yH1r$I=wlsQ2Is$j z>MVhUxwzZFF)z7*g)r_qHZ}&2&EgeMOfC~z|AJ@Fv7N;+pAkijgU`&a+t}bt3UU_a znDN!_I>ForhYhHWxNf;RZ)dhBVU)|!9u(|y!dV0$52y*O-?%&T)pygK|K``f>$`vG zo}=gQzwP)J`taw$GoJo5{~!Lkxw+}jga7zbFS@n*fhaRMBX)sNyJE~aK}>a^831>- zR>YoAKQ-k3&Sqpcwy^_LMMfFU*UK)Jx@XRnnGa0|JHf zom-#!m``8(hWkhK$5b=YEKJ2?P6fJ!ri#|ARha1~1Ym?T}?u`KP^7 z&H^1#yVB4#q9o)R!}}JYDT1RKJ?HRKaW609cpbQcfbVmOe1y_u6#f;j7Ea}sBQldQ z`v;?nK>(?qbA#76DZ(mf(8I_a8#a?Ml6}QfLfKu5C~PeaF(4)_Uqop%VvYG@u!eOAoB}w$?h>58)-zih1RD!rvZ(~1`9)Hm zxC9+45)p{h3DOP;ry9hD#fn4)JH8ZRF=uPDQ1ltZUyFHJ=H$--;USV!44STu9{YSq6Okj$@Dbm7n;z{SGWe0EoE{r)jA$S@*EOAel)J@BGZ+q%v zKXdIH_8a+$kDEU6@%e09ys4Ib-MQ4?Folb)XNGr}ct@`ra$e(TsSPm<ng^h)Z3yzfV`F_?T=3|py@D1SCvSqZv;8tIlMX;nS!oy61LFET_G)_dF0rD>`E6)Tuxd`t})c~jybP09J zuAaG;aFU$VBb*}sM1?|;bSEkTKDk(BHl|@|d*z7NJ4b8ZO7l=oQyab5{h9DM^M;&E z+~OoVKXd|$o+|KxK|2Uf4#8A)TxY!+^?QRjj|yREk>Ue{!wDtG%0M@^3332}t5b43 z&?QEOSV^i3-3ugxA!;-{(u{5af~gHCn2UX-U56bNUaF)N9i3`&(pPZ&Z0~XtI+5`F z6P7zJk4}@}wI?5ZU;CcFdB+pJ;T!fl`21rZFMY)yZuj3x9l$(EFR-P~Hk{;Pu!2@$3G-Pkr?EJCCiO-g;{Eei6=|i&g+o2!?BL)}t40T*F8>aCyO` znlFh@`X9l0iMj`7O-QaQ;h#7!k@mIP*QHoGxR@w#i-_%PtPvWz;sNgF+Xr4aUJ!d^ zHM$ElEoEbH-?5?4S+r9D@Gmk0V0WNR1BI@1R3MpP-PSQ7>*GbhvI*}C)_{5dP9Y2J z!yxxm2HlrnOE(H%3>Lmk47t0a&$LN*cdVp-u78~?8pDjMNhBK@p+lo&6rj^Ir9t-# zv+ON(3K{LER2Dx=)E%5Ys7rvP?(h6ltpZ}4)Fzz{u6R6Tx`>e93T}KN)I*%B*Dx(b z^|~P8l4TT41Ddg$@n&=C2l27wc(-34sMiqI4X(}Xl#YyiU`_^fU%5AnFV5gpMn(jZw{frUUT7IU>SHUdChc)*JP#{D;}u<+vPH zCt#&cs?^Ajm~q4;_wM7-z{JO|9S*Xip=~|(=>hJRc)*<9x$>%Cxatqy`lS5++714E z9&Oux@|G=kZaECxLk9-73RRSmSdod4DMtZW#tuhXx)==&Dq|4j1sB-z%%#n%zUJ{y z5UcQ|KaC+{|7#~e&+b4Zu1Z&Qo3!XN}XTu z70psmR-Qc<0_#Kq$Ox%$>A;wqUy8FR!_~|}{KWe zj4qnja-1q7vHSAN+^0TE4*;CCU{&FOfeS3!co-+fv^L^_@*6C5jpRDw;*7lAP_lyM!<7=cQ zAF?wHj+M$098(gAlc3oE?)LH1Om@gMYG^37sL6o?tlZ1)_~cop9-%7i2|z;~$cJX1 zbvnoB4@K)Ro*Hv2>;yCkMie1VR!f3-ldSW*)k<1?U3 z<5CzdQTLzu#N{t}-c>*HGtb?}F!YanyzOmoJGOf{uLDZ>Nu+XtLLOvxig3Y$$o7)+ z1Q^D_DT@xC|6+TGIRP#{4o)-j%-8GDWB;PBYf%RzKJtgiBhncN&q|<=f z0jQTQ0{M_&w!)w>{A{fuhIQ%R0gLF=VMYpr0F=qAU?e#_(ATi9Pz{8e(-G*v*>LJ? z9IM$Oe1X=;`ii^wsJrk;`1-&q`(vZ3DK7cbYunh$RT6VT(Q_-bgz(x6d-KiK1ID}y$JsYx4` zWPOGB0ZtbVgo@Pb1Y4o6gS}k0k}z`ew~@dU2M7@2#QH}f2(YNou|!HSR-K8RbPD3V zjs$~rdilSnpg&r$`Cjr)>u&k9;<*#QpU@w!+mxa7(B&n(8QxdHWUne*YggNj4#&y4fanO(0ganf--2Fzvw^?^^%L9XAP zg@d})ncQg6;Kqkl80%T*1`M~Z+3j&|Aobe>lwbPiA9fG8*c~~hq}NKWm}7;B6X&})htG7m^c5S~B*)F{vmC%^IE{U2Y!*Xmx6>B{N@FRR$P97XNr z0F6!qjtUwcg!TQE@w*KAT4--jgfXHqS3JO7dI2j-Y!i#unJz3)6wG*{S%L@30(6oA zs$@|G0MinyswxoHgXC)GKK^MMeecc&t1?V2xVW{U^^4z#6m7V4Y|<_!eAGsQlFHo8 z@(&vmK#d8P=IUIU>SuT;yZ}1_eZa;h4aNWpR78dzkcm7(FIl!Xi#O%`T#W&js4W<$ zb4A(tLNVDyK+Q{|*I)7amnV8~E>-~e@eEQBhUa8S*Vlj~BM7A(f~m?7T!?X^OJ~JP zoAd*cPI6h%a078405_m^q`)|$5j4#x#-{VFFVx6$2i_@loO<;ugAN{!qy?TI((r=j z1eBk#?97G&QnbMG@ZvsGMrw2Xq`T)7b z#G63Ro=J6L_`hd&sCzHUR|Kqyru6ywxADd6F2*2{l(=7F-X7-tLlLNOkZSB4v zYO*{hYm+-!V*&n|C+_w!av-yZtYviP-FIDaN&E1J?Yn2o-}Cq)rhganvw!o>+q!O* z3y(u8J)^L5oCZK8G>*yE!F7tkfx&#ik#M7bnbLQUkZ50U=SL)4k&7%4l!BONiZ(Es9Ztu4UT>8^@4<<&wQ__|PF%w9DXQs)3i2}Ms z>^A8Hm=c^-38u`yr3~Iij?qc3i>Mr3BydfmXx>HQ(L^7}%pJ{7pwxdxW2$w?*aSf8 zeKQK@O`)MycIU<5tjZz1B?^>t?9iw$nAfl=&0d~xbxq=Cun6A?$1E_GamD?dIdbrk z^8yFJuqfzdp!z|c0eZ7orv4qzY`Hs+hsBNB0+Zk7FNl{dq%Mb{Un4Vs*y9{k;L$!B zYn}_~KPpfci^|P&nv8=csKo3{RJKiah5eJYIw(yc(Gn;xB5Cru4~$BD(zH9La7w)l zzf_!{na_@V`qO{%tndBbiah_yIskt57p{8mCm!N9cf+j@ri^hL`_rzEnSLj#F?Q)P z#t{>ZK$8HcCeoMG^F2hR5vu{G>a%WUyGL&L=b_YN}3}Ka0v0Sm0vRwtU9I&23!88j$0vT;+{bQ^8a{@Zgs}Vbenp2+9 zaL~A;u0+6Tlt-Ka$Jl z9z4B8%}UWf!5?+-8p=%63mK{`V9lf3Ipz?xYrtvB7@Z_lB=4~^w39AM}d00IZMlK^_s0Mx z_))xXo(&`EAmO?G^x4s3`oKO>-))a7VG& zPCSq+gBye*gCOete#x|Avp> z@Qcs=l1pyJeJo*K~rvYq@XnJ7wXy?mjYBXk)@3* ziamgfiJcCpGn1eTh!5tDhfCc=O4~x-UM^W@O`Phok*n6UfTRn6!X>v5QLt~9C&saP zB>tlVlnKvqj*SEt@dhO6INJRS`W+M)u7aRDrB)b+27=w`Uq^DpM3sPK0yI2oizQyc zpdk!Q&`uPfR0_gS8S{cS(PfhfGW{PT<--E35C=5Z50;uHbBfF}^YFq1+G-5t<^*Y@ zTSfqN>L%NVYeg1v$#bkdVEUltP^6$Yl8zcq)Ms-}>P}Mq4tKh9RY&Lst@B#vymLtt zU;hC-3HeJg(1&n?w|A5;cVU4#$MnB}w4sE9Ak!A6QD!Xtu<}4+bB#{Y=p6YcC?2bdJR%>wFh&Hrg+FY7RP>TR^!ZNEcZ>Jc$9lY}lj_l- z13C+PvbJk&8~>d!z#NO*t!*k~;P(x$A3vv$bd~>eR@WE);eY?@?|IJmoOk5Ne#f!T z_woMszyFSV4oROm>V@?k+x1}|#{LHwU$X_zb$?!hIs%$tsM5sw!J{KJ3| zhM2N;{f$R{@71q+&i8%yeqVzx;IX^2^Rk!z{+s^v9XH*&vfEzi+ACaJyR4_ef%*5f zF<1a~na_#0km(&S)N~Y76sNFtj7B#YaR^s6USS*+P*0(dNl6BgNiIVf1(A_M?-GB; z1P_Rtn6sHj*+jeo*+Fr$V_Fz2ZBUX%8kL`ncs7h;POv*?{f(R0s-25ijE$ccbe>r( z2dg*~9CeJ#x#&-MG6i;aD>VF|ZBxW60A6AvVfNh_&mr~~b5Rd4Nl+(*8kZ<6^r{c; zHQqH!$U;tMKr6VuQ)9VFG&*f`*93?r==J)4xKKAfoz&I5?hxWLy>yrKpiMxu*n3Wl z6MM*3pinFe%8F?_@_Gx+U^Moc*GI{T&>2`UVk1C=57EDpfU}KpLBczi)mJau*i2j_ zl$MxP8I2^Hqa?y*94~~{hY!SE$4rna3vo#WE5VxNHY`UNSu7&IxQbR#K=wN+SQ!^$ zEJ)O7&L}yd*@?J6U+_Qw{na?B*hnNU7nFgrX&m#cAajVA-h`Nr<^;Srd=c1*4w%S%t(_Qr32+IM`VQ~Q|fu18lbDCqSHIN=$K~LvgS_dHN5FGMvGeme@cKzWyMvE z1a4zJDshcji}+VqUt{rMJ}`x}htarpjx9$231K(^85RFHctGZW9kE2)iJ4@EVeW*| z1j-Qj?V6;|?2=(%z9T57^9233X{ugioJvvNj8z(eE-vAE){5as#LZR4$ec|g+XE$0 z8ts|Yz(NW8y}AdriV>swR4NX7AwSmmMGfJSGowi)Nip0TH|k`fj(JY$3|!)gR6i}L zM{gjDHoOSLt(F>Ug@C=_5;e@uz~65q&(zNawiLtd=`!hl)UJ>moB!+XOvXSJMFBzN za?&wJ8kox^+&ShWz-RoGIJY}!c7o{@+FwFEffU(7ZzU}5%!Q^TH7&HDr?mRQv==ri zA+`ITsl}5L)=Mz3ZevaD-{tnZLZ4$4TLt;_)XC%f z9mKwX$Mqk$$&DVwAs~Qe!T(D(RR`9nl;?xR)($H+)RD$5M!vr~;$WSB!ih8CLWTTy zE}}s*@Wd!4Q~5Xg)LsAlhyKk^{`s4)-tWusc|Eqyp1u3d%UpRhqzjm&MG$P_b_m<8 zBp{YaOa-ytfOW8D{WEv9=D4Xblyi?8_w^4q7LMe!>pTcz1Y!FBFGUAN5Y*cO(+0MR`;0 zGzn<4Zp5)+x^1hm4~$ovBwVAaRDd=CpGtadZK4@u{xDNj97R%?m^Pec`k53aj1{Wi zwkQ?yWCnnAI2VSVN%J|qKmbN2@>b*wu(*Br0+emjrNU4c2qBmNsG>^A<~DPXUee7) z8^S&K`+aN)WQvdeF`b6>2kmHEe`_nOg<+B5Kd=!u=}>08w}SH~{=oNP1roB9DUDhv zc$%?LNR4&u6&t(Y^x4qBC^XsNM4ZS3Ox4o7?B#TJW;1;96Q|vk|1=7o50RHa8j(5O`(Xm#O| zq7s6>_xcL&8agEubSww4?m8}#-rv5}Pkws7-OSF?_bgVBP-&ahdEctXHgv(enU|EqyEZA+La{CFRnCQ*5#Bt??s z3pgxq@SFXonrSCuILkSPV0@URX2Bc=)6_Gw34luQscjSFl;P}=VGH&+zUd++F&D&5 zSvS>%^kRy(hD)iB7zYHK9o@b_9#MY+pQkqq7Bf-rlhAB33L`=J_MLJs=x-h4k-EM% zf$Nm4pA*KDC%BORbJO_yBPH^cqWMyX$wcG9h7KXVuO|wi_~;X%MtSlPtql;*r8Z*& zy^cJ^uxMict&xrgrL^OEa`_r6I8|*EApbM5uy8 zd%R~2ggmH;yd%U%uqTnxe1$w-^3tnM)Q^bU44QyFM^#aDFKfp4i3A=XC1Tknt`hz! z)4z7HIfVN%TMW<1>sRDWEMjQx~H?FP`bP?rUbHz=S0=|xzxybbvckYVV3PR9iI zmsLPttBU+R|M>ywfS8An0=&o{Gkz1D+lhAeE1H+=hFu1ZABZ}6CgWle#y}ncL(Fd+ z6N$13Bmh~x23nmI$;eR0in3sZD<5|#6l61F+&G14mrVJZG=tL@X8BSGR=L+GZYH@< zGw)hP;y=2<%OsC)mGR?sCA zOv8H|0m}yp&?3sOhY*$zPEV$=h_cHTN+)FB{u>Bb^8N)q6c3E^*zv$)2D;68g!_AP z%W{FgKqnDW(GWxIKze9X-AEHc)go^o1QDoQ@SK|sOaSY3x4Xp?G>j3AI0g*oap1)`Rx#uSNeq8s{bf0OE?$S6GZy~J zPzE_B6U&A`Ggb~zN1UCzAdcQfdRCje9pE(ZRC?df+PPH}KmL%1Jv^P*Rb__I5gnQO;{0O?ULiZ*fru*Q+|xr|q! zOIV0t4;$+=LXc z4#)I=J4wV5*k{PjO$~HcBL1x!1tVqgZSo1siN?+%;6jEv<@&@$!eH$=g`7?K%d?Fx zB4Zw-c{NgFU8s7HRCu(F|6D*x3itmR$^OD4dLd-BHVJy6kZzpbswehO8D`l&ts)IxP7J`zV^uQ(>)(c$Z|%k>xBUh~k$e^4u)4*P$!bY3j9$ zip}P$94??FSdh;lk|MI9BKK*Q5BjiJfC7qh+!P$Itq6g(D$BC?dB#yJ+8^pZ`eV-!(dulM@i!Gw@{Gbwn0ltDf6tyQ!B`n16Bq{YC&Z zcFQPQUUZ@-Vvjk;A$UwRqrMr5hSa-3dMNNsm;7}QAN~6Vnne8FW8D1AU0?nD|Mxfc zJ5c?@j~Bi8Rrk!UjI9^P-lL1P{MwXmAWhYwRq zry7D?vl(aEkj(ib0f|&AE=e!B9)#?XCN!}PA!jsJ`xCnoZ1U5iAiT0gJ4W z>utfRA~apfIND}@zs9#T-cFYIGq&mtbUFr1aABDg2ZhW7j5xH22Sz4XsZ<`{sE3Si zhOBm74)K*ZMk5)&;9-VjWcz^yze3dw+OxQ(kn(WW#zC^L!Xg~tV`~0%ErCu7KSlbZf1?Y}3kl%OcW4hoKV%VN zN5~yAd4BaY^zm6gsH^@7_nacnq0j&!y3NQXA?a)~;-&vQs&zsc+Y&*B({#X^M-1ht zqmzDltba2)6$3#+{t~p0fJJD=9Tc>ncIi078Ms4|K(O)%1u19=pl86E4nc4w9CFLq zS6y@UTfXDzAARIkKXSiA*5`V>>-tZ*@wY}eSinG z&?25NuRpiL6&O<8IN{;&Q}Gnv+UDUJ(v&5$mizbPV;}kO@4n=}f9OM>z2lCI@S0COhGlae|Om=|j!dm9`)^n@Yc5t@9_ighXd5A-Ck=KTskbbwUDd92|A ztlE*;g>=y0`kh@O6Tr2w5<+$8&-k$fPzw!&_oNRkge%yIg>s}zT9P;sos;{Jrp7`V zS10sMr*wH+FpLv^o(uK?(|@iw?1UgKlk9w=K;I`mFo@F2n3^voG>yl+OpM@LHF8s7 z=Xx(k$h_+9P)g^L-QGeYPd-XE2*%BJ1GT0qD9k-y5Yz873NRV5$KQ|D6-v5i$s88) z>r#*lA~o=F>(cZZ-v>Paks7(1zxt=nQU(VA4tViMjd$lHlYq~#vBu*a1G+ATc-Xc~ zCIeUm8%u;6{tEeE^8yqLgdfto>2t{hq^{vxm6ive;17U@EjRumZDq2CN=&-JID#=-ct>x3*SBG$jiWC9Eu4iDV}U-=OVbHIf1R@ZvpgI z&<)1u22f&n!2>gBqhg)uaUuTtCma})7FH*X>o50e3tI%wWi(@6l5Ns1c8dE8$-q_85G{F9 z_f}k&PNT5M;Bwh0&K4wo1yb;oJW&k$V9pED z991QMf?O>f^%!{A{p7Nl~G07ie!{rT!s zLNLToRswqFt&Lk;$7Oms$+|HB(#O|J&|j57iRXJJ3eKP#TY@m&t3wXf4Aarzw z>NLu>7s`^e#C35gpx;z!N2U;0>j=q`)WS2Hjr zpe4B)`b9n@Y>mt&k<9_#Mcv?&L`(o+2~Ngb!8jGFsAubQe^Bp{)MGpKojL(AKp$9R z0l2afbJcQCCYesC(#$uC^DjVGA)_Ljdo{fB)le-*=N6oyTL(fBqu} z-Nu3F*?lgYcF6jJY^20|P)*L}OjnD7q2K?v9=nTBAHf2{$OsZr^orJ|ym43qPE`UH z>izHW+N-bm^f;voB28sDv@TRC5{az*qNuYMx29H`U_ z%4F^hKVh^>O*Pqc)n>|=N9yrr$)DySW9{2z5@v0b%nW+%gh#@=h&N2~cu~7j`JLS2RhQE3#LfbwB z0)t*_FEeN~HbDlT#0?BNWlTBs5+BFSwxA42!c3(J=5>+!0hdG=U5T_16RfUEoe%|u zCHyme*hMKCRHer3J-|W$rKqp0;bVv62Yakj22{t^C5#8cZp_KmnNB$3Yvj4s6cc-9 zxMfN3%K!DqMrd7>vFU^c1KfrY>>5ounfWbhUie&&s#Ezl|J-x0+S=UQ?`U@K$FXC_ zZn-Pwu;cNd00UeO`Fm*5$6sxG#;zvGoiS1Mr{lrs4(9(nuu4^JTn9*6E*7k=(2H7~ zuoY~hWJp*2UqkgU`p5r9_wD1_Yv1%s|K%;8z2iz!0DSnn=gzPi7qR67NsPLt{yuQR zLdv`0k+Gwmt8E4uIH@HTcxoClnWa-d$Mt&Lg^@J56`o>_5gK=aE0-0K30Q3!#wJ{OY zh15XRFAm8s7ZHmvjW1ad+J^U>QYJB>r)3y1A}3>7w-+X{Y1u4c-aE~FbxF2uT>&T7 zzClJ#iMy2ojsBeK)#}8`H;6vusy?dZw85!9R@2!f)?zM^{Ye?nMpMmI)HqR^oGJiN z@@vl1<8EbQ#Pf=mZ0Z{I6N|&ztp);89wcY>ZA0GvUjx-FmRcwhA(sXtp;CPa%)j`T zU0>xid@qxuPNxefZulf%N?02JDF!CgS`8l}YrwrnNr-SyZbNJ~_`mvhL{j5_a3hM% z0*1C!6w7)vVp}51Sz;H_UIs&3I4^NfL37c+ve{ptDGk}@)roAl<*aRq8-8n0CICjE znpLT<9cq#o!(;6fSY*oO!#vps&V+A!r_Yg3^&W)h=c2c6!87#@$y&x(JgmAV(>Bx z@a7r=E>64Lv^g`jkw9C3k1i~XMkTQzWH4iKb$Tf3=OfDJzOq&}K3TPcN3zLW_EpYpO}X#8Oy|mn(SJ#R}le7Q0DK zeyW8Mljy=o0-2LR_CSWy%EOUn2O;$1oaWS>Bd}vq5cma0dJc3AvEX(i^%LQsF`4yF zb^`rSe_$!2YJp^VK0R^wiK82vk9yQ2?>{|&U-;$!cH8b_!dKP?MBJavnRB6a#OeQn zw3A6B_(BuHfBNI6Bb|3A3`Q&?MZ_eC0j%Lzg%O)!;+U}WPcEWa)v_+?&GXkcAM>ay z_w91*efTBwTfcqHo%dWcOfaFU4n2U9;3QbiC|*x4Mpd=^Ie-iHk2F_6{BjsWbR)ao7fO`r!cd`V4*(AC$=m{@s8cCt5fC@TvKm#wU zC87&fAx;a_>r{%)`89+ZGYOP-i7cou8L@b9Q2Ao<$iad9gLu{o5OdmwZNf!#@;F0- zB;|vq6H9%Y06T`g7YUwIih$Edd7(}2Gi=+7guG)c{7z7k2{0q`F69yL6rBBcwu(3^ zHWi3Jk<>E^+mRX(WBp7nc&FMcSTRXRtY#l(qM@bEmH30G1d*)+5yJcqAdyl+H%J_8 z>=tzv&H${!Oz^!`c8zAc@Z*JITq))5Fxa`E<_{E0!uU_koj+Uf7)L@enJ~u(6SOR; zR~qhUOW}BofMGi|5{O2xm|V1M7z_b+nsnC_4L&@evpx zd1XriFSXnm0l@Y~cZpkXv83K@F01s}4&n0cnUp@`Sv!ru$od)^!i(hqJR$?DC3{60 zWnA0PVseh18+>@s-kc*63ztVKH)OGkrs+uRFO(Exm_f!w%4rPKIr4oCTENHSPiY9L zirXBg=43)oN++EaP^7?2%_V051wC`=p!R1YyI{vph>PsckKSmLX8UE@ZIxoWh5OWt z#fFEiom(ix8|1!J?6oFAl^{Q6-H7ijZ~&P85B^+D`~Y(OKsO9?#a*TM%aiBeJ57QJ zWvUetwo`9p(FcyO zhB8V?$Wa8QR}AeKDN5M`nFd2u5mi9GP)SP`(_U0Xk9UjCf{qjF_(cjyTp+K^)P}+~ zSTGjcb_EhbC|TuqtuX=8fenG7_biz`^xs@rVH(%9Tv7fx zKIsNZhWX)?h1JV`c{=7Kim9sM^!3q}a~P`2p|b`pFGK)@3+(QVb$9d#6|VeqwnS~P z{v0^p!5BaYvyF_<8$jSekq8&a$CCt>NOkBrIAljgwGMPdyl7avaRS$U?R3A)y!#VmOR`^%kn=$cy zjO+t#OamyO74xZpl8+T!Kn&5Pfx7o>E}}v`7{T`?Xqv&LKqrr!X&kvv-0+#!XioXE@2fpp5vt+X6qjo1&k=x7l7_t)pt z8E&&hO;R?(J&w%E4Ai80HeYhoz-kfGUdI5zsN}*8PZ%A)XW1=2_6^_oqR@@CcWCFr$6f!IZ#h(*-S;!#`7ik058QZ(J9LQl5RQb_W5H5trDL)m=zR6yUT*({bb%(C@mK532iWkECTaP)L_pI9 zcb%a4TEd?e@uy1G)2T5_zWb!jV9^*9qt^fZVx1(dF#Sv}k0vYO^!akVXo~h!8VGR7 zNzm&F1_9*+m$IBqNP;{92Z{S*Qvm%NOX@&!lsxEz{Cv{MW(R_ z;E$!5a(2v=gYz0rDG>Z~_ANngzz66>l$!dWSpY53bGYyQ7Ao(E52`*;AHI(6!WFM89N&5H>*7_YapQ%a?slX*0wKW87tRnZ(GmiwP@ay}OenPGU|s=*f+>0h{?dr74d`oON1*@FNf~r?!s;PVNaE<3UoAet@}HI!lGG<{BnTf8 z^*V6rG)&>Bu$G}qdIMn*8mxj0eW{RLE3!B0=(cL}S~E4B0LbMfxspf&RS7*bS5)t! zX)qr6*%}bg`3YQ8X=O|m@hz+u$$*(l=8yYiaM`I!z;{y5fL`ZM!R2C!wv}VR`hkW| z$Gq__UU95BjE`Y&gJT0OBc%0A^f72^R^p9`!I{aZ6C9+_Em)8^#G+o+9By7Nt1_E5 zKr}&L3j|^Ia~#{(od6{qKh!3Zm?E|le&6#B(Z3#$5eJMVaD>l*$@L=#!@v5>$VMW< zUuT1}9dzvx?k7^_Dul2(4L^hT(sgWL2JTZeFsV&$sO`B`Flb|XEY6+VzUaO0e)$jn z;CB^8zF!BxOMmzGuDRAl+JfV)agJLN6W4fPx|I!poXMA+YECAF>_v%h<|8AP1RdyN zW6ZjCU=#W~NOM~E{E*EC$Fy#i^S~S_G@^xG6#4so03-pdFJo8-%frTEam}YXHX!kD z4YOPW0ocxIhj!S21w$>cJO3j-`r|kCAJykWt<-tZ`3pGJl!DSYu)Cgc0*b{z^qNGQ z)tu=aIt~6)`90;6r16Mk*XTcYcIP5#lfFziQXKJ3ibfXy~gfF2{l{#N?ie`3c#sJ zU~Z8{_(|uA%cONY;uBCIV$2T<5MUgdDv;|z?-V6MA&W=k9cJk46udG?ila*1iTcJ^ zb0AFyq3Ou^t2E}(0WDc0Xm%>PM8}6k*Seb*gTdaXuTrJBN73& zBAZRz9{-VoiBih}9KUe=yYDWBiFu&;d6X^)P2D9ID1dwa+ZF1g;B)~y7R^Zh2=?|9079RSb$>EF2Z z?uW5La{W-1uVXl?P_}W-!@$FNn)hQ3Wuvzjwa6evw zYQ7m)h<}1l&iu-`=zQW)xD;%pnXOn(X%GNYP7|7?#E}r7+IFB3+F0u_cV+IrDSY22 zV^w)V&Rpu`u)(oTg@UO=o7qdNmn{+-nMESf89Au~;U z=KYupZV7=8GbwgBlq@g5G=rCt*j5mzJV^U!>CfT%U zC^BlgT7XBWgw@G7q2kNmtTMVbpZ={^q2b#c=;=?e#_haEso*O2d|US_YD*>|D8+Dr$Xvt$);!@>B4=? z2YaL}F(h@Ogl7728?{3fwKHosw+W1(4FiQWe*i4%f%Uko2TZaM_wT?OYqe#=uxm1i zDA3V^ZS@(>KN9y&LxvB|A-mVq1?osPU7a#gqw$L!F{&u-ZkiKLiu}M8@G-DKR-!6+ z(0GVVW;BiQFey_5qS+59Xrh1*(>Ba9&4pr#vAf7Sx6v@>{)@k(n1I8>41R5ts!y_Q zOTnG`1VtjzmT3qePZS(ne3}VD;FUuY_>yGqpiQ#)Qpd|kuhr{Amq}zd$-0SffBPaW z0-SmYYBr|wYG7Cnv#b>Hnw}aWm?VXrS z6ik22VHkZar}7P{^x6u~k`>KHpwSvqo26!wv!TxI#B2iv6FCSXC%#%fwC~lQNRcMzSeVa{PEYVKc*;m0-$a%GbZwxow^_5Zglbhpsp- zR4*z$f+;HcNP*aGE_?60UiAat|F1@)FZTrO%U|)DtN(b`kB+c1v%A(ij=bT5ILF@| zpSiACn*(MH05o_Yv3c0YoX>dih$G+=FJiNFWy&)E8yH9XaS33c+3E+b{b$Q1E^ z;g3uZsFRa63Uq(qnTr52dfWnkl@1;trw-^)RdHSnJ00*^=o7Tent81D0~~KN|EN6t z(SG4krYYvn0j^-4@NldL%jR&wL=EY7Ed?QG!!B)%bHWmAVvE8O0A1TaGc~HZQ=(}j zO17_^lX+A^rA0tkEC#L}TI<;6yG0GTdvZ+Clnm1YiOV7tkP&eXwe5?#(l6#SX` z!!{H)R*=VFR)BzxB-+mR!f?u@4{U+HQfiM7P$YFjCjO7pCusFWF`Q0Ngr@PEm_KDn zk79r%qbPxpCG#Vh8!mdD4-gPWUdig~2#8~l#Hrc9en~M%WV<#Mv=%`3gu4Xb*#q^Uu+dzCq_YY&q zvjsP2ycZ|Wp7+U*yzaZ6{q!$qXmb(&x#i>|bze%3YXJ14W19T9bLnrpp1_xL!$>N~ zDpViIxF>O;8VO543=)`ORgtWP+;%!1QhN~I`L0jH#6c(8f8_Zkb zj4}8K0w=u~9M zJ0He!7#PW+CX=_M84zd5gu+-SM4|e?i6?rm=`a@#fL>#GCfhj~4KkMa8c!INq#57_ z7fIS{^Q(3N5Yy9Kv7MaDEFaQov3RJOpXX@mTCeITCGJFkKzizn* zO6gVPB0hJLM@M+-dRpZ{y4L@oKZ>k85`LHA~~cF&2^7arPr^rOCf>21J&p7)1m zwjaQX8=u6k59;(~O)wY!AqG0*lS9y^z>HhZp%ch11+PJQ2K1N!SPp6I_Aa$BF;Zu= zZrlPIM@OD<7)8$IGT-gY&wt+sKH8kS@kvj7{FmVp-FoY-|Lv9U+Ugz@w|UR(+b^)) zXzUK;y-!FDKteEQgXUzwT_=I1jdK)?HFI7hlTF|xa7$$LP#kfNgda@Xnh6s4&5&aB z&*a3cxYyXTi^VW8V3v)r-Nv=`zXezcIJv8mH3Xu>vL3QSr&I~c+nBpBwQuEK1p?@x z4lB~fGQQn1#=`@vyqKswhT$X;RT;6>F9AFSi3{v~jJ(yFGC^np2XyU_o2;)Dz0+&!m#a45rF-7P0Fm^Jr(@+OwLiq~~0Gs~?5_UTVP}~8N^$Qmy z1nVlB*r$u;U%Q(O+)y|{0pa2q<8S|bNr4oAJfUvIa^DpPISW25W;PNgXsQ4@`PZqP zSaDL1LJKa;5aD30B5>4%_d0oY7