فهرست منبع

Demonstrating occluders in the cube example.

David Piuva 4 سال پیش
والد
کامیت
08ec060645
3فایلهای تغییر یافته به همراه38 افزوده شده و 7 حذف شده
  1. 3 3
      Source/DFPSR/api/modelAPI.cpp
  2. 16 3
      Source/SDK/cube/main.cpp
  3. 19 1
      Source/SDK/cube/media/interface.lof

+ 3 - 3
Source/DFPSR/api/modelAPI.cpp

@@ -463,7 +463,7 @@ public:
 						this->debugLines.pushConstruct(
 						  edgeCorners[p].flat.x / constants::unitsPerPixel, edgeCorners[p].flat.y / constants::unitsPerPixel,
 						  edgeCorners[q].flat.x / constants::unitsPerPixel, edgeCorners[q].flat.y / constants::unitsPerPixel,
-						  ColorRgbaI32(64, 128, 128, 255)
+						  ColorRgbaI32(0, 255, 255, 255)
 						);
 					}
 				}
@@ -480,7 +480,7 @@ public:
 		if (image_exists(this->colorBuffer)) {
 			// Debug drawn triangles
 			if (debugWireframe) {
-				if (image_exists(this->depthGrid)) {
+				/*if (image_exists(this->depthGrid)) {
 					for (int cellY = 0; cellY < this->gridHeight; cellY++) {
 						for (int cellX = 0; cellX < this->gridWidth; cellX++) {
 							float depth = image_readPixel_clamp(this->depthGrid, cellX, cellY);
@@ -490,7 +490,7 @@ public:
 							}
 						}
 					}
-				}
+				}*/
 				for (int t = 0; t < this->commandQueue.buffer.length(); t++) {
 					if (!this->commandQueue.buffer[t].occluded) {
 						ITriangle2D *triangle = &(this->commandQueue.buffer[t].triangle);

+ 16 - 3
Source/SDK/cube/main.cpp

@@ -12,6 +12,8 @@ float distance = 4.0f;
 bool running = true;
 bool useOrthogonalCamera = false;
 bool useDepthBuffer = true;
+bool debugDrawnTriangles = false;
+bool debugOccluders = false;
 
 // The window handle
 Window window;
@@ -73,6 +75,8 @@ int main(int argn, char **argv) {
 	Component mainPanel = window_findComponentByName(window, U"mainPanel", true);
 	Component buttonA = window_findComponentByName(window, U"buttonA", true);
 	Component buttonB = window_findComponentByName(window, U"buttonB", true);
+	Component buttonC = window_findComponentByName(window, U"buttonC", true);
+	Component buttonD = window_findComponentByName(window, U"buttonD", true);
 
 	// Connect components with actions
 	component_setMouseMoveEvent(mainPanel, [](const MouseEvent& event) {
@@ -84,6 +88,12 @@ int main(int argn, char **argv) {
 	component_setPressedEvent(buttonB, []() {
 		useDepthBuffer = !useDepthBuffer;
 	});
+	component_setPressedEvent(buttonC, []() {
+		debugOccluders = !debugOccluders;
+	});
+	component_setPressedEvent(buttonD, []() {
+		debugDrawnTriangles = !debugDrawnTriangles;
+	});
 
 	// Create a cube model
 	Model cubeModel = createCubeModel(FVector3D(-0.5f), FVector3D(0.5f));
@@ -147,17 +157,20 @@ int main(int argn, char **argv) {
 		ImageF32 depth = useDepthBuffer ? depthBuffer : ImageF32();
 		// Begin render batch
 		renderer_begin(worker, colorBuffer, depth);
+		// Occluders
+		//   An occluder box is placed inside of the crate where it will not be seen
+		renderer_occludeFromBox(worker, FVector3D(-0.15f, -0.15f, -0.15f), FVector3D(0.15f, 0.15f, 0.15f), crateLocation, camera, debugOccluders);
 		// Solid geometry
 		renderer_giveTask(worker, crateModel, crateLocation, camera);
 		renderer_giveTask(worker, barrelModel, barrelLocation, camera);
 		renderer_giveTask(worker, testModel, testLocation, camera);
 		// Use triangles as occluders
-		//   The occlusion system knows that only solid triangles occlude, but including them would be redundant work
-		renderer_occludeFromExistingTriangles(worker);
+		//   This simpler approach to occlusion is not nearly as efficient as full shapes, but without the added work of placing occluders
+		//renderer_occludeFromExistingTriangles(worker);
 		// Filtered geometry
 		renderer_giveTask(worker, cubeModel, cubeLocation, camera);
 		// Complete render batch
-		renderer_end(worker);
+		renderer_end(worker, debugDrawnTriangles);
 		printText("Draw world: ", (time_getSeconds() - startTime) * 1000.0, " ms\n");
 
 		startTime = time_getSeconds();

+ 19 - 1
Source/SDK/cube/media/interface.lof

@@ -5,7 +5,7 @@
 		Name = "sidePanel"
 		Left = "+10"
 		Top = "+10"
-		Right = "+100"
+		Right = "+120"
 		Bottom = "100%-10"
 		Solid = 1
 		Color = "100,100,100"
@@ -27,6 +27,24 @@
 			Bottom = "+100"
 			Color = "200,200,200"
 		End
+		Begin : Button
+			Name = "buttonC"
+			Text = "Occluders"
+			Left = "+10"
+			Top = "+110"
+			Right = "100%-10"
+			Bottom = "+150"
+			Color = "200,200,200"
+		End
+		Begin : Button
+			Name = "buttonD"
+			Text = "Triangles"
+			Left = "+10"
+			Top = "+160"
+			Right = "100%-10"
+			Bottom = "+200"
+			Color = "200,200,200"
+		End
 	End
 End