Changeset 580
- Timestamp:
- 05/27/08 07:13:03 (8 months ago)
- Files:
-
- trunk/run/data/models/sydney (added)
- trunk/run/data/models/sydney/baseframe.md2 (added)
- trunk/run/data/models/sydney/ctf_b.PCX (added)
- trunk/run/data/models/sydney/ctf_b_i.PCX (added)
- trunk/run/data/models/sydney/ctf_r.PCX (added)
- trunk/run/data/models/sydney/ctf_r_i.PCX (added)
- trunk/run/data/models/sydney/sydney.JPG (added)
- trunk/run/data/models/sydney/sydney.PCX (added)
- trunk/run/data/models/sydney/sydney.bmp (added)
- trunk/run/data/models/sydney/sydney.cfg (added)
- trunk/run/data/models/sydney/sydney.png (added)
- trunk/run/data/models/sydney/sydney.txt (added)
- trunk/run/data/models/sydney/sydney_i.pcx (added)
- trunk/run/data/models/sydney/sydneysource.psd (added)
- trunk/run/data/models/sydney/tris.md2 (added)
- trunk/run/data/models/sydney/weapon.PCX (added)
- trunk/run/data/models/sydney/weapon.md2 (added)
- trunk/run/data/models/sydney/weapon.psd (added)
- trunk/src/defend/Camera.d (modified) (4 diffs)
- trunk/src/defend/sim/SceneNode.d (modified) (14 diffs)
- trunk/src/defend/sim/obj/Sheep.d (modified) (1 diff)
- trunk/src/defend/sim/obj/Unit.d (modified) (8 diffs)
- trunk/src/defend/terrain/Generator.d (modified) (2 diffs)
- trunk/src/gen/math/BoundingBox.d (modified) (1 diff)
- trunk/src/gen/model/Mesh.d (modified) (2 diffs)
- trunk/src/gen/model/Model.d (modified) (4 diffs)
- trunk/src/gen/model/ModelMD2.d (added)
- trunk/src/gen/model/ModelObj.d (modified) (2 diffs)
- trunk/src/gen/rend/VertexArray.d (modified) (1 diff)
- trunk/src/gen/rend/opengl/VertexBuffer.d (modified) (1 diff)
- trunk/src/gen/scene/Graph.d (modified) (5 diffs)
- trunk/src/gen/scene/MeshNode.d (modified) (1 diff)
- trunk/src/gen/scene/Node.d (modified) (1 diff)
- trunk/src/gen/util/Array.d (modified) (1 diff)
- trunk/src/gen/util/Statistics.d (modified) (1 diff)
- trunk/src/windefend.cbp (modified) (1 diff)
- trunk/src/xf/omg/core/LinearAlgebra.d (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/src/defend/Camera.d
r576 r580 112 112 } 113 113 114 void c ollision()114 void checkCollision() 115 115 { 116 116 if(pos.z < -cast(int)terrain.dimension.y + 18) 117 117 pos.z = -cast(int)terrain.dimension.y + 18; 118 118 119 if(pos.z >= 3)120 pos.z = 3;119 if(pos.z >= 0) 120 pos.z = 0; 121 121 122 122 if(pos.x <= 0) … … 126 126 pos.x = terrain.dimension.x - 18; 127 127 128 auto tempPos = pos; 129 130 if(tempPos.z > 0) 131 tempPos.z = 0; 132 133 auto rayDown = Ray!(float)(vec3(tempPos.x, 10_000, tempPos.z), 134 vec3(0, -1, 0)); 128 auto rayDown = Ray!(float)(vec3(pos.x, 10_000, pos.z), vec3(0, -1, 0)); 135 129 136 130 terrain.iteratePatches( 137 131 (TerrainPatch patch) 138 132 { 139 if( tempPos.x >= patch.area.left &&140 tempPos.x < patch.area.right &&141 - tempPos.z >= patch.area.top &&142 - tempPos.z < patch.area.bottom)133 if(pos.x >= patch.area.left && 134 pos.x < patch.area.right && 135 -pos.z >= patch.area.top && 136 -pos.z < patch.area.bottom) 143 137 { 144 138 float t, u, v; … … 167 161 } 168 162 169 void matrices()163 void calcMatrices() 170 164 { 171 165 float sinyaw = sin(yaw); … … 250 244 void update() 251 245 { 252 c ollision();253 matrices();246 checkCollision(); 247 calcMatrices(); 254 248 } 255 249 trunk/src/defend/sim/SceneNode.d
r579 r580 26 26 private: 27 27 Model model; 28 ModelInstance modelInstance; 29 28 30 vec3 color; 29 31 bool isNeutral; … … 33 35 void calcBoundingBox() 34 36 { 35 bbox = model.boundingBox;37 //bbox = model.boundingBox; 36 38 37 39 bbox.min *= scaling; … … 52 54 53 55 model = Model.acquire(file); 56 modelInstance = model.createInstance(); 57 54 58 this.color = color; 55 59 this.isNeutral = isNeutral; … … 63 67 ~this() 64 68 { 69 model.freeInstance(modelInstance); 65 70 Model.release(model); 66 71 } … … 68 73 override void update() 69 74 { 70 if(recalcModelview)71 calcBoundingBox();75 bbox = modelInstance.boundingBox; 76 calcBoundingBox(); 72 77 } 73 78 … … 75 80 { 76 81 visible = camera.frustum.boundingBoxVisible(bbox) && !fogOfWarCulled; 82 83 debug if(sceneGraph.debugNodeVisible(this)) 84 sceneGraph.addToRender(RenderPass.Debug, this); 85 } 86 87 debug override void render() 88 { 89 renderer.pushMatrix(); 90 //renderer.mulMatrix(absoluteModelview); 91 renderer.drawBoundingBox(bbox, vec3(1, 0, 1)); 92 renderer.popMatrix(); 77 93 } 78 94 … … 80 96 { 81 97 return bbox; 98 } 99 100 void setAnimation(char[] name) 101 { 102 modelInstance.setAnimation(name); 82 103 } 83 104 } … … 92 113 version(GlowTest) Shader glowShader; 93 114 94 static int renderPassNormal;95 static int renderPassNormalBlended;96 static int renderPassShadowMap;97 version(GlowTest) static int renderPassGlow = -1;115 static render_pass_t renderPassNormal; 116 static render_pass_t renderPassNormalBlended; 117 static render_pass_t renderPassShadowMap; 118 version(GlowTest) static render_pass_t renderPassGlow = -1; 98 119 99 120 static void setupRender(bool isNeutral) 100 121 { 101 renderer.setRenderState(RenderState.BackfaceCulling, true);122 //renderer.setRenderState(RenderState.BackfaceCulling, true); 102 123 103 124 auto shader = Shader.acquire(isNeutral ? "model-neutral.cfg" : "model.cfg"); … … 126 147 static void finishRender(bool isNeutral) 127 148 { 128 renderer.setRenderState(RenderState.BackfaceCulling, false);149 //renderer.setRenderState(RenderState.BackfaceCulling, false); 129 150 130 151 Shader.release(Shader.get(isNeutral ? "model-neutral.cfg" : "model.cfg")); … … 203 224 } 204 225 ); 226 } 227 228 void renderMesh() 229 { 230 parent.modelInstance.render(mesh); 205 231 } 206 232 … … 305 331 shader.setUniform("modelTransform", absoluteModelview); 306 332 307 mesh.render();333 renderMesh(); 308 334 309 335 renderer.popMatrix(); … … 318 344 renderer.setShader(null); 319 345 320 mesh.render();346 renderMesh(); 321 347 322 348 renderer.popMatrix(); … … 333 359 glowShader.setUniform("diffuseTexture", 0); 334 360 335 mesh.render();361 renderMesh(); 336 362 337 363 renderer.popMatrix(); … … 340 366 void renderDebug() 341 367 { 342 renderer.pushMatrix();368 /+renderer.pushMatrix(); 343 369 renderer.mulMatrix(absoluteModelview); 344 370 renderer.drawBoundingBox(mesh.boundingBox, vec3(1, 0, 1)); 345 renderer.popMatrix(); 371 renderer.popMatrix();+/ 346 372 } 347 373 } trunk/src/defend/sim/obj/Sheep.d
r579 r580 24 24 with(ti) 25 25 { 26 model = "sheep/low.obj"; 26 //model = "sheep/low.obj"; 27 model = "sydney/sydney.cfg"; 27 28 miniPic = "minipics/sheep.png"; 28 29 parentType = "unit"; 29 30 posOffset = vec3(0, 1, 0); 30 scale = vec3.one; 31 scale = vec3(0.035, 0.035, 0.035); 32 normRotation = vec3(1.6, -1.6, 0); 31 33 developmentSteps = 18; 32 34 properties[GameObject.Property.MaxLife] = objProp(500); trunk/src/defend/sim/obj/Unit.d
r573 r580 78 78 class UnitTypeInfo : BaseTypeInfo 79 79 { 80 vec3 normRotation = vec3.zero; 81 80 82 // Time needed for development (in simulation steps) 81 83 uint developmentSteps = 30; … … 186 188 pause = 20; 187 189 path = null; 190 191 sceneNode.setAnimation("stand"); 188 192 189 193 debug(gameobjects) logger.spam("tile occupied; taking a break of {} steps", movePause); … … 289 293 void moveFinished() 290 294 { 295 sceneNode.setAnimation("stand"); 296 291 297 direction = finalDirection; 292 298 status = Status.Idle; … … 407 413 if(!checkCollision(path[0])) 408 414 { 415 sceneNode.setAnimation("run"); 416 409 417 status = Status.Moving; 410 418 … … 416 424 } 417 425 else 426 { 427 sceneNode.setAnimation("stand"); 418 428 debug(gameobjects) logger.spam("no path found"); 429 } 419 430 } 420 431 … … 603 614 sceneNode.translation = realPos + unitInfo.posOffset; 604 615 sceneNode.scaling = unitInfo.scale; 616 sceneNode.setAnimation("stand"); 605 617 } 606 618 … … 646 658 647 659 sceneNode.translation = realPos + unitInfo.posOffset; 648 649 debug(gameobjects) 650 { 651 if(!direction.ok) 652 logger.warn("direction is a nan"); 653 } 654 655 sceneNode.rotation(direction); 660 sceneNode.rotation = direction + unitInfo.normRotation; 656 661 } 657 662 … … 786 791 } 787 792 788 override ModelNodesceneNode()793 override GameObjectModel sceneNode() 789 794 { 790 795 return _sceneNode; trunk/src/defend/terrain/Generator.d
r576 r580 69 69 with(gameObjects) 70 70 { 71 localCreate(cast(player_id_t)0, "house", 30, 30); 71 localCreate(cast(player_id_t)0, "house", 30, 30); 72 localCreate(cast(player_id_t)0, "sheep", 32, 29); 72 73 73 74 if(players.isPlayer(cast(player_id_t)1)) … … 76 77 // localCreate(cast(player_id_t)0, "house", 40, 30); 77 78 78 for(int i = 0; i < 50; i++)79 version(none) for(int i = 0; i < 50; i++) 79 80 { 80 81 auto ti = getTypeInfo(NEUTRAL_PLAYER, "wood"); trunk/src/gen/math/BoundingBox.d
r578 r580 43 43 min.z = .min(min.z, point.z); 44 44 45 center = (min + max) * 0.5;45 //center = (min + max) * 0.5; 46 46 } 47 47 trunk/src/gen/model/Mesh.d
r541 r580 14 14 import gen.rend.PrimitiveType; 15 15 16 class ModelInstance 17 { 18 BoundingBox!(float) boundingBox; 19 20 this() 21 { 22 23 } 24 25 void render(Mesh mesh) 26 { 27 mesh.render(); 28 } 29 30 void setAnimation(char[] name) { } 31 void stopAnimation() { } 32 } 33 16 34 class Mesh 17 35 { 18 36 mixin MAllocator; 19 37 38 VertexArray vertices; 39 IndexBuffer indices; 40 Texture texture; 41 PrimitiveType type; 42 BoundingBox!(float) boundingBox; 43 44 ~this() 45 { 46 delete vertices; 47 delete indices; 48 49 if(texture) Texture.release(texture); 50 } 51 52 final void calcNormals() 53 { 54 assert(vertices !is null); 55 assert(indices is null); 56 57 for(uint i = 0; i < vertices.length; i += 3) 58 { 59 auto v1 = vertices.getVertexT!(Vertex)(i); 60 auto v2 = vertices.getVertexT!(Vertex)(i + 1); 61 auto v3 = vertices.getVertexT!(Vertex)(i + 2); 62 63 auto normal = vec3.cross((v2.position - v1.position), 64 (v3.position - v1.position)).normalized(); 65 v1.normal = v2.normal = v3.normal = normal; 66 67 vertices.setVertex(cast(int)i, *v1); 68 vertices.setVertex(cast(int)i + 1, *v2); 69 vertices.setVertex(cast(int)i + 2, *v3); 70 } 71 72 vertices.synchronize(); 73 } 74 75 void render() 76 { 77 renderer.setTexture(0, texture); 78 renderer.draw(vertices, indices, type); 79 } 80 20 81 struct Vertex 21 82 { … … 43 104 } 44 105 } 45 46 VertexArray vertices;47 IndexBuffer indices;48 Texture texture;49 PrimitiveType type;50 BoundingBox!(float) boundingBox;51 52 ~this()53 {54 delete vertices;55 delete indices;56 57 if(texture) Texture.release(texture);58 }59 60 void calcNormals()61 {62 assert(vertices !is null);63 assert(indices is null);64 65 for(uint i = 0; i < vertices.length; i += 3)66 {67 auto v1 = vertices.getVertexT!(Vertex)(i);68 auto v2 = vertices.getVertexT!(Vertex)(i + 1);69 auto v3 = vertices.getVertexT!(Vertex)(i + 2);70 71 auto normal = vec3.cross((v2.position - v1.position), (v3.position - v1.position)).normalized();72 v1.normal = v2.normal = v3.normal = normal;73 74 vertices.setVertex(cast(int)i, *v1);75 vertices.setVertex(cast(int)i + 1, *v2);76 vertices.setVertex(cast(int)i + 2, *v3);77 78 //synchronized(Stdout) Stdout("normal: ")(v1.normal).newline;79 }80 81 vertices.synchronize();82 }83 84 void render()85 {86 renderer.setTexture(0, texture);87 renderer.draw(vertices, indices, type);88 }89 106 } 90 107 trunk/src/gen/model/Model.d
r501 r580 1 1 module gen.model.Model; 2 2 3 import tango.io.Stdout; 4 5 import gen.math.Vector; 6 import gen.math.BoundingBox; 3 7 import gen.util.Memory; 4 8 import gen.util.Resource; 5 import gen.math.Vector; 6 import gen.math.BoundingBox; 9 import gen.util.Config; 7 10 import gen.model.Mesh; 8 11 import gen.model.ModelObj; 12 import gen.model.ModelMD2; 9 13 import gen.rend.Texture; 10 14 import gen.rend.VertexArray; … … 17 21 Mesh[] _meshes; 18 22 23 ModelInstance function() instanceFactory; 24 25 static ModelInstance createDefaultInstance() 26 { 27 return new ModelInstance; 28 } 29 19 30 mixin ModelLoaderObj; 31 mixin ModelLoaderMD2; 20 32 21 33 public: … … 29 41 return new Model(file); 30 42 } 31 43 44 static Model loadResource(Config config) 45 { 46 return new Model(config); 47 } 48 32 49 this(char[] name) 33 50 { 34 boundingBox.max = vec3(-10_000, -10_000, -10_000); 35 boundingBox.min = vec3( 10_000, 10_000, 10_000); 36 51 instanceFactory = &createDefaultInstance; 37 52 loadObj(name); 38 39 foreach(mesh; _meshes) 40 mesh.calcNormals(); 53 } 54 55 this(Config config) 56 { 57 instanceFactory = &createDefaultInstance; 58 loadMD2(config); 41 59 } 42 60 … … 57 75 } 58 76 59 void render() { foreach(mesh; meshes) mesh.render(); } 77 ModelInstance createInstance() 78 { 79 assert(instanceFactory !is null); 80 81 auto result = instanceFactory(); 82 result.boundingBox = boundingBox; 83 84 return result; 85 } 86 87 void freeInstance(ModelInstance instance) 88 { 89 // might use some kind of pool 90 delete instance; 91 } 92 93 //void render() { foreach(mesh; meshes) mesh.render(); } 60 94 } trunk/src/gen/model/ModelObj.d
r543 r580 61 61 62 62 currentMesh.type = faceNumber == 3 ? PrimitiveType.Triangle : PrimitiveType.Quad; 63 currentMesh.vertices = renderer.createVertexArray(Mesh.Vertex.format, faceCount[objectIndex], VertexArrayUsage.StaticDraw); 63 currentMesh.vertices = renderer.createVertexArray(Mesh.Vertex.format, 64 faceCount[objectIndex], 65 VertexArrayUsage.StaticDraw); 64 66 currentMesh.boundingBox.max = vec3(-10_000, -10_000, -10_000); 65 67 currentMesh.boundingBox.min = vec3( 10_000, 10_000, 10_000); … … 271 273 } 272 274 273 /+if(path == "data/models/sheep/low.obj") 274 { 275 scope file = new FileConduit("dump.log", FileConduit.ReadWriteCreate); 276 scope(exit) file.close(); 277 278 for(int i = 0; i < meshes[0].vertices.length; i++) 279 { 280 auto vertex = meshes[0].vertices.getVertexT!(Mesh.Vertex)(i); 281 file.output.write(vertex.position.toString()); 282 file.output.write(vertex.texture.toString()); 283 file.output.write(vertex.normal.toString()); 284 } 285 }+/ 275 foreach(mesh; _meshes) 276 mesh.calcNormals(); 286 277 287 278 foreach(mesh; meshes) trunk/src/gen/rend/VertexArray.d
r528 r580 1 1 module gen.rend.VertexArray; 2 2 3 enum VertexArrayUsage // Names and descriptions from deadlock3 enum VertexArrayUsage 4 4 { 5 5 // The data store contents will be specified once by the application, trunk/src/gen/rend/opengl/VertexBuffer.d
r507 r580 61 61 if(first * size < firstSet) firstSet = first * size; 62 62 if(((first + num) * size) > lastSet) lastSet = (first + num) * size; 63 63 64 64 copy[first * size .. first * size + num * size] = data[]; 65 65 } trunk/src/gen/scene/Graph.d
r574 r580 22 22 import gen.scene.Camera; 23 23 24 alias int render_pass_t; 25 24 26 // Standard render passes 25 27 enum RenderPass : int … … 63 65 { 64 66 int id; 65 int priority; 67 int priority; // higher == later 66 68 BufferedArray!(NodeHolder) nodes; 67 69 … … 84 86 85 87 // Render pass types 86 int renderPassCounter = RenderPass.max + 1;88 render_pass_t renderPassCounter = RenderPass.max + 1; 87 89 RenderPassData[] renderPasses; // sorted by priority 88 90 RenderPassData*[] renderPassRefs; // sorted by id … … 109 111 110 112 // Add a render pass type 111 int addRenderPass(int priority,112 void function(NodeHolder[], Camera) setup,113 void function() clean,114 int id = -1,115 Framebuffer framebuffer = null,116 bool calcDistance = false)113 render_pass_t addRenderPass(int priority, 114 void function(NodeHolder[], Camera) setup, 115 void function() clean, 116 render_pass_t id = -1, 117 Framebuffer framebuffer = null, 118 bool calcDistance = false) 117 119 out(result) 118 120 { … … 457 459 458 460 // Add a new node which shall be rendered this frame 459 void addToRender( int pass, SceneNode node, void delegate() render = null)461 void addToRender(render_pass_t pass, SceneNode node, void delegate() render = null) 460 462 { 461 463 assert(cameraData !is null); trunk/src/gen/scene/MeshNode.d
r574 r580 56 56 override void process(Camera camera) 57 57 { 58 sceneGraph.addToRender( mesh.texture.format == ImageFormat.RGBA ? RenderPass.Blended :RenderPass.Solid, this);58 sceneGraph.addToRender(RenderPass.Solid, this); 59 59 } 60 60 trunk/src/gen/scene/Node.d
r561 r580 143 143 144 144 _rotation = v; 145 matrixRotation = mat4.zRotation(_rotation.z) * mat4. xRotation(_rotation.x) * mat4.yRotation(_rotation.y);145 matrixRotation = mat4.zRotation(_rotation.z) * mat4.yRotation(_rotation.y) * mat4.xRotation(_rotation.x); 146 146 recalcModelview = true; 147 147 } trunk/src/gen/util/Array.d
r576 r580 139 139 void fill(T value, uint x, uint y, uint w, uint h) 140 140 { 141 //data[x + y * width .. (x + w) + (y + h) * width] = value;141 data[x + y * width .. (x + w) + (y + h) * width] = value; 142 142 143 foreach(ref x; iterate(x, y, w, h))144 x = value;143 //foreach(ref x; iterate(x, y, w, h)) 144 // x = value; 145 145 } 146 146 trunk/src/gen/util/Statistics.d
r514 r580 54 54 "frustum bsphere checks"[], 55 55 "texture changes"[], 56 "shader changes"[])); 56 "shader changes"[], 57 "vertices skinned"[])); 57 58 58 59 void render(GuiRenderer renderer, vec2i pos, Font font) trunk/src/windefend.cbp
r570 r580 175 175 <Unit filename="gen\model\Mesh.d" /> 176 176 <Unit filename="gen\model\Model.d" /> 177 <Unit filename="gen\model\ModelMD2.d" /> 177 178 <Unit filename="gen\model\ModelObj.d" /> 178 179 <Unit filename="gen\net\tcp\Message.d" /> trunk/src/xf/omg/core/LinearAlgebra.d
r551 r580 12 12 } 13 13 14 debug = OMG; 14 15 15 16 … … 61 62 static if (4 == dim) const static Vector unitW = { x : cscalar!(flt, 0), y : cscalar!(flt, 0), z : cscalar!(flt, 0), w : cscalar!(flt, 1) }; 62 63 63 64 65 66 bool ok() { 67 static if (dim >= 1) if (isNaN(x)) return false; 68 static if (dim >= 2) if (isNaN(y)) return false; 69 static if (dim >= 3) if (isNaN(z)) return false; 70 static if (dim >= 4) if (isNaN(w)) return false; 71 return true; 72 } 73 74 // :P 75 alias ok isOK; 76 alias ok isCorrect; 64 65 debug(OMG) 66 { 67 bool ok() { 68 static if (dim >= 1) if (isNaN(x)) return false; 69 static if (dim >= 2) if (isNaN(y)) return false; 70 static if (dim >= 3) if (isNaN(z)) return false; 71 static if (dim >= 4) if (isNaN(w)) return false; 72 return true; 73 } 74 } 75 else 76 const bool ok = true; 77 78 // :P 79 alias ok isOK; 80 alias ok isCorrect; 77 81 78 82
