Allow float sizes in modded entity format

This commit is contained in:
JannisX11 2023-02-16 21:37:47 +01:00
parent 006d8aa361
commit 291fbd31fb
6 changed files with 28 additions and 121 deletions

View File

@ -231,6 +231,7 @@ class ModelFormat {
new Property(ModelFormat, 'boolean', 'box_uv');
new Property(ModelFormat, 'boolean', 'optional_box_uv');
new Property(ModelFormat, 'boolean', 'box_uv_float_size');
new Property(ModelFormat, 'boolean', 'single_texture');
new Property(ModelFormat, 'boolean', 'model_identifier', {default: true});
new Property(ModelFormat, 'boolean', 'parent_model_id');

View File

@ -471,9 +471,9 @@ var codec = new Codec('modded_entity', {
} else {
c_snippet = c_snippet
.replace(R('dx'), F(cube.size(0, true)) )
.replace(R('dy'), F(cube.size(1, true)) )
.replace(R('dz'), F(cube.size(2, true)) )
.replace(R('dx'), F(cube.size(0, false)) )
.replace(R('dy'), F(cube.size(1, false)) )
.replace(R('dz'), F(cube.size(2, false)) )
}
cube_snippets.push(c_snippet);
@ -884,13 +884,14 @@ var format = new ModelFormat({
},
codec,
box_uv: true,
box_uv_float_size: true,
single_texture: true,
bone_rig: true,
centered_grid: true,
rotate_cubes: true,
integer_size: true
})
//Object.defineProperty(format, 'integer_size', {get: _ => Templates.get('integer_size')})
Object.defineProperty(format, 'integer_size', {get: _ => Templates.get('integer_size')});
codec.format = format;

View File

@ -187,8 +187,12 @@ class Cube extends OutlinerElement {
var scope = this;
let epsilon = 0.0000001;
function getA(axis) {
if (floored) {
if (floored == true) {
return Math.floor(scope.to[axis] - scope.from[axis] + epsilon);
} else if (floored == 'box_uv' && Format.box_uv_float_size != true) {
return Math.floor(scope.to[axis] - scope.from[axis] + epsilon);
} else {
return scope.to[axis] - scope.from[axis]
}
@ -1005,7 +1009,7 @@ new NodePreviewController(Cube, {
if (element.box_uv) {
var size = element.size(undefined, true)
var size = element.size(undefined, Format.box_uv_float_size != true);
var face_list = [
{face: 'east', from: [0, size[2]], size: [size[2], size[1]]},

View File

@ -1214,107 +1214,7 @@ const Canvas = {
},
updateUV(cube, animation = true) {
// Deprecated
var mesh = cube.mesh
if (mesh === undefined || !mesh.geometry) return;
if (cube.box_uv) {
var size = cube.size(undefined, true)
var face_list = [
{face: 'east', from: [0, size[2]], size: [size[2], size[1]]},
{face: 'west', from: [size[2] + size[0], size[2]], size: [size[2], size[1]]},
{face: 'up', from: [size[2]+size[0], size[2]], size: [-size[0], -size[2]]},
{face: 'down', from: [size[2]+size[0]*2, 0], size: [-size[0], size[2]]},
{face: 'south', from: [size[2]*2 + size[0], size[2]], size: [size[0], size[1]]},
{face: 'north', from: [size[2], size[2]], size: [size[0], size[1]]},
]
if (cube.mirror_uv) {
face_list.forEach(function(f) {
f.from[0] += f.size[0]
f.size[0] *= -1
})
//East+West
var p = {}
p.from = face_list[0].from.slice()
p.size = face_list[0].size.slice()
face_list[0].from = face_list[1].from.slice()
face_list[0].size = face_list[1].size.slice()
face_list[1].from = p.from.slice()
face_list[1].size = p.size.slice()
}
face_list.forEach(function(f, fIndex) {
if (cube.faces[f.face].texture === null) return;
var uv= [
f.from[0] + cube.uv_offset[0],
f.from[1] + cube.uv_offset[1],
f.from[0] + f.size[0] + cube.uv_offset[0],
f.from[1] + f.size[1] + cube.uv_offset[1]
]
uv.forEach(function(s, si) {
uv[si] *= 1
})
cube.faces[f.face].uv[0] = uv[0]
cube.faces[f.face].uv[1] = uv[1]
cube.faces[f.face].uv[2] = uv[2]
cube.faces[f.face].uv[3] = uv[3]
//Fight Bleeding
for (var si = 0; si < 2; si++) {
let margin = 1/64;
if (uv[si] > uv[si+2]) {
margin = -margin
}
uv[si] += margin
uv[si+2] -= margin
}
stretch = 1;
frame = 0;
let tex = cube.faces[f.face].getTexture();
if (tex instanceof Texture && tex.frameCount !== 1) {
stretch = tex.frameCount
if (animation === true && tex.currentFrame) {
frame = tex.currentFrame
}
}
Canvas.updateUVFace(mesh.geometry.attributes.uv, fIndex, {uv: uv}, frame, stretch)
})
} else {
var stretch = 1
var frame = 0
Canvas.face_order.forEach((face, fIndex) => {
if (cube.faces[face].texture === null) return;
stretch = 1;
frame = 0;
let tex = cube.faces[face].getTexture();
if (tex instanceof Texture && tex.frameCount !== 1) {
stretch = tex.frameCount
if (animation === true && tex.currentFrame) {
frame = tex.currentFrame
}
}
Canvas.updateUVFace(mesh.geometry.attributes.uv, fIndex, cube.faces[face], frame, stretch)
})
}
mesh.geometry.attributes.uv.needsUpdate = true;
return mesh.geometry
return Cube.preview_controller.updateUV(cube, animation);
},
updateUVFace(vertex_uvs, index, face, frame = 0, stretch = 1) {
stretch *= -1;

View File

@ -176,13 +176,14 @@ const TextureGenerator = {
},
//constructors
boxUVCubeTemplate: function(obj, min_size) {
this.x = obj.size(0, true) || min_size;
this.y = obj.size(1, 'template') || min_size;
this.z = obj.size(2, true) || min_size;
let floor_uv = Format.box_uv_float_size != true;
this.x = Math.round(obj.size(0, floor_uv)) || min_size;
this.y = Math.round(obj.size(1, floor_uv)) || min_size;
this.z = Math.round(obj.size(2, floor_uv)) || min_size;
this.posx = obj.uv_offset[0];
this.posy = obj.uv_offset[1];
this.obj = obj;
this.template_size = (obj.size(2, true) + obj.size(1, 'template'))+ (obj.size(2, true) + obj.size(0, true))*2;
this.template_size = (obj.size(2, floor_uv) + obj.size(1, floor_uv))+ (obj.size(2, floor_uv) + obj.size(0, floor_uv))*2;
this.height = this.z + this.y;
this.width = 2* (this.x + this.z);
@ -621,7 +622,7 @@ const TextureGenerator = {
}
if (!cube.box_uv) {
var size = cube.size(undefined, true);
var size = cube.size(undefined, Format.box_uv_float_size != true);
size.forEach((n, i) => {
size[i] = n;
})

View File

@ -284,7 +284,7 @@ const UVEditor = {
let elements = UVEditor.getMappableElements();
elements.forEach(element => {
if (element instanceof Cube && element.box_uv) {
let size = element.size(undefined, true)
let size = element.size(undefined, Format.box_uv_float_size != true)
min_x = Math.min(min_x, element.uv_offset[0]);
min_y = Math.min(min_y, element.uv_offset[1]);
max_x = Math.max(max_x, element.uv_offset[0] + (size[0] + size[2]) * 2);
@ -552,7 +552,7 @@ const UVEditor = {
value = limitNumber(value, minimum, limit)
value = limitNumber(value + size, minimum, limit) - size
obj.uv_offset[axis] = value
obj.uv_offset[axis] = Math.round(value);
}
obj.preview_controller.updateUV(obj);
})
@ -2475,7 +2475,7 @@ Interface.definePanels(function() {
})
})
} else if (element.box_uv) {
let size = element.size(undefined, true);
let size = element.size(undefined, Format.box_uv_float_size != true);
let uv_size = [
size[2] + size[0] + (size[1] ? size[2] : 0) + size[0],
size[2] + size[1],
@ -2505,8 +2505,8 @@ Interface.definePanels(function() {
})
})
} else if (element.box_uv) {
element.uv_offset[0] += diff_x;
element.uv_offset[1] += diff_y;
element.uv_offset[0] = Math.floor(element.uv_offset[0] + diff_x);
element.uv_offset[1] = Math.floor(element.uv_offset[1] + diff_y);
} else {
this.selected_faces.forEach(key => {
if (element.faces[key] && element instanceof Cube) {
@ -3221,10 +3221,10 @@ Interface.definePanels(function() {
:class="{unselected: display_uv === 'all_elements' && !mappable_elements.includes(element)}"
:style="{left: toPixels(element.uv_offset[0]), top: toPixels(element.uv_offset[1])}"
>
<div class="uv_fill" v-if="element.size(1, true) > 0" :style="{left: '-1px', top: toPixels(element.size(2, true), -1), width: toPixels(element.size(2, true)*2 + element.size(0, true)*2, 2), height: toPixels(element.size(1, true), 2)}" />
<div class="uv_fill" v-if="element.size(0, true) > 0" :style="{left: toPixels(element.size(2, true), -1), top: '-1px', width: toPixels(element.size(0, true)*2, 2), height: toPixels(element.size(2, true), 2), borderBottom: element.size(1, true) > 0 ? 'none' : undefined}" />
<div :style="{left: toPixels(element.size(2, true), -1), top: element.size(0, true) > 0 ? '-1px' : toPixels(element.size(2, true), -1), width: toPixels(element.size(0, true), 2), height: toPixels( (element.size(0, true) > 0 ? element.size(2, true) : 0) + element.size(1, true), 2), borderRight: element.size(0, true) == 0 ? 'none' : undefined}" />
<div v-if="element.size(1, true) > 0 && element.size(0, true) > 0" :style="{left: toPixels(element.size(2, true)*2 + element.size(0, true), -1), top: toPixels(element.size(2, true), -1), width: toPixels(element.size(0, true), 2), height: toPixels(element.size(1, true), 2)}" />
<div class="uv_fill" v-if="element.size(1, 'box_uv') > 0" :style="{left: '-1px', top: toPixels(element.size(2, 'box_uv'), -1), width: toPixels(element.size(2, 'box_uv')*2 + element.size(0, 'box_uv')*2, 2), height: toPixels(element.size(1, 'box_uv'), 2)}" />
<div class="uv_fill" v-if="element.size(0, 'box_uv') > 0" :style="{left: toPixels(element.size(2, 'box_uv'), -1), top: '-1px', width: toPixels(element.size(0, 'box_uv')*2, 2), height: toPixels(element.size(2, 'box_uv'), 2), borderBottom: element.size(1, 'box_uv') > 0 ? 'none' : undefined}" />
<div :style="{left: toPixels(element.size(2, 'box_uv'), -1), top: element.size(0, 'box_uv') > 0 ? '-1px' : toPixels(element.size(2, 'box_uv'), -1), width: toPixels(element.size(0, 'box_uv'), 2), height: toPixels( (element.size(0, 'box_uv') > 0 ? element.size(2, 'box_uv') : 0) + element.size(1, 'box_uv'), 2), borderRight: element.size(0, 'box_uv') == 0 ? 'none' : undefined}" />
<div v-if="element.size(1, 'box_uv') > 0 && element.size(0, 'box_uv') > 0" :style="{left: toPixels(element.size(2, 'box_uv')*2 + element.size(0, 'box_uv'), -1), top: toPixels(element.size(2, 'box_uv'), -1), width: toPixels(element.size(0, 'box_uv'), 2), height: toPixels(element.size(1, 'box_uv'), 2)}" />
</div>
<template v-if="element.type == 'mesh'">