1081 lines
29 KiB
Go
1081 lines
29 KiB
Go
package skin_renderer
|
||
|
||
// generatePolygons 生成所有部件的多边形
|
||
func (r *SkinRenderer) generatePolygons() {
|
||
r.polygons = make(map[string]map[string][]*Polygon)
|
||
|
||
// 初始化各部件的面
|
||
parts := []string{"helmet", "head", "torso", "rightArm", "leftArm", "rightLeg", "leftLeg"}
|
||
faces := []string{"front", "back", "top", "bottom", "right", "left"}
|
||
|
||
for _, part := range parts {
|
||
r.polygons[part] = make(map[string][]*Polygon)
|
||
for _, face := range faces {
|
||
r.polygons[part][face] = []*Polygon{}
|
||
}
|
||
}
|
||
|
||
hd := r.hdRatio
|
||
|
||
// 生成头部多边形
|
||
r.generateHeadPolygons(hd)
|
||
|
||
// 生成头盔多边形
|
||
r.generateHelmetPolygons(hd)
|
||
|
||
if !r.headOnly {
|
||
// 生成躯干多边形
|
||
r.generateTorsoPolygons(hd)
|
||
|
||
// 生成右臂多边形
|
||
r.generateRightArmPolygons(hd)
|
||
|
||
// 生成左臂多边形
|
||
r.generateLeftArmPolygons(hd)
|
||
|
||
// 生成右腿多边形
|
||
r.generateRightLegPolygons(hd)
|
||
|
||
// 生成左腿多边形
|
||
r.generateLeftLegPolygons(hd)
|
||
}
|
||
}
|
||
|
||
// generateHeadPolygons 生成头部多边形
|
||
func (r *SkinRenderer) generateHeadPolygons(hd int) {
|
||
// 创建头部体积点
|
||
volumePoints := make(map[int]map[int]map[int]*Point)
|
||
|
||
for i := 0; i <= 8*hd; i++ {
|
||
if volumePoints[i] == nil {
|
||
volumePoints[i] = make(map[int]map[int]*Point)
|
||
}
|
||
for j := 0; j <= 8*hd; j++ {
|
||
if volumePoints[i][j] == nil {
|
||
volumePoints[i][j] = make(map[int]*Point)
|
||
}
|
||
// 前后面的点
|
||
volumePoints[i][j][-2*hd] = NewPoint(float64(i), float64(j), float64(-2*hd))
|
||
volumePoints[i][j][6*hd] = NewPoint(float64(i), float64(j), float64(6*hd))
|
||
}
|
||
}
|
||
|
||
// 左右面的点
|
||
for j := 0; j <= 8*hd; j++ {
|
||
if volumePoints[0][j] == nil {
|
||
volumePoints[0][j] = make(map[int]*Point)
|
||
}
|
||
if volumePoints[8*hd][j] == nil {
|
||
volumePoints[8*hd][j] = make(map[int]*Point)
|
||
}
|
||
for k := -2 * hd; k <= 6*hd; k++ {
|
||
if volumePoints[0][j][k] == nil {
|
||
volumePoints[0][j][k] = NewPoint(0, float64(j), float64(k))
|
||
}
|
||
if volumePoints[8*hd][j][k] == nil {
|
||
volumePoints[8*hd][j][k] = NewPoint(float64(8*hd), float64(j), float64(k))
|
||
}
|
||
}
|
||
}
|
||
|
||
// 上下面的点
|
||
for i := 0; i <= 8*hd; i++ {
|
||
if volumePoints[i] == nil {
|
||
volumePoints[i] = make(map[int]map[int]*Point)
|
||
}
|
||
if volumePoints[i][0] == nil {
|
||
volumePoints[i][0] = make(map[int]*Point)
|
||
}
|
||
if volumePoints[i][8*hd] == nil {
|
||
volumePoints[i][8*hd] = make(map[int]*Point)
|
||
}
|
||
for k := -2 * hd; k <= 6*hd; k++ {
|
||
if volumePoints[i][0][k] == nil {
|
||
volumePoints[i][0][k] = NewPoint(float64(i), 0, float64(k))
|
||
}
|
||
if volumePoints[i][8*hd][k] == nil {
|
||
volumePoints[i][8*hd][k] = NewPoint(float64(i), float64(8*hd), float64(k))
|
||
}
|
||
}
|
||
}
|
||
|
||
// 生成前后面多边形
|
||
for i := 0; i < 8*hd; i++ {
|
||
for j := 0; j < 8*hd; j++ {
|
||
// 背面
|
||
r.polygons["head"]["back"] = append(r.polygons["head"]["back"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][j][-2*hd],
|
||
volumePoints[i+1][j][-2*hd],
|
||
volumePoints[i+1][j+1][-2*hd],
|
||
volumePoints[i][j+1][-2*hd],
|
||
},
|
||
r.getPixelColor((32*hd-1)-i, 8*hd+j),
|
||
))
|
||
// 正面
|
||
r.polygons["head"]["front"] = append(r.polygons["head"]["front"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][j][6*hd],
|
||
volumePoints[i+1][j][6*hd],
|
||
volumePoints[i+1][j+1][6*hd],
|
||
volumePoints[i][j+1][6*hd],
|
||
},
|
||
r.getPixelColor(8*hd+i, 8*hd+j),
|
||
))
|
||
}
|
||
}
|
||
|
||
// 生成左右面多边形
|
||
for j := 0; j < 8*hd; j++ {
|
||
for k := -2 * hd; k < 6*hd; k++ {
|
||
// 右面
|
||
r.polygons["head"]["right"] = append(r.polygons["head"]["right"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[0][j][k],
|
||
volumePoints[0][j][k+1],
|
||
volumePoints[0][j+1][k+1],
|
||
volumePoints[0][j+1][k],
|
||
},
|
||
r.getPixelColor(k+2*hd, 8*hd+j),
|
||
))
|
||
// 左面
|
||
r.polygons["head"]["left"] = append(r.polygons["head"]["left"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[8*hd][j][k],
|
||
volumePoints[8*hd][j][k+1],
|
||
volumePoints[8*hd][j+1][k+1],
|
||
volumePoints[8*hd][j+1][k],
|
||
},
|
||
r.getPixelColor((24*hd-1)-k-2*hd, 8*hd+j),
|
||
))
|
||
}
|
||
}
|
||
|
||
// 生成上下面多边形
|
||
for i := 0; i < 8*hd; i++ {
|
||
for k := -2 * hd; k < 6*hd; k++ {
|
||
// 顶面
|
||
r.polygons["head"]["top"] = append(r.polygons["head"]["top"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][0][k],
|
||
volumePoints[i+1][0][k],
|
||
volumePoints[i+1][0][k+1],
|
||
volumePoints[i][0][k+1],
|
||
},
|
||
r.getPixelColor(8*hd+i, k+2*hd),
|
||
))
|
||
// 底面
|
||
r.polygons["head"]["bottom"] = append(r.polygons["head"]["bottom"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][8*hd][k],
|
||
volumePoints[i+1][8*hd][k],
|
||
volumePoints[i+1][8*hd][k+1],
|
||
volumePoints[i][8*hd][k+1],
|
||
},
|
||
r.getPixelColor(16*hd+i, 2*hd+k),
|
||
))
|
||
}
|
||
}
|
||
}
|
||
|
||
// generateHelmetPolygons 生成头盔/第二层多边形
|
||
func (r *SkinRenderer) generateHelmetPolygons(hd int) {
|
||
// 头盔比头部稍大一点
|
||
volumePoints := make(map[int]map[int]map[int]*Point)
|
||
|
||
for i := 0; i <= 8*hd; i++ {
|
||
if volumePoints[i] == nil {
|
||
volumePoints[i] = make(map[int]map[int]*Point)
|
||
}
|
||
for j := 0; j <= 8*hd; j++ {
|
||
if volumePoints[i][j] == nil {
|
||
volumePoints[i][j] = make(map[int]*Point)
|
||
}
|
||
// 稍微放大
|
||
volumePoints[i][j][-2*hd] = NewPoint(float64(i)*9/8-0.5*float64(hd), float64(j)*9/8-0.5*float64(hd), -2.5*float64(hd))
|
||
volumePoints[i][j][6*hd] = NewPoint(float64(i)*9/8-0.5*float64(hd), float64(j)*9/8-0.5*float64(hd), 6.5*float64(hd))
|
||
}
|
||
}
|
||
|
||
for j := 0; j <= 8*hd; j++ {
|
||
if volumePoints[0][j] == nil {
|
||
volumePoints[0][j] = make(map[int]*Point)
|
||
}
|
||
if volumePoints[8*hd][j] == nil {
|
||
volumePoints[8*hd][j] = make(map[int]*Point)
|
||
}
|
||
for k := -2 * hd; k <= 6*hd; k++ {
|
||
if volumePoints[0][j][k] == nil {
|
||
volumePoints[0][j][k] = NewPoint(-0.5*float64(hd), float64(j)*9/8-0.5*float64(hd), float64(k)*9/8-0.5*float64(hd))
|
||
}
|
||
if volumePoints[8*hd][j][k] == nil {
|
||
volumePoints[8*hd][j][k] = NewPoint(8.5*float64(hd), float64(j)*9/8-0.5*float64(hd), float64(k)*9/8-0.5*float64(hd))
|
||
}
|
||
}
|
||
}
|
||
|
||
for i := 0; i <= 8*hd; i++ {
|
||
if volumePoints[i] == nil {
|
||
volumePoints[i] = make(map[int]map[int]*Point)
|
||
}
|
||
if volumePoints[i][0] == nil {
|
||
volumePoints[i][0] = make(map[int]*Point)
|
||
}
|
||
if volumePoints[i][8*hd] == nil {
|
||
volumePoints[i][8*hd] = make(map[int]*Point)
|
||
}
|
||
for k := -2 * hd; k <= 6*hd; k++ {
|
||
if volumePoints[i][0][k] == nil {
|
||
volumePoints[i][0][k] = NewPoint(float64(i)*9/8-0.5*float64(hd), -0.5*float64(hd), float64(k)*9/8-0.5*float64(hd))
|
||
}
|
||
if volumePoints[i][8*hd][k] == nil {
|
||
volumePoints[i][8*hd][k] = NewPoint(float64(i)*9/8-0.5*float64(hd), 8.5*float64(hd), float64(k)*9/8-0.5*float64(hd))
|
||
}
|
||
}
|
||
}
|
||
|
||
// 生成前后面多边形(头盔纹理偏移 32*hd)
|
||
for i := 0; i < 8*hd; i++ {
|
||
for j := 0; j < 8*hd; j++ {
|
||
r.polygons["helmet"]["back"] = append(r.polygons["helmet"]["back"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][j][-2*hd],
|
||
volumePoints[i+1][j][-2*hd],
|
||
volumePoints[i+1][j+1][-2*hd],
|
||
volumePoints[i][j+1][-2*hd],
|
||
},
|
||
r.getPixelColor(32*hd+(32*hd-1)-i, 8*hd+j),
|
||
))
|
||
r.polygons["helmet"]["front"] = append(r.polygons["helmet"]["front"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][j][6*hd],
|
||
volumePoints[i+1][j][6*hd],
|
||
volumePoints[i+1][j+1][6*hd],
|
||
volumePoints[i][j+1][6*hd],
|
||
},
|
||
r.getPixelColor(32*hd+8*hd+i, 8*hd+j),
|
||
))
|
||
}
|
||
}
|
||
|
||
for j := 0; j < 8*hd; j++ {
|
||
for k := -2 * hd; k < 6*hd; k++ {
|
||
r.polygons["helmet"]["right"] = append(r.polygons["helmet"]["right"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[0][j][k],
|
||
volumePoints[0][j][k+1],
|
||
volumePoints[0][j+1][k+1],
|
||
volumePoints[0][j+1][k],
|
||
},
|
||
r.getPixelColor(32*hd+k+2*hd, 8*hd+j),
|
||
))
|
||
r.polygons["helmet"]["left"] = append(r.polygons["helmet"]["left"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[8*hd][j][k],
|
||
volumePoints[8*hd][j][k+1],
|
||
volumePoints[8*hd][j+1][k+1],
|
||
volumePoints[8*hd][j+1][k],
|
||
},
|
||
r.getPixelColor(32*hd+(24*hd-1)-k-2*hd, 8*hd+j),
|
||
))
|
||
}
|
||
}
|
||
|
||
for i := 0; i < 8*hd; i++ {
|
||
for k := -2 * hd; k < 6*hd; k++ {
|
||
r.polygons["helmet"]["top"] = append(r.polygons["helmet"]["top"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][0][k],
|
||
volumePoints[i+1][0][k],
|
||
volumePoints[i+1][0][k+1],
|
||
volumePoints[i][0][k+1],
|
||
},
|
||
r.getPixelColor(32*hd+8*hd+i, k+2*hd),
|
||
))
|
||
r.polygons["helmet"]["bottom"] = append(r.polygons["helmet"]["bottom"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][8*hd][k],
|
||
volumePoints[i+1][8*hd][k],
|
||
volumePoints[i+1][8*hd][k+1],
|
||
volumePoints[i][8*hd][k+1],
|
||
},
|
||
r.getPixelColor(32*hd+16*hd+i, 2*hd+k),
|
||
))
|
||
}
|
||
}
|
||
}
|
||
|
||
// generateTorsoPolygons 生成躯干多边形
|
||
func (r *SkinRenderer) generateTorsoPolygons(hd int) {
|
||
volumePoints := make(map[int]map[int]map[int]*Point)
|
||
|
||
for i := 0; i <= 8*hd; i++ {
|
||
if volumePoints[i] == nil {
|
||
volumePoints[i] = make(map[int]map[int]*Point)
|
||
}
|
||
for j := 0; j <= 12*hd; j++ {
|
||
if volumePoints[i][j] == nil {
|
||
volumePoints[i][j] = make(map[int]*Point)
|
||
}
|
||
volumePoints[i][j][0] = NewPoint(float64(i), float64(j+8*hd), 0)
|
||
volumePoints[i][j][4*hd] = NewPoint(float64(i), float64(j+8*hd), float64(4*hd))
|
||
}
|
||
}
|
||
|
||
for j := 0; j <= 12*hd; j++ {
|
||
if volumePoints[0][j] == nil {
|
||
volumePoints[0][j] = make(map[int]*Point)
|
||
}
|
||
if volumePoints[8*hd][j] == nil {
|
||
volumePoints[8*hd][j] = make(map[int]*Point)
|
||
}
|
||
for k := 0; k <= 4*hd; k++ {
|
||
if volumePoints[0][j][k] == nil {
|
||
volumePoints[0][j][k] = NewPoint(0, float64(j+8*hd), float64(k))
|
||
}
|
||
if volumePoints[8*hd][j][k] == nil {
|
||
volumePoints[8*hd][j][k] = NewPoint(float64(8*hd), float64(j+8*hd), float64(k))
|
||
}
|
||
}
|
||
}
|
||
|
||
for i := 0; i <= 8*hd; i++ {
|
||
if volumePoints[i][0] == nil {
|
||
volumePoints[i][0] = make(map[int]*Point)
|
||
}
|
||
if volumePoints[i][12*hd] == nil {
|
||
volumePoints[i][12*hd] = make(map[int]*Point)
|
||
}
|
||
for k := 0; k <= 4*hd; k++ {
|
||
if volumePoints[i][0][k] == nil {
|
||
volumePoints[i][0][k] = NewPoint(float64(i), float64(8*hd), float64(k))
|
||
}
|
||
if volumePoints[i][12*hd][k] == nil {
|
||
volumePoints[i][12*hd][k] = NewPoint(float64(i), float64(12*hd+8*hd), float64(k))
|
||
}
|
||
}
|
||
}
|
||
|
||
for i := 0; i < 8*hd; i++ {
|
||
for j := 0; j < 12*hd; j++ {
|
||
r.polygons["torso"]["back"] = append(r.polygons["torso"]["back"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][j][0],
|
||
volumePoints[i+1][j][0],
|
||
volumePoints[i+1][j+1][0],
|
||
volumePoints[i][j+1][0],
|
||
},
|
||
r.getPixelColor((40*hd-1)-i, 20*hd+j),
|
||
))
|
||
r.polygons["torso"]["front"] = append(r.polygons["torso"]["front"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][j][4*hd],
|
||
volumePoints[i+1][j][4*hd],
|
||
volumePoints[i+1][j+1][4*hd],
|
||
volumePoints[i][j+1][4*hd],
|
||
},
|
||
r.getPixelColor(20*hd+i, 20*hd+j),
|
||
))
|
||
}
|
||
}
|
||
|
||
for j := 0; j < 12*hd; j++ {
|
||
for k := 0; k < 4*hd; k++ {
|
||
r.polygons["torso"]["right"] = append(r.polygons["torso"]["right"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[0][j][k],
|
||
volumePoints[0][j][k+1],
|
||
volumePoints[0][j+1][k+1],
|
||
volumePoints[0][j+1][k],
|
||
},
|
||
r.getPixelColor(16*hd+k, 20*hd+j),
|
||
))
|
||
r.polygons["torso"]["left"] = append(r.polygons["torso"]["left"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[8*hd][j][k],
|
||
volumePoints[8*hd][j][k+1],
|
||
volumePoints[8*hd][j+1][k+1],
|
||
volumePoints[8*hd][j+1][k],
|
||
},
|
||
r.getPixelColor((32*hd-1)-k, 20*hd+j),
|
||
))
|
||
}
|
||
}
|
||
|
||
for i := 0; i < 8*hd; i++ {
|
||
for k := 0; k < 4*hd; k++ {
|
||
r.polygons["torso"]["top"] = append(r.polygons["torso"]["top"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][0][k],
|
||
volumePoints[i+1][0][k],
|
||
volumePoints[i+1][0][k+1],
|
||
volumePoints[i][0][k+1],
|
||
},
|
||
r.getPixelColor(20*hd+i, 16*hd+k),
|
||
))
|
||
r.polygons["torso"]["bottom"] = append(r.polygons["torso"]["bottom"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][12*hd][k],
|
||
volumePoints[i+1][12*hd][k],
|
||
volumePoints[i+1][12*hd][k+1],
|
||
volumePoints[i][12*hd][k+1],
|
||
},
|
||
r.getPixelColor(28*hd+i, (20*hd-1)-k),
|
||
))
|
||
}
|
||
}
|
||
}
|
||
|
||
// generateRightArmPolygons 生成右臂多边形
|
||
func (r *SkinRenderer) generateRightArmPolygons(hd int) {
|
||
armWidth := 4 * hd
|
||
if r.isAlex {
|
||
armWidth = 3 * hd
|
||
}
|
||
|
||
volumePoints := make(map[int]map[int]map[int]*Point)
|
||
|
||
for i := 0; i <= armWidth; i++ {
|
||
if volumePoints[i] == nil {
|
||
volumePoints[i] = make(map[int]map[int]*Point)
|
||
}
|
||
for j := 0; j <= 12*hd; j++ {
|
||
if volumePoints[i][j] == nil {
|
||
volumePoints[i][j] = make(map[int]*Point)
|
||
}
|
||
volumePoints[i][j][0] = NewPoint(float64(i-4*hd), float64(j+8*hd), 0)
|
||
volumePoints[i][j][4*hd] = NewPoint(float64(i-4*hd), float64(j+8*hd), float64(4*hd))
|
||
}
|
||
}
|
||
|
||
for j := 0; j <= 12*hd; j++ {
|
||
if volumePoints[0][j] == nil {
|
||
volumePoints[0][j] = make(map[int]*Point)
|
||
}
|
||
if volumePoints[armWidth][j] == nil {
|
||
volumePoints[armWidth][j] = make(map[int]*Point)
|
||
}
|
||
for k := 0; k <= 4*hd; k++ {
|
||
if volumePoints[0][j][k] == nil {
|
||
volumePoints[0][j][k] = NewPoint(float64(-4*hd), float64(j+8*hd), float64(k))
|
||
}
|
||
if volumePoints[armWidth][j][k] == nil {
|
||
volumePoints[armWidth][j][k] = NewPoint(float64(armWidth-4*hd), float64(j+8*hd), float64(k))
|
||
}
|
||
}
|
||
}
|
||
|
||
for i := 0; i <= armWidth; i++ {
|
||
if volumePoints[i][0] == nil {
|
||
volumePoints[i][0] = make(map[int]*Point)
|
||
}
|
||
if volumePoints[i][12*hd] == nil {
|
||
volumePoints[i][12*hd] = make(map[int]*Point)
|
||
}
|
||
for k := 0; k <= 4*hd; k++ {
|
||
if volumePoints[i][0][k] == nil {
|
||
volumePoints[i][0][k] = NewPoint(float64(i-4*hd), float64(8*hd), float64(k))
|
||
}
|
||
if volumePoints[i][12*hd][k] == nil {
|
||
volumePoints[i][12*hd][k] = NewPoint(float64(i-4*hd), float64(12*hd+8*hd), float64(k))
|
||
}
|
||
}
|
||
}
|
||
|
||
// 前后面
|
||
for i := 0; i < armWidth; i++ {
|
||
for j := 0; j < 12*hd; j++ {
|
||
var backX, frontX int
|
||
if r.isAlex {
|
||
backX = (51*hd - 1) - i
|
||
frontX = 44*hd + i
|
||
} else {
|
||
backX = (56*hd - 1) - i
|
||
frontX = 44*hd + i
|
||
}
|
||
|
||
r.polygons["rightArm"]["back"] = append(r.polygons["rightArm"]["back"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][j][0],
|
||
volumePoints[i+1][j][0],
|
||
volumePoints[i+1][j+1][0],
|
||
volumePoints[i][j+1][0],
|
||
},
|
||
r.getPixelColor(backX, 20*hd+j),
|
||
))
|
||
r.polygons["rightArm"]["front"] = append(r.polygons["rightArm"]["front"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][j][4*hd],
|
||
volumePoints[i+1][j][4*hd],
|
||
volumePoints[i+1][j+1][4*hd],
|
||
volumePoints[i][j+1][4*hd],
|
||
},
|
||
r.getPixelColor(frontX, 20*hd+j),
|
||
))
|
||
}
|
||
}
|
||
|
||
// 左右面
|
||
for j := 0; j < 12*hd; j++ {
|
||
for k := 0; k < 4*hd; k++ {
|
||
var rightOffsetX, leftOffsetX int
|
||
if r.isAlex {
|
||
rightOffsetX = 47 * hd
|
||
leftOffsetX = 40 * hd
|
||
} else {
|
||
rightOffsetX = 40 * hd
|
||
leftOffsetX = 52 * hd
|
||
}
|
||
|
||
r.polygons["rightArm"]["right"] = append(r.polygons["rightArm"]["right"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[0][j][k],
|
||
volumePoints[0][j][k+1],
|
||
volumePoints[0][j+1][k+1],
|
||
volumePoints[0][j+1][k],
|
||
},
|
||
r.getPixelColor(rightOffsetX+k, 20*hd+j),
|
||
))
|
||
r.polygons["rightArm"]["left"] = append(r.polygons["rightArm"]["left"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[armWidth][j][k],
|
||
volumePoints[armWidth][j][k+1],
|
||
volumePoints[armWidth][j+1][k+1],
|
||
volumePoints[armWidth][j+1][k],
|
||
},
|
||
r.getPixelColor((leftOffsetX-1)-k, 20*hd+j),
|
||
))
|
||
}
|
||
}
|
||
|
||
// 上下面
|
||
for i := 0; i < armWidth; i++ {
|
||
for k := 0; k < 4*hd; k++ {
|
||
var topX, bottomX int
|
||
if r.isAlex {
|
||
topX = 44*hd + i
|
||
bottomX = 47*hd + i
|
||
} else {
|
||
topX = 44*hd + i
|
||
bottomX = 48*hd + i
|
||
}
|
||
|
||
r.polygons["rightArm"]["top"] = append(r.polygons["rightArm"]["top"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][0][k],
|
||
volumePoints[i+1][0][k],
|
||
volumePoints[i+1][0][k+1],
|
||
volumePoints[i][0][k+1],
|
||
},
|
||
r.getPixelColor(topX, 16*hd+k),
|
||
))
|
||
r.polygons["rightArm"]["bottom"] = append(r.polygons["rightArm"]["bottom"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][12*hd][k],
|
||
volumePoints[i+1][12*hd][k],
|
||
volumePoints[i+1][12*hd][k+1],
|
||
volumePoints[i][12*hd][k+1],
|
||
},
|
||
r.getPixelColor(bottomX, 16*hd+k),
|
||
))
|
||
}
|
||
}
|
||
}
|
||
|
||
// generateLeftArmPolygons 生成左臂多边形
|
||
func (r *SkinRenderer) generateLeftArmPolygons(hd int) {
|
||
armWidth := 4 * hd
|
||
if r.isAlex {
|
||
armWidth = 3 * hd
|
||
}
|
||
|
||
volumePoints := make(map[int]map[int]map[int]*Point)
|
||
|
||
for i := 0; i <= armWidth; i++ {
|
||
if volumePoints[i] == nil {
|
||
volumePoints[i] = make(map[int]map[int]*Point)
|
||
}
|
||
for j := 0; j <= 12*hd; j++ {
|
||
if volumePoints[i][j] == nil {
|
||
volumePoints[i][j] = make(map[int]*Point)
|
||
}
|
||
volumePoints[i][j][0] = NewPoint(float64(i+8*hd), float64(j+8*hd), 0)
|
||
volumePoints[i][j][4*hd] = NewPoint(float64(i+8*hd), float64(j+8*hd), float64(4*hd))
|
||
}
|
||
}
|
||
|
||
for j := 0; j <= 12*hd; j++ {
|
||
if volumePoints[0][j] == nil {
|
||
volumePoints[0][j] = make(map[int]*Point)
|
||
}
|
||
if volumePoints[armWidth][j] == nil {
|
||
volumePoints[armWidth][j] = make(map[int]*Point)
|
||
}
|
||
for k := 0; k <= 4*hd; k++ {
|
||
if volumePoints[0][j][k] == nil {
|
||
volumePoints[0][j][k] = NewPoint(float64(8*hd), float64(j+8*hd), float64(k))
|
||
}
|
||
if volumePoints[armWidth][j][k] == nil {
|
||
volumePoints[armWidth][j][k] = NewPoint(float64(armWidth+8*hd), float64(j+8*hd), float64(k))
|
||
}
|
||
}
|
||
}
|
||
|
||
for i := 0; i <= armWidth; i++ {
|
||
if volumePoints[i][0] == nil {
|
||
volumePoints[i][0] = make(map[int]*Point)
|
||
}
|
||
if volumePoints[i][12*hd] == nil {
|
||
volumePoints[i][12*hd] = make(map[int]*Point)
|
||
}
|
||
for k := 0; k <= 4*hd; k++ {
|
||
if volumePoints[i][0][k] == nil {
|
||
volumePoints[i][0][k] = NewPoint(float64(i+8*hd), float64(8*hd), float64(k))
|
||
}
|
||
if volumePoints[i][12*hd][k] == nil {
|
||
volumePoints[i][12*hd][k] = NewPoint(float64(i+8*hd), float64(12*hd+8*hd), float64(k))
|
||
}
|
||
}
|
||
}
|
||
|
||
// 前后面
|
||
for i := 0; i < armWidth; i++ {
|
||
for j := 0; j < 12*hd; j++ {
|
||
var color1, color2 int
|
||
|
||
if r.isAlex {
|
||
color1 = 43*hd + i
|
||
color2 = 36*hd + i
|
||
r.polygons["leftArm"]["back"] = append(r.polygons["leftArm"]["back"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][j][0],
|
||
volumePoints[i+1][j][0],
|
||
volumePoints[i+1][j+1][0],
|
||
volumePoints[i][j+1][0],
|
||
},
|
||
r.getPixelColor(color1, 52*hd+j),
|
||
))
|
||
r.polygons["leftArm"]["front"] = append(r.polygons["leftArm"]["front"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][j][4*hd],
|
||
volumePoints[i+1][j][4*hd],
|
||
volumePoints[i+1][j+1][4*hd],
|
||
volumePoints[i][j+1][4*hd],
|
||
},
|
||
r.getPixelColor(color2, 52*hd+j),
|
||
))
|
||
} else {
|
||
if r.isNewSkinType {
|
||
color1 = 47*hd - i // from right to left
|
||
color2 = 36*hd + i // from left to right
|
||
r.polygons["leftArm"]["back"] = append(r.polygons["leftArm"]["back"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][j][0],
|
||
volumePoints[i+1][j][0],
|
||
volumePoints[i+1][j+1][0],
|
||
volumePoints[i][j+1][0],
|
||
},
|
||
r.getPixelColor(color1, 52*hd+j),
|
||
))
|
||
r.polygons["leftArm"]["front"] = append(r.polygons["leftArm"]["front"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][j][4*hd],
|
||
volumePoints[i+1][j][4*hd],
|
||
volumePoints[i+1][j+1][4*hd],
|
||
volumePoints[i][j+1][4*hd],
|
||
},
|
||
r.getPixelColor(color2, 52*hd+j),
|
||
))
|
||
} else {
|
||
// 旧版皮肤镜像右臂
|
||
color1 = (56*hd - 1) - ((4*hd - 1) - i)
|
||
color2 = 44*hd + ((4*hd - 1) - i)
|
||
r.polygons["leftArm"]["back"] = append(r.polygons["leftArm"]["back"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][j][0],
|
||
volumePoints[i+1][j][0],
|
||
volumePoints[i+1][j+1][0],
|
||
volumePoints[i][j+1][0],
|
||
},
|
||
r.getPixelColor(color1, 20*hd+j),
|
||
))
|
||
r.polygons["leftArm"]["front"] = append(r.polygons["leftArm"]["front"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][j][4*hd],
|
||
volumePoints[i+1][j][4*hd],
|
||
volumePoints[i+1][j+1][4*hd],
|
||
volumePoints[i][j+1][4*hd],
|
||
},
|
||
r.getPixelColor(color2, 20*hd+j),
|
||
))
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// 左右面
|
||
for j := 0; j < 12*hd; j++ {
|
||
for k := 0; k < 4*hd; k++ {
|
||
var color1X, color2X, color1Y, color2Y int
|
||
|
||
if r.isNewSkinType {
|
||
color1X = 32*hd + k
|
||
color2X = 43*hd - k
|
||
color1Y = 52*hd + j
|
||
color2Y = 52*hd + j
|
||
} else {
|
||
color1X = 40*hd + ((4*hd - 1) - k)
|
||
color2X = (52*hd - 1) - ((4*hd - 1) - k)
|
||
color1Y = 20*hd + j
|
||
color2Y = 20*hd + j
|
||
}
|
||
|
||
r.polygons["leftArm"]["right"] = append(r.polygons["leftArm"]["right"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[0][j][k],
|
||
volumePoints[0][j][k+1],
|
||
volumePoints[0][j+1][k+1],
|
||
volumePoints[0][j+1][k],
|
||
},
|
||
r.getPixelColor(color1X, color1Y),
|
||
))
|
||
r.polygons["leftArm"]["left"] = append(r.polygons["leftArm"]["left"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[armWidth][j][k],
|
||
volumePoints[armWidth][j][k+1],
|
||
volumePoints[armWidth][j+1][k+1],
|
||
volumePoints[armWidth][j+1][k],
|
||
},
|
||
r.getPixelColor(color2X, color2Y),
|
||
))
|
||
}
|
||
}
|
||
|
||
// 上下面
|
||
for i := 0; i < armWidth; i++ {
|
||
for k := 0; k < 4*hd; k++ {
|
||
var topX, topY, bottomX, bottomY int
|
||
|
||
if r.isAlex {
|
||
topX = 36*hd + i
|
||
topY = 48*hd + k
|
||
bottomX = 39*hd + i
|
||
bottomY = 48*hd + k
|
||
} else if r.isNewSkinType {
|
||
topX = 36*hd + i
|
||
topY = 48*hd + k
|
||
bottomX = 40*hd + i
|
||
bottomY = 48*hd + k
|
||
} else {
|
||
topX = 44*hd + ((4*hd - 1) - i)
|
||
topY = 16*hd + k
|
||
bottomX = 48*hd + ((4*hd - 1) - i)
|
||
bottomY = (20*hd - 1) - k
|
||
}
|
||
|
||
r.polygons["leftArm"]["top"] = append(r.polygons["leftArm"]["top"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][0][k],
|
||
volumePoints[i+1][0][k],
|
||
volumePoints[i+1][0][k+1],
|
||
volumePoints[i][0][k+1],
|
||
},
|
||
r.getPixelColor(topX, topY),
|
||
))
|
||
r.polygons["leftArm"]["bottom"] = append(r.polygons["leftArm"]["bottom"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][12*hd][k],
|
||
volumePoints[i+1][12*hd][k],
|
||
volumePoints[i+1][12*hd][k+1],
|
||
volumePoints[i][12*hd][k+1],
|
||
},
|
||
r.getPixelColor(bottomX, bottomY),
|
||
))
|
||
}
|
||
}
|
||
}
|
||
|
||
// generateRightLegPolygons 生成右腿多边形
|
||
func (r *SkinRenderer) generateRightLegPolygons(hd int) {
|
||
volumePoints := make(map[int]map[int]map[int]*Point)
|
||
|
||
for i := 0; i <= 4*hd; i++ {
|
||
if volumePoints[i] == nil {
|
||
volumePoints[i] = make(map[int]map[int]*Point)
|
||
}
|
||
for j := 0; j <= 12*hd; j++ {
|
||
if volumePoints[i][j] == nil {
|
||
volumePoints[i][j] = make(map[int]*Point)
|
||
}
|
||
volumePoints[i][j][0] = NewPoint(float64(i), float64(j+20*hd), 0)
|
||
volumePoints[i][j][4*hd] = NewPoint(float64(i), float64(j+20*hd), float64(4*hd))
|
||
}
|
||
}
|
||
|
||
for j := 0; j <= 12*hd; j++ {
|
||
if volumePoints[0][j] == nil {
|
||
volumePoints[0][j] = make(map[int]*Point)
|
||
}
|
||
if volumePoints[4*hd][j] == nil {
|
||
volumePoints[4*hd][j] = make(map[int]*Point)
|
||
}
|
||
for k := 0; k <= 4*hd; k++ {
|
||
if volumePoints[0][j][k] == nil {
|
||
volumePoints[0][j][k] = NewPoint(0, float64(j+20*hd), float64(k))
|
||
}
|
||
if volumePoints[4*hd][j][k] == nil {
|
||
volumePoints[4*hd][j][k] = NewPoint(float64(4*hd), float64(j+20*hd), float64(k))
|
||
}
|
||
}
|
||
}
|
||
|
||
for i := 0; i <= 4*hd; i++ {
|
||
if volumePoints[i][0] == nil {
|
||
volumePoints[i][0] = make(map[int]*Point)
|
||
}
|
||
if volumePoints[i][12*hd] == nil {
|
||
volumePoints[i][12*hd] = make(map[int]*Point)
|
||
}
|
||
for k := 0; k <= 4*hd; k++ {
|
||
if volumePoints[i][0][k] == nil {
|
||
volumePoints[i][0][k] = NewPoint(float64(i), float64(20*hd), float64(k))
|
||
}
|
||
if volumePoints[i][12*hd][k] == nil {
|
||
volumePoints[i][12*hd][k] = NewPoint(float64(i), float64(12*hd+20*hd), float64(k))
|
||
}
|
||
}
|
||
}
|
||
|
||
for i := 0; i < 4*hd; i++ {
|
||
for j := 0; j < 12*hd; j++ {
|
||
r.polygons["rightLeg"]["back"] = append(r.polygons["rightLeg"]["back"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][j][0],
|
||
volumePoints[i+1][j][0],
|
||
volumePoints[i+1][j+1][0],
|
||
volumePoints[i][j+1][0],
|
||
},
|
||
r.getPixelColor((16*hd-1)-i, 20*hd+j),
|
||
))
|
||
r.polygons["rightLeg"]["front"] = append(r.polygons["rightLeg"]["front"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][j][4*hd],
|
||
volumePoints[i+1][j][4*hd],
|
||
volumePoints[i+1][j+1][4*hd],
|
||
volumePoints[i][j+1][4*hd],
|
||
},
|
||
r.getPixelColor(4*hd+i, 20*hd+j),
|
||
))
|
||
}
|
||
}
|
||
|
||
for j := 0; j < 12*hd; j++ {
|
||
for k := 0; k < 4*hd; k++ {
|
||
r.polygons["rightLeg"]["right"] = append(r.polygons["rightLeg"]["right"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[0][j][k],
|
||
volumePoints[0][j][k+1],
|
||
volumePoints[0][j+1][k+1],
|
||
volumePoints[0][j+1][k],
|
||
},
|
||
r.getPixelColor(k, 20*hd+j),
|
||
))
|
||
r.polygons["rightLeg"]["left"] = append(r.polygons["rightLeg"]["left"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[4*hd][j][k],
|
||
volumePoints[4*hd][j][k+1],
|
||
volumePoints[4*hd][j+1][k+1],
|
||
volumePoints[4*hd][j+1][k],
|
||
},
|
||
r.getPixelColor((12*hd-1)-k, 20*hd+j),
|
||
))
|
||
}
|
||
}
|
||
|
||
for i := 0; i < 4*hd; i++ {
|
||
for k := 0; k < 4*hd; k++ {
|
||
r.polygons["rightLeg"]["top"] = append(r.polygons["rightLeg"]["top"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][0][k],
|
||
volumePoints[i+1][0][k],
|
||
volumePoints[i+1][0][k+1],
|
||
volumePoints[i][0][k+1],
|
||
},
|
||
r.getPixelColor(4*hd+i, 16*hd+k),
|
||
))
|
||
r.polygons["rightLeg"]["bottom"] = append(r.polygons["rightLeg"]["bottom"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][12*hd][k],
|
||
volumePoints[i+1][12*hd][k],
|
||
volumePoints[i+1][12*hd][k+1],
|
||
volumePoints[i][12*hd][k+1],
|
||
},
|
||
r.getPixelColor(8*hd+i, 16*hd+k),
|
||
))
|
||
}
|
||
}
|
||
}
|
||
|
||
// generateLeftLegPolygons 生成左腿多边形
|
||
func (r *SkinRenderer) generateLeftLegPolygons(hd int) {
|
||
volumePoints := make(map[int]map[int]map[int]*Point)
|
||
|
||
for i := 0; i <= 4*hd; i++ {
|
||
if volumePoints[i] == nil {
|
||
volumePoints[i] = make(map[int]map[int]*Point)
|
||
}
|
||
for j := 0; j <= 12*hd; j++ {
|
||
if volumePoints[i][j] == nil {
|
||
volumePoints[i][j] = make(map[int]*Point)
|
||
}
|
||
volumePoints[i][j][0] = NewPoint(float64(i+4*hd), float64(j+20*hd), 0)
|
||
volumePoints[i][j][4*hd] = NewPoint(float64(i+4*hd), float64(j+20*hd), float64(4*hd))
|
||
}
|
||
}
|
||
|
||
for j := 0; j <= 12*hd; j++ {
|
||
if volumePoints[0][j] == nil {
|
||
volumePoints[0][j] = make(map[int]*Point)
|
||
}
|
||
if volumePoints[4*hd][j] == nil {
|
||
volumePoints[4*hd][j] = make(map[int]*Point)
|
||
}
|
||
for k := 0; k <= 4*hd; k++ {
|
||
if volumePoints[0][j][k] == nil {
|
||
volumePoints[0][j][k] = NewPoint(float64(4*hd), float64(j+20*hd), float64(k))
|
||
}
|
||
if volumePoints[4*hd][j][k] == nil {
|
||
volumePoints[4*hd][j][k] = NewPoint(float64(4*hd+4*hd), float64(j+20*hd), float64(k))
|
||
}
|
||
}
|
||
}
|
||
|
||
for i := 0; i <= 4*hd; i++ {
|
||
if volumePoints[i][0] == nil {
|
||
volumePoints[i][0] = make(map[int]*Point)
|
||
}
|
||
if volumePoints[i][12*hd] == nil {
|
||
volumePoints[i][12*hd] = make(map[int]*Point)
|
||
}
|
||
for k := 0; k <= 4*hd; k++ {
|
||
if volumePoints[i][0][k] == nil {
|
||
volumePoints[i][0][k] = NewPoint(float64(i+4*hd), float64(20*hd), float64(k))
|
||
}
|
||
if volumePoints[i][12*hd][k] == nil {
|
||
volumePoints[i][12*hd][k] = NewPoint(float64(i+4*hd), float64(12*hd+20*hd), float64(k))
|
||
}
|
||
}
|
||
}
|
||
|
||
for i := 0; i < 4*hd; i++ {
|
||
for j := 0; j < 12*hd; j++ {
|
||
var color1X, color2X, color1Y, color2Y int
|
||
|
||
if r.isNewSkinType {
|
||
color1X = 31*hd - i // from right to left
|
||
color2X = 20*hd + i // from left to right
|
||
color1Y = 52*hd + j
|
||
color2Y = 52*hd + j
|
||
} else {
|
||
color1X = (16*hd - 1) - ((4*hd - 1) - i)
|
||
color2X = 4*hd + ((4*hd - 1) - i)
|
||
color1Y = 20*hd + j
|
||
color2Y = 20*hd + j
|
||
}
|
||
|
||
r.polygons["leftLeg"]["back"] = append(r.polygons["leftLeg"]["back"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][j][0],
|
||
volumePoints[i+1][j][0],
|
||
volumePoints[i+1][j+1][0],
|
||
volumePoints[i][j+1][0],
|
||
},
|
||
r.getPixelColor(color1X, color1Y),
|
||
))
|
||
r.polygons["leftLeg"]["front"] = append(r.polygons["leftLeg"]["front"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][j][4*hd],
|
||
volumePoints[i+1][j][4*hd],
|
||
volumePoints[i+1][j+1][4*hd],
|
||
volumePoints[i][j+1][4*hd],
|
||
},
|
||
r.getPixelColor(color2X, color2Y),
|
||
))
|
||
}
|
||
}
|
||
|
||
for j := 0; j < 12*hd; j++ {
|
||
for k := 0; k < 4*hd; k++ {
|
||
var color1X, color2X, color1Y, color2Y int
|
||
|
||
if r.isNewSkinType {
|
||
color1X = 16*hd + k // from left to right
|
||
color2X = 27*hd - k // from right to left
|
||
color1Y = 52*hd + j
|
||
color2Y = 52*hd + j
|
||
} else {
|
||
color1X = ((4*hd - 1) - k)
|
||
color2X = (12*hd - 1) - ((4*hd - 1) - k)
|
||
color1Y = 20*hd + j
|
||
color2Y = 20*hd + j
|
||
}
|
||
|
||
r.polygons["leftLeg"]["right"] = append(r.polygons["leftLeg"]["right"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[0][j][k],
|
||
volumePoints[0][j][k+1],
|
||
volumePoints[0][j+1][k+1],
|
||
volumePoints[0][j+1][k],
|
||
},
|
||
r.getPixelColor(color1X, color1Y),
|
||
))
|
||
r.polygons["leftLeg"]["left"] = append(r.polygons["leftLeg"]["left"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[4*hd][j][k],
|
||
volumePoints[4*hd][j][k+1],
|
||
volumePoints[4*hd][j+1][k+1],
|
||
volumePoints[4*hd][j+1][k],
|
||
},
|
||
r.getPixelColor(color2X, color2Y),
|
||
))
|
||
}
|
||
}
|
||
|
||
for i := 0; i < 4*hd; i++ {
|
||
for k := 0; k < 4*hd; k++ {
|
||
var topX, topY, bottomX, bottomY int
|
||
|
||
if r.isNewSkinType {
|
||
topX = 20*hd + i
|
||
topY = 48*hd + k
|
||
bottomX = 24*hd + i
|
||
bottomY = 48*hd + k
|
||
} else {
|
||
topX = 4*hd + ((4*hd - 1) - i)
|
||
topY = 16*hd + k
|
||
bottomX = 8*hd + ((4*hd - 1) - i)
|
||
bottomY = (20*hd - 1) - k
|
||
}
|
||
|
||
r.polygons["leftLeg"]["top"] = append(r.polygons["leftLeg"]["top"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][0][k],
|
||
volumePoints[i+1][0][k],
|
||
volumePoints[i+1][0][k+1],
|
||
volumePoints[i][0][k+1],
|
||
},
|
||
r.getPixelColor(topX, topY),
|
||
))
|
||
r.polygons["leftLeg"]["bottom"] = append(r.polygons["leftLeg"]["bottom"], NewPolygon(
|
||
[4]*Point{
|
||
volumePoints[i][12*hd][k],
|
||
volumePoints[i+1][12*hd][k],
|
||
volumePoints[i+1][12*hd][k+1],
|
||
volumePoints[i][12*hd][k+1],
|
||
},
|
||
r.getPixelColor(bottomX, bottomY),
|
||
))
|
||
}
|
||
}
|
||
}
|