Changeset 205
- Timestamp:
- 11/08/07 16:48:09 (1 year ago)
- Files:
-
- branches/jobs/defend/Config.d (modified) (1 diff)
- branches/jobs/defend/Main.d (modified) (2 diffs)
- branches/jobs/defend/game/Game.d (modified) (2 diffs)
- branches/jobs/defend/game/hud/Hud.d (modified) (6 diffs)
- branches/jobs/gen/core/JobSystem.d (modified) (1 diff)
- branches/jobs/gen/list/Indexed.d (modified) (1 diff)
- branches/jobs/gen/renderer/Renderer.d (modified) (1 diff)
- branches/jobs/gen/renderer/opengl/Texture.d (modified) (2 diffs)
- branches/jobs/gen/scene/Graph.d (modified) (13 diffs)
- branches/jobs/gen/scene/MeshNode.d (modified) (1 diff)
- branches/jobs/gen/scene/ModelNode.d (modified) (2 diffs)
- branches/jobs/gen/scene/Node.d (modified) (4 diffs)
- branches/jobs/gen/util/FPS.d (modified) (1 diff)
- branches/jobs/gen/util/Network.d (modified) (1 diff)
- branches/jobs/gen/util/Profiler.d (modified) (3 diffs)
- branches/jobs/gen/util/ProfilingDisplay.d (modified) (2 diffs)
- branches/jobs/gen/util/ScreenDebugger.d (modified) (2 diffs)
- branches/jobs/run/config.ini (modified) (2 diffs)
- branches/jobs/windefend.cbp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/jobs/defend/Config.d
r188 r205 23 23 const uint MAX_UNIT_NUMBER = 400; 24 24 const uint MAX_COLORS = 8; 25 const uint HUD_HEIGHT = 1 70;25 const uint HUD_HEIGHT = 150; 26 26 27 27 Vec3f playerColors[MAX_PLAYERS]; branches/jobs/defend/Main.d
r203 r205 79 79 80 80 // Create job system 81 jobSystem = new JobSystem( );81 jobSystem = new JobSystem(Integer.toInt(Config["threads"])); 82 82 83 83 // Create the renderer … … 139 139 140 140 jobHub.update(); 141 FPSCounter.update(); 141 142 142 143 //profile!("sleep") branches/jobs/defend/game/Game.d
r204 r205 448 448 449 449 if(miniScreenActivated) 450 miniScreenSprite.render(Vec2ui(renderer.width - miniScreenSprite.rect.width - 50, renderer.height - HUD_HEIGHT + 20));450 miniScreenSprite.render(Vec2ui(renderer.width - miniScreenSprite.rect.width - 50, renderer.height - HUD_HEIGHT + 10)); 451 451 452 452 mouse.render(); … … 455 455 }); 456 456 457 renderer.end(); 458 renderer.clear(); 457 profile!("flip") 458 ({ 459 renderer.end(); 460 renderer.clear(); 461 }); 459 462 } 460 463 branches/jobs/defend/game/hud/Hud.d
r201 r205 45 45 HUDConsole console; 46 46 47 debug48 {47 //debug 48 //{ 49 49 ProfilingDisplay profiling; 50 50 bool profile = false; 51 51 bool statistic = false; 52 }52 //} 53 53 54 54 ObjectTypeInfo minimalType; … … 111 111 screenDebugger.active = true; 112 112 113 debug114 {113 //debug 114 //{ 115 115 profiling = new ProfilingDisplay(littlefont); 116 116 profilerJob = jobSystem.addPostFrameJob(&profiling.update); 117 117 profilerJob.disable; 118 }118 //} 119 119 120 120 buttonsRoot = gui.add(new Widget(Vec2ui(10, renderer.height - HUD_HEIGHT + 10))); … … 140 140 void update(float time) 141 141 { 142 debug143 {142 //debug 143 //{ 144 144 if(inputManager.keyPressedFirst(KeyType.P)) 145 145 profilerJob.toggleEnabled(); … … 153 153 if(profile) 154 154 profiling.update(); 155 }155 //} 156 156 157 157 frametime = time; … … 169 169 void render() 170 170 { 171 font.write(10, 10, Vec3f(1), "FPS: {}", getFPS());172 173 debug174 {171 font.write(10, 10, Vec3f(1), "FPS: {}", FPSCounter.get()); 172 173 //debug 174 //{ 175 175 font.write(10, 30, Vec3f(1), "Time: {}", frametime); 176 176 … … 186 186 statistics.reset(); 187 187 } 188 }188 //} 189 189 190 190 glDisable(GL_TEXTURE_2D); branches/jobs/gen/core/JobSystem.d
r203 r205 242 242 243 243 public: 244 this( )244 this(uint numThreads = 0) 245 245 { 246 246 jobQueue = new typeof(jobQueue)(2048); 247 248 uint numThreads = 0;249 247 250 248 for(uint i = 0; i < numThreads; i++) branches/jobs/gen/list/Indexed.d
r173 r205 112 112 { 113 113 checkSort(); 114 115 if(top == 0) 116 return -1; 114 117 115 118 if(sorted) branches/jobs/gen/renderer/Renderer.d
r198 r205 4 4 5 5 import gen.util.Window; 6 import gen.util.Profiler; 6 7 import gen.image.Image; 7 8 import gen.image.Bitmap; branches/jobs/gen/renderer/opengl/Texture.d
r193 r205 4 4 5 5 import derelict.opengl.gl; 6 import derelict.opengl.glu; 6 7 7 8 import gen.image.Image; … … 39 40 _format = image.format; 40 41 41 glTexImage2D(GL_TEXTURE_2D, 0, cast(uint)format, 42 image.width, image.height, 0, Image.formatToOpenGL(format), 43 GL_UNSIGNED_BYTE, image.data.ptr); 44 42 //glTexImage2D(GL_TEXTURE_2D, 0, cast(uint)format, 43 // image.width, image.height, 0, Image.formatToOpenGL(format), 44 // GL_UNSIGNED_BYTE, image.data.ptr); 45 46 gluBuild2DMipmaps(GL_TEXTURE_2D, cast(uint)format, image.width, image.height, Image.formatToOpenGL(format), GL_UNSIGNED_BYTE, image.data.ptr); 47 45 48 _image.free(); 46 49 } branches/jobs/gen/scene/Graph.d
r203 r205 26 26 public import gen.scene.RenderPass; 27 27 28 private struct NodeHolder 29 { 30 SceneNode node; 31 float distance; 32 } 33 28 34 class CameraData 29 35 { 36 package: 37 TurboList!(NodeHolder)[RenderPass.max + 1] renderPasses; 30 38 bool active = true; 31 ICamera core;32 39 Vec3f clearColor; 40 41 public: 42 ICamera core; 33 43 ITexture texture; // The texture that is rendered to (not available for the main camera) 34 44 } … … 41 51 SceneNode root; 42 52 43 TurboList!(NodeHolder)[RenderPass.max + 1] renderPasses;44 45 struct NodeHolder46 {47 SceneNode node;48 float distance;49 }50 51 53 // Debug data like bounding boxes visible? 52 54 mixin(property("bool", "debugVisible")); … … 56 58 57 59 // Current camera 60 CameraData cameraData; 58 61 mixin(readProperty("ICamera", "camera")); 59 62 … … 71 74 72 75 root = new SceneNode; 73 74 foreach(ref pass; renderPasses)75 pass = new typeof(pass);76 76 } 77 77 … … 86 86 data.core = core; 87 87 data.texture = texture; 88 89 foreach(ref pass; data.renderPasses) 90 pass = new typeof(pass); 88 91 89 92 cameras[name] = data; … … 185 188 void update(float time) 186 189 { 190 root.doUpdate(time); 191 187 192 foreach(cam; cameras) 188 cam.core.update(time); 189 190 root.doUpdate(time, Mat4f.identity()); 191 } 192 193 // Render anything, for each camera 194 void draw() 195 { 196 // Render for each camera 197 foreach(key, camData; cameras) 198 { 199 if(!camData.active) 193 { 194 if(!cam.active) 200 195 continue; 201 196 202 camera = camData.core; 197 cameraData = cam; 198 camera = cam.core; 203 199 frustum = camera.frustum; 204 200 assert(frustum !is null); 205 201 202 camera.update(time); 203 204 foreach(pass; cam.renderPasses) 205 pass.reset(); 206 206 207 // Let nodes register themselves to be rendered 207 208 profile!("process") … … 214 215 ({ 215 216 // Solid objects are sorted by their texture 216 renderPasses[RenderPass.Solid].sort((NodeHolder first, NodeHolder second)217 cam.renderPasses[RenderPass.Solid].sort((NodeHolder first, NodeHolder second) 217 218 { 218 219 return cast(void*)first.node.texture - cast(void*)second.node.texture; … … 220 221 221 222 // Sort blended objects by their distance from the camera 222 renderPasses[RenderPass.Blended].sort((NodeHolder first, NodeHolder second)223 cam.renderPasses[RenderPass.Blended].sort((NodeHolder first, NodeHolder second) 223 224 { 224 225 return cast(int)first.distance - cast(int)second.distance; 225 226 }); 226 227 }); 227 228 if(camData.texture !is null) 229 renderer.setViewport(Rect(0, 0, camData.texture.width, camData.texture.height)); 228 } 229 } 230 231 // Render anything, for each camera 232 void draw() 233 { 234 // Render for each camera 235 foreach(cam; cameras) 236 { 237 if(!cam.active) 238 continue; 239 240 cameraData = cam; 241 camera = cam.core; 242 frustum = camera.frustum; 243 assert(frustum !is null); 244 245 if(cam.texture !is null) 246 renderer.setViewport(Rect(0, 0, cam.texture.width, cam.texture.height)); 230 247 else 231 248 renderer.setViewport(Rect(0, 0, renderer.width, renderer.height)); 232 249 233 renderer.setClearColor(cam Data.clearColor);250 renderer.setClearColor(cam.clearColor); 234 251 renderer.clear(); 235 252 … … 238 255 239 256 // Render skyboxes 240 profile!("skyboxes")257 /*profile!("skyboxes") 241 258 ({ 242 if( renderPasses[RenderPass.Skybox].length)259 if(cam.renderPasses[RenderPass.Skybox].length) 243 260 { 244 261 renderPass = RenderPass.Skybox; … … 246 263 renderer.translate(camera.position()); 247 264 248 foreach(object; renderPasses[renderPass])265 foreach(object; cam.renderPasses[renderPass]) 249 266 object.node.render(); 250 267 … … 252 269 renderer.setRenderState(RenderState.DepthTest, true); 253 270 } 254 }); 271 });*/ 255 272 256 273 // Use the camera's matrices … … 262 279 ({ 263 280 renderPass = RenderPass.Solid; 264 265 foreach(object;renderPasses[renderPass])266 object.node.render();281 282 foreach(object; cam.renderPasses[renderPass]) 283 object.node.render(); 267 284 }); 268 285 269 286 // Render blended objects 270 profile!("blended")287 /*profile!("blended") 271 288 ({ 272 289 renderPass = RenderPass.Blended; 273 290 renderer.setRenderState(RenderState.DepthTest, false); 274 291 275 foreach(object; renderPasses[renderPass])292 foreach(object; cam.renderPasses[renderPass]) 276 293 object.node.render(); 277 294 278 295 renderer.setRenderState(RenderState.DepthTest, true); 279 }); 280 281 if(cam Data.texture !is null)296 });*/ 297 298 if(cam.texture !is null) 282 299 { 283 300 profile!("copy framebuffer") 284 301 ({ 285 cam Data.texture.copyFromScreen();302 cam.texture.copyFromScreen(); 286 303 }); 287 304 } 288 289 // Empty all lists290 foreach(pass; renderPasses)291 pass.reset();292 305 } 293 306 } … … 302 315 holder.distance = node.absolutePosition.distance(camera.position); 303 316 304 renderPasses[pass] ~= holder; 317 assert(cameraData !is null); 318 cameraData.renderPasses[pass].append(holder); 305 319 } 306 320 branches/jobs/gen/scene/MeshNode.d
r194 r205 58 58 override void render() 59 59 { 60 profile!("render meshnode") 61 ({ 62 renderer.pushMatrix(); 63 renderer.mulMatrix(absoluteModelview); 64 mesh.render(); 65 66 //debug 67 //{ 68 // if(sceneGraph.debugVisible(this)) 69 // renderer.drawBoundingBox(mesh.boundingBox, Vec3f(0, 0, 1)); 70 //} 71 72 renderer.popMatrix(); 73 }); 60 renderer.pushMatrix(); 61 renderer.mulMatrix(absoluteModelview); 62 mesh.render(); 63 64 debug 65 { 66 if(sceneGraph.debugVisible(this)) 67 renderer.drawBoundingBox(mesh.boundingBox, Vec3f(0, 0, 1)); 68 } 69 70 renderer.popMatrix(); 74 71 } 75 72 } branches/jobs/gen/scene/ModelNode.d
r193 r205 65 65 debug 66 66 { 67 if(sceneGraph.debugVisible(this) && child && child.next !is null)67 if(sceneGraph.debugVisible(this)) 68 68 sceneGraph.addToRender(RenderPass.Solid, this); 69 69 } … … 72 72 override void render() 73 73 { 74 renderer.drawBoundingBox(bbox, Vec3f(.8, .1, .1)); 74 renderer.pushMatrix(); 75 renderer.mulMatrix(absoluteModelview); 76 renderer.drawBoundingBox(model.boundingBox, Vec3f(.8, .1, .1)); 77 renderer.popMatrix(); 75 78 } 76 79 branches/jobs/gen/scene/Node.d
r194 r205 58 58 package: 59 59 // Update the modelview matrices and recurse for any childs and neighbours 60 void doUpdate(float time , Mat4f m)60 void doUpdate(float time) 61 61 { 62 62 if(recalcModelview) … … 65 65 if(recalcModelview || (parent !is null && parent.recalcModelview)) 66 66 { 67 absoluteModelview = m * relativeModelview; 67 if(parent !is null) 68 absoluteModelview = parent.absoluteModelview * relativeModelview; 69 68 70 recalcModelview = true; 69 71 } … … 72 74 73 75 if(child !is null) 74 child.doUpdate(time , absoluteModelview);76 child.doUpdate(time); 75 77 76 78 if(next !is null) 77 next.doUpdate(time , m);79 next.doUpdate(time); 78 80 79 81 recalcModelview = false; … … 123 125 void rotation(ref Vec3f v) 124 126 { 127 if(v == rotation) 128 return; 129 125 130 _rotation = v; 126 131 matrixRotation = Mat4f.rotation(_rotation); branches/jobs/gen/util/FPS.d
r61 r205 3 3 import gen.util.Wrapper; 4 4 5 uint getFPS() 5 class FPSCounter 6 6 { 7 static uint outfps = 0; 8 static uint fps = 0; 9 static uint last = 0; 10 11 if(getTickCount() - last < 1000) 12 fps++; 13 else 14 { 15 last = getTickCount(); 16 outfps = fps; 17 fps = 0; 18 } 19 20 return outfps; 7 private: 8 static uint fps = 0; 9 static uint lastFPS = 0; 10 static uint lastFrame = 0; 11 12 public: 13 static void update() 14 { 15 if(getTickCount() - lastFrame < 1000) 16 fps++; 17 else 18 { 19 lastFrame = getTickCount(); 20 lastFPS = fps; 21 fps = 0; 22 } 23 } 24 25 static uint get() 26 { 27 return lastFPS; 28 } 21 29 } branches/jobs/gen/util/Network.d
r173 r205 210 210 buffer[0 .. data.length] = data[]; 211 211 buffer[data.length .. data.length + seperator.length] = seperator[]; 212 socket.output.write(buffer[0 .. data.length + seperator.length]); 212 auto slice = buffer[0 .. data.length + seperator.length]; 213 214 uint sent = socket.output.write(slice); 215 assert(sent == slice.length); 213 216 //} 214 217 } branches/jobs/gen/util/Profiler.d
r201 r205 26 26 Object mutex; 27 27 ThreadLocal!(int*) _currentBlock; 28 //int block = -1; 28 29 29 30 int currentBlock() 30 31 { 32 //return block; 33 31 34 if(_currentBlock.val is null) 32 35 { … … 40 43 void currentBlock(int val) 41 44 { 45 //block = val; 46 //return; 47 42 48 if(_currentBlock.val is null) 43 49 { … … 124 130 else 125 131 { 126 static if(is(T == void))132 static if(is(T == void)) 127 133 dg(); 128 134 else branches/jobs/gen/util/ProfilingDisplay.d
r203 r205 10 10 import gen.util.Profiler; 11 11 import gen.util.JobHub; 12 import gen.util.FPS; 12 13 13 14 private struct Node … … 111 112 112 113 node.text = layout.sprint(node.textBuffer, 113 "{}: {} calls; {} ms; {} ms/call; {}%",114 "{}: {} calls; {} calls/frame; {} ms; {} ms/call; {}%", 114 115 data.name, 115 116 data.calls, 117 data.calls / cast(float)FPSCounter.get(), 116 118 data.time * 0.001, 117 119 (data.time * 0.001) / data.calls, branches/jobs/gen/util/ScreenDebugger.d
r200 r205 39 39 l = new Line; 40 40 l.text = new char[512]; 41 l.color = (i % 2 == 0) ? Vec3f(1) : Vec3f(0.8);42 41 } 43 42 … … 73 72 74 73 int i; 74 bool color = false; 75 75 foreach(l; sortList) 76 76 { 77 font.write(pos.x, pos.y + (font.maxHeight + 4) * i, l.color, l.text[0 .. l.length]); 77 color = !color; 78 79 font.write(pos.x, pos.y + (font.maxHeight + 4) * i, color ? Vec3f(1) : Vec3f(0.8), l.text[0 .. l.length]); 78 80 79 81 l.length = 0; branches/jobs/run/config.ini
r190 r205 4 4 5 5 # fov 6 fov= 956 fov=70 7 7 8 8 # make the game nice or have much performance … … 17 17 # port for multiplayer 18 18 port=6000 19 20 # number of threads for the job system (0 = run everything in main thread) 21 threads=0 branches/jobs/windefend.cbp
r201 r205 48 48 <Add option="-release" /> 49 49 <Add option="-O" /> 50 <Add option="-inline" />51 50 </Compiler> 52 51 </Target>
