Hi.Sample.Webapi/Controllers/RenderingController.cs
2025-07-18 20:25:57 +08:00

173 lines
6.8 KiB
C#

using Microsoft.AspNetCore.Mvc;
using Hi.Webapi.Services;
using Hi.Disp;
using Hi.Geom;
namespace Sample.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class RenderingController : ControllerBase
{
private readonly RenderingService _renderingService;
private readonly ILogger<RenderingController> _logger;
public RenderingController(RenderingService renderingService, ILogger<RenderingController> logger)
{
_renderingService = renderingService;
_logger = logger;
}
/// <summary>
/// 獲取當前活動的渲染引擎數量
/// </summary>
[HttpGet("engines/count")]
public IActionResult GetActiveEngineCount()
{
var count = _renderingService.GetActiveEngineCount();
return Ok(new { count });
}
/// <summary>
/// 創建測試用的 3D 對象
/// </summary>
[HttpPost("test-objects/{sessionId}")]
public IActionResult CreateTestObjects(string sessionId)
{
_logger.LogInformation($"CreateTestObjects called - SessionId: {sessionId}");
try
{
var engine = _renderingService.GetOrCreateEngine(sessionId);
_logger.LogInformation($"Engine retrieved - SessionId: {sessionId}");
// 創建一個簡單的測試顯示對象
var testDisplayee = new TestDisplayee();
engine.Displayee = testDisplayee;
_logger.LogInformation($"TestDisplayee created and set - SessionId: {sessionId}");
// 觸發一次渲染
engine.IsVisible = true;
_logger.LogInformation($"Engine visibility set to true to trigger render - SessionId: {sessionId}");
return Ok(new {
message = "Test objects created successfully",
sessionId = sessionId,
timestamp = DateTime.Now
});
}
catch (Exception ex)
{
_logger.LogError(ex, $"Error creating test objects - SessionId: {sessionId}");
return StatusCode(500, new {
error = ex.Message,
sessionId = sessionId,
timestamp = DateTime.Now
});
}
}
}
/// <summary>
/// 測試用的顯示對象
/// </summary>
public class TestDisplayee : IDisplayee
{
private readonly Drawing axesDrawing;
private readonly Drawing cubeDrawing;
private readonly Drawing groundDrawing;
public TestDisplayee()
{
// 創建彩色坐標軸 (使用 CV stamp - Color + Vertex)
double[] axesData = new double[] {
// Red X-axis (color + vertex)
1, 0, 0, 0, 0, 0, // Red color, origin
1, 0, 0, 200, 0, 0, // Red color, x-axis end
// Green Y-axis (color + vertex)
0, 1, 0, 0, 0, 0, // Green color, origin
0, 1, 0, 0, 200, 0, // Green color, y-axis end
// Blue Z-axis (color + vertex)
0, 0, 1, 0, 0, 0, // Blue color, origin
0, 0, 1, 0, 0, 200 // Blue color, z-axis end
};
axesDrawing = new Drawing(axesData, Stamp.CV, Hi.Disp.GL.GL_LINES);
// 創建立方體線框 (使用 CV stamp - 帶顏色)
var size = 100.0;
var cubeData = new System.Collections.Generic.List<double>();
// 黃色立方體
var color = new[] { 1.0, 1.0, 0.0 }; // 黃色
// 底面四條線
AddColoredLine(cubeData, color, -size/2, -size/2, -size/2, size/2, -size/2, -size/2);
AddColoredLine(cubeData, color, size/2, -size/2, -size/2, size/2, size/2, -size/2);
AddColoredLine(cubeData, color, size/2, size/2, -size/2, -size/2, size/2, -size/2);
AddColoredLine(cubeData, color, -size/2, size/2, -size/2, -size/2, -size/2, -size/2);
// 頂面四條線
AddColoredLine(cubeData, color, -size/2, -size/2, size/2, size/2, -size/2, size/2);
AddColoredLine(cubeData, color, size/2, -size/2, size/2, size/2, size/2, size/2);
AddColoredLine(cubeData, color, size/2, size/2, size/2, -size/2, size/2, size/2);
AddColoredLine(cubeData, color, -size/2, size/2, size/2, -size/2, -size/2, size/2);
// 垂直線
AddColoredLine(cubeData, color, -size/2, -size/2, -size/2, -size/2, -size/2, size/2);
AddColoredLine(cubeData, color, size/2, -size/2, -size/2, size/2, -size/2, size/2);
AddColoredLine(cubeData, color, size/2, size/2, -size/2, size/2, size/2, size/2);
AddColoredLine(cubeData, color, -size/2, size/2, -size/2, -size/2, size/2, size/2);
cubeDrawing = new Drawing(cubeData.ToArray(), Stamp.CV, Hi.Disp.GL.GL_LINES);
// 創建地面網格
var gridData = new System.Collections.Generic.List<double>();
var gridColor = new[] { 0.3, 0.3, 0.3 }; // 灰色
var gridSize = 500.0;
var gridStep = 50.0;
for (double i = -gridSize; i <= gridSize; i += gridStep)
{
// X 方向的線
AddColoredLine(gridData, gridColor, i, -gridSize, 0, i, gridSize, 0);
// Y 方向的線
AddColoredLine(gridData, gridColor, -gridSize, i, 0, gridSize, i, 0);
}
groundDrawing = new Drawing(gridData.ToArray(), Stamp.CV, Hi.Disp.GL.GL_LINES);
}
private void AddColoredLine(System.Collections.Generic.List<double> data, double[] color,
double x1, double y1, double z1, double x2, double y2, double z2)
{
// 第一個點
data.Add(color[0]); data.Add(color[1]); data.Add(color[2]);
data.Add(x1); data.Add(y1); data.Add(z1);
// 第二個點
data.Add(color[0]); data.Add(color[1]); data.Add(color[2]);
data.Add(x2); data.Add(y2); data.Add(z2);
}
public void Display(Bind bind)
{
// 顯示地面網格
groundDrawing.Display(bind);
// 顯示坐標軸
axesDrawing.Display(bind);
// 顯示立方體
cubeDrawing.Display(bind);
}
public void ExpandToBox3d(Box3d box)
{
// 擴展邊界框以包含我們的測試對象
box.Expand(new Vec3d(-500, -500, -100));
box.Expand(new Vec3d(500, 500, 200));
}
}
}