From a8ac67d6851c5809139c822ecfc55122242af8a4 Mon Sep 17 00:00:00 2001 From: neauoire Date: Fri, 15 May 2020 11:35:20 +0900 Subject: [PATCH] Added warnings --- units/Graf3DScene/Graf3DPrimitives.pas | 23 ------------ units/Graf3DScene/Graf3DScene.pas | 50 +++++++++++++++++++++++--- units/Graf3DScene/main.pas | 43 ++++++++++------------ 3 files changed, 64 insertions(+), 52 deletions(-) diff --git a/units/Graf3DScene/Graf3DPrimitives.pas b/units/Graf3DScene/Graf3DPrimitives.pas index a6e46ed..cf62a8b 100644 --- a/units/Graf3DScene/Graf3DPrimitives.pas +++ b/units/Graf3DScene/Graf3DPrimitives.pas @@ -14,35 +14,12 @@ interface procedure SetCyl3D (var shape: Shape3D; x, y, z, w, h, d, r: Fixed); procedure SetPyramid3D (var shape: Shape3D; x, y, z, w, h, d, ax, az: Fixed); {parts} - procedure AddVertice3D (var shape: Shape3D; x, y, z: Fixed); - procedure AddLink3D (var shape: Shape3D; a, b: Integer); - procedure AddFace3D (var shape: Shape3D; a, b, c: Integer); procedure AddTri3D (var shape: Shape3D; x, y, z, w, h: Fixed); procedure AddRect3D (var shape: Shape3D; x, y, z, w, h: Fixed); procedure AddCircle3D (var shape: Shape3D; x, y, z, r: Fixed); implementation - procedure AddVertice3D (var shape: Shape3D; x, y, z: Fixed); - var - voff: Integer; { vertices offset} - begin - shape.verticesLength := shape.verticesLength + 1; - SetPt3D(shape.vertices[shape.verticesLength], Long2Fix(x), Long2Fix(y), Long2Fix(z)); - end; - - procedure AddLink3D (var shape: Shape3D; a, b: Integer); - begin - shape.length := shape.length + 1; - SetLk3D(shape.edges[shape.length], @shape.vertices[a], @shape.vertices[b]); - end; - - procedure AddFace3D (var shape: Shape3D; a, b, c: Integer); - begin - shape.facesLength := shape.facesLength + 1; - SetFc3D(shape.faces[shape.facesLength], @shape.vertices[a], @shape.vertices[b], @shape.vertices[c]); - end; - procedure AddTri3D (var shape: Shape3D; x, y, z, w, h: Fixed); var voff, eoff, foff: Integer; { vertices offset} diff --git a/units/Graf3DScene/Graf3DScene.pas b/units/Graf3DScene/Graf3DScene.pas index ef48f18..90051d3 100644 --- a/units/Graf3DScene/Graf3DScene.pas +++ b/units/Graf3DScene/Graf3DScene.pas @@ -4,6 +4,11 @@ interface uses FixMath, Graf3D; + const + LIMIT_VERTICES = 32; + LIMIT_EDGES = 32; + LIMIT_FACES = 8; + type Point3DPtr = ^Point3D; @@ -21,16 +26,16 @@ interface Shape3D = record origin: Point3D; length, verticesLength, facesLength: Integer; - vertices: array[1..64] of Point3D; - edges: array[1..64] of Link3D; - faces: array[1..16] of Face3D; + vertices: array[1..LIMIT_VERTICES] of Point3D; + edges: array[1..LIMIT_EDGES] of Link3D; + faces: array[1..LIMIT_FACES] of Face3D; end; Shape3DPtr = ^Shape3D; Scene3D = record length: Integer; - shapes: array[1..10] of Shape3DPtr; + shapes: array[1..20] of Shape3DPtr; end; Scene3DPtr = ^Scene3D; @@ -63,9 +68,20 @@ interface procedure DrawLink3D (link: Link3D); procedure DrawShape3D (shape: Shape3DPtr); procedure DrawScene3D (scene: Scene3D); +{ basics } + procedure AddVertice3D (var shape: Shape3D; x, y, z: Fixed); + procedure AddLink3D (var shape: Shape3D; a, b: Integer); + procedure AddFace3D (var shape: Shape3D; a, b, c: Integer); implementation + procedure SceneError (text: string); + begin + ShowText; + Writeln(text); + Halt; + end; + procedure AddShape3D (var scene: scene3D; shape: Shape3DPtr); begin scene.length := scene.length + 1; @@ -134,6 +150,32 @@ implementation scene.length := 0; end; + procedure AddVertice3D (var shape: Shape3D; x, y, z: Fixed); + var + voff: Integer; { vertices offset} + begin + if shape.verticesLength > LIMIT_VERTICES - 1 then + SceneError('Verticles limit reached'); + shape.verticesLength := shape.verticesLength + 1; + SetPt3D(shape.vertices[shape.verticesLength], Long2Fix(x), Long2Fix(y), Long2Fix(z)); + end; + + procedure AddLink3D (var shape: Shape3D; a, b: Integer); + begin + if shape.length > LIMIT_EDGES - 1 then + SceneError('Edges limit reached'); + shape.length := shape.length + 1; + SetLk3D(shape.edges[shape.length], @shape.vertices[a], @shape.vertices[b]); + end; + + procedure AddFace3D (var shape: Shape3D; a, b, c: Integer); + begin + if shape.facesLength > LIMIT_FACES - 1 then + SceneError('Edges limit reached'); + shape.facesLength := shape.facesLength + 1; + SetFc3D(shape.faces[shape.facesLength], @shape.vertices[a], @shape.vertices[b], @shape.vertices[c]); + end; + procedure DrawLink3D (link: Link3D); begin MoveTo3D(link.a^.x, link.a^.y, link.a^.z); diff --git a/units/Graf3DScene/main.pas b/units/Graf3DScene/main.pas index e658afa..2f3120e 100644 --- a/units/Graf3DScene/main.pas +++ b/units/Graf3DScene/main.pas @@ -4,13 +4,9 @@ program ExampleScene; FixMath, Graf3D, Graf3DScene, Graf3DPrimitives, Graf3DStructures; var - wed3, box3, cyl3: Shape3D; - wed2, box2, cyl2: Shape3D; - wed1, box1, cyl1: Shape3D; - rec2, rec1, cir1: Shape3D; - - sta1, dwy1, dwy2, dwy3, dww1, prt1: Shape3D; + sta1, dwy1, dwy11, dwy12, dww1, cir1, rec1: Shape3D; + sta2, dwy2, dwy21, dwy22, dww2, cir2, rec2: Shape3D; begin @@ -18,36 +14,33 @@ begin SetScene3D(scene); - SetWedge3D(wed1, -100, 0, -100, 100, 100, 100); - SetBox3D(box1, 0, 0, 0, 100, 100, 100); - SetCyl3D(cyl1, 100, 0, -100, 100, 100, 100, 50); + SetStairs3D(sta1, 0, -125, -25, 100, 50, 50); + SetDoorwayWall3D(dww1, 0, 50, -50, 100, 300, 100); - SetStairs3D(sta1, 0, -100, 0, 100, 100, 100); - SetDoorway3D(dwy1, 0, 50, -50, 100, 200, 100); - SetDoorway3D(dwy2, 0, 50, -150, 100, 200, 100); - SetDoorway3D(dwy3, 0, 50, -200, 100, 200, 100); - SetDoorwayWall3D(dww1, 0, 50, -50, 100, 200, 100); - SetParticles3D(prt1, 0, 0, 100, 600, 300, 300); - - SetRect3D(rec1, 0, -150, -50, 100, 200); + SetRect3D(rec1, 0, -150, -100, 100, 200); SetRect3D(rec2, 0, 200, -150, 100, 300); - SetCircle3D(cir1, 0, 75, -50, 30); + SetCircle3D(cir1, 0, 150, -50, 100); + + SetDoorway3D(dwy1, 0, 50, -50, 100, 300, 100); + SetDoorway3D(dwy11, 0, 50, -150, 100, 300, 100); + SetDoorway3D(dwy12, 0, 50, -200, 100, 300, 100); AddShape3D(scene, @rec1); - AddShape3D(scene, @dwy3); - AddShape3D(scene, @dwy2); - TurnXShape3D(@rec1); - TurnXShape3D(@rec2); - + AddShape3D(scene, @dwy11); + AddShape3D(scene, @dwy12); AddShape3D(scene, @dww1); AddShape3D(scene, @dwy1); AddShape3D(scene, @cir1); AddShape3D(scene, @sta1); - AddShape3D(scene, @rec2); + SetCircle3D(cir2, -300, 150, -50, 100); + SetDoorway3D(dwy2, -300, 50, -50, 100, 300, 100); + SetStairs3D(sta2, -300, -125, -25, 100, 50, 50); - AddShape3D(scene, @prt1); + AddShape3D(scene, @dwy2); + AddShape3D(scene, @cir2); + AddShape3D(scene, @sta2); InitWindow;