暂存服务端渲染功能,材质渲染计划迁移至前端

This commit is contained in:
2025-12-08 17:40:28 +08:00
parent 63ca7eff0d
commit 399e6f096f
9 changed files with 2528 additions and 17 deletions

View File

@@ -0,0 +1,203 @@
package skin_renderer
import (
"image"
"image/color"
"image/png"
"os"
"testing"
)
// createTestSkin 创建一个测试用的 64x64 皮肤图像
func createTestSkin() []byte {
img := image.NewRGBA(image.Rect(0, 0, 64, 64))
// 填充一些测试颜色
// 头部区域 (8,8) - (16,16)
for y := 8; y < 16; y++ {
for x := 8; x < 16; x++ {
img.Set(x, y, image.White)
}
}
// 躯干区域 (20,20) - (28,32)
for y := 20; y < 32; y++ {
for x := 20; x < 28; x++ {
img.Set(x, y, image.Black)
}
}
// 编码为 PNG
f, _ := os.CreateTemp("", "test_skin_*.png")
defer os.Remove(f.Name())
defer f.Close()
png.Encode(f, img)
f.Seek(0, 0)
data, _ := os.ReadFile(f.Name())
return data
}
func TestSkinRenderer_Render(t *testing.T) {
skinData := createTestSkin()
if len(skinData) == 0 {
t.Skip("无法创建测试皮肤")
}
renderer := NewSkinRenderer(7.0, false, -45, -25)
result, err := renderer.Render(skinData, false)
if err != nil {
t.Fatalf("渲染失败: %v", err)
}
if result == nil {
t.Fatal("渲染结果为空")
}
bounds := result.Bounds()
if bounds.Dx() == 0 || bounds.Dy() == 0 {
t.Error("渲染结果尺寸为零")
}
t.Logf("渲染结果尺寸: %dx%d", bounds.Dx(), bounds.Dy())
}
func TestSkinRenderer_RenderHeadOnly(t *testing.T) {
skinData := createTestSkin()
if len(skinData) == 0 {
t.Skip("无法创建测试皮肤")
}
renderer := NewSkinRenderer(15.0, true, 45, -25)
result, err := renderer.Render(skinData, false)
if err != nil {
t.Fatalf("渲染头像失败: %v", err)
}
if result == nil {
t.Fatal("渲染结果为空")
}
bounds := result.Bounds()
t.Logf("头像渲染结果尺寸: %dx%d", bounds.Dx(), bounds.Dy())
}
func TestMinecraft_RenderSkin(t *testing.T) {
skinData := createTestSkin()
if len(skinData) == 0 {
t.Skip("无法创建测试皮肤")
}
mc := NewMinecraft()
result, err := mc.RenderSkin(skinData, 7.0, false)
if err != nil {
t.Fatalf("RenderSkin 失败: %v", err)
}
if result == nil {
t.Fatal("渲染结果为空")
}
bounds := result.Bounds()
t.Logf("完整皮肤渲染结果尺寸: %dx%d", bounds.Dx(), bounds.Dy())
}
func TestMinecraft_Render2DAvatar(t *testing.T) {
skinData := createTestSkin()
if len(skinData) == 0 {
t.Skip("无法创建测试皮肤")
}
mc := NewMinecraft()
result, err := mc.Render2DAvatar(skinData, 15.0)
if err != nil {
t.Fatalf("Render2DAvatar 失败: %v", err)
}
if result == nil {
t.Fatal("渲染结果为空")
}
bounds := result.Bounds()
t.Logf("2D头像渲染结果尺寸: %dx%d", bounds.Dx(), bounds.Dy())
}
func TestMinecraft_Render3DAvatar(t *testing.T) {
skinData := createTestSkin()
if len(skinData) == 0 {
t.Skip("无法创建测试皮肤")
}
mc := NewMinecraft()
result, err := mc.Render3DAvatar(skinData, 15.0)
if err != nil {
t.Fatalf("Render3DAvatar 失败: %v", err)
}
if result == nil {
t.Fatal("渲染结果为空")
}
bounds := result.Bounds()
t.Logf("3D头像渲染结果尺寸: %dx%d", bounds.Dx(), bounds.Dy())
}
func TestPoint_Project(t *testing.T) {
p := NewPoint(1, 2, 3)
var minX, maxX, minY, maxY float64
// 测试 45 度旋转
cosAlpha := 0.9063077870366499 // cos(-25°)
sinAlpha := -0.42261826174069944 // sin(-25°)
cosOmega := 0.7071067811865476 // cos(45°)
sinOmega := 0.7071067811865476 // sin(45°)
p.Project(cosAlpha, sinAlpha, cosOmega, sinOmega, &minX, &maxX, &minY, &maxY)
x, y, z := p.GetDestCoord()
t.Logf("投影结果: x=%.2f, y=%.2f, z=%.2f", x, y, z)
if !p.IsProjected() {
t.Error("点应该标记为已投影")
}
}
func TestPolygon_AddToImage(t *testing.T) {
// 创建一个简单的正方形多边形
p1 := NewPoint(0, 0, 0)
p2 := NewPoint(10, 0, 0)
p3 := NewPoint(10, 10, 0)
p4 := NewPoint(0, 10, 0)
var minX, maxX, minY, maxY float64
p1.Project(1, 0, 1, 0, &minX, &maxX, &minY, &maxY)
p2.Project(1, 0, 1, 0, &minX, &maxX, &minY, &maxY)
p3.Project(1, 0, 1, 0, &minX, &maxX, &minY, &maxY)
p4.Project(1, 0, 1, 0, &minX, &maxX, &minY, &maxY)
poly := NewPolygon([4]*Point{p1, p2, p3, p4}, color.RGBA{R: 255, G: 255, B: 255, A: 255})
img := image.NewRGBA(image.Rect(0, 0, 100, 100))
poly.AddToImage(img, minX, minY, 5.0)
// 检查是否有像素被绘制
hasPixels := false
for y := 0; y < 100; y++ {
for x := 0; x < 100; x++ {
c := img.RGBAAt(x, y)
if c.A > 0 {
hasPixels = true
break
}
}
if hasPixels {
break
}
}
if !hasPixels {
t.Error("多边形应该在图像上绘制了像素")
}
}