5a2cc317a5
Fix animation export path issue Fix issue with format switching between tabs Fix being able to select locked cubes in UV editor
224 lines
5.8 KiB
JavaScript
224 lines
5.8 KiB
JavaScript
var Format = 0;
|
|
const Formats = {};
|
|
|
|
//Formats
|
|
class ModelFormat {
|
|
constructor(data) {
|
|
Formats[data.id] = this;
|
|
this.id = data.id;
|
|
this.name = data.name || tl('format.'+this.id);
|
|
this.description = data.description || tl('format.'+this.id+'.desc');
|
|
this.show_on_start_screen = true;
|
|
|
|
for (let id in ModelFormat.properties) {
|
|
ModelFormat.properties[id].reset(this);
|
|
}
|
|
|
|
this.codec = data.codec;
|
|
this.onActivation = data.onActivation;
|
|
this.onDeactivation = data.onDeactivation;
|
|
Merge.string(this, data, 'icon');
|
|
Merge.boolean(this, data, 'show_on_start_screen');
|
|
|
|
for (let id in ModelFormat.properties) {
|
|
ModelFormat.properties[id].merge(this, data);
|
|
}
|
|
}
|
|
select() {
|
|
if (Format && typeof Format.onDeactivation == 'function') {
|
|
Format.onDeactivation()
|
|
}
|
|
Format = Project.format = this;
|
|
if (typeof this.onActivation == 'function') {
|
|
Format.onActivation()
|
|
}
|
|
buildGrid()
|
|
if (Format.centered_grid) {
|
|
scene.position.set(0, 0, 0);
|
|
} else {
|
|
scene.position.set(-8, -8, -8);
|
|
}
|
|
Preview.all.forEach(preview => {
|
|
if (preview.isOrtho && typeof preview.angle == 'number') {
|
|
preview.loadAnglePreset(DefaultCameraPresets[preview.angle+1])
|
|
}
|
|
})
|
|
Interface.Panels.animations.inside_vue._data.animation_files_enabled = this.animation_files;
|
|
Interface.status_bar.vue.Format = this;
|
|
Modes.vue.$forceUpdate()
|
|
updateInterfacePanels()
|
|
updateShading();
|
|
Canvas.updateRenderSides()
|
|
return this;
|
|
}
|
|
new() {
|
|
if (newProject(this)) {
|
|
BarItems.project_window.click();
|
|
return true;
|
|
}
|
|
}
|
|
convertTo() {
|
|
|
|
Undo.history.empty();
|
|
Undo.index = 0;
|
|
Project.export_path = '';
|
|
|
|
var old_format = Format
|
|
this.select();
|
|
Modes.options.edit.select()
|
|
|
|
// Box UV
|
|
if (!this.optional_box_uv) Project.box_uv = this.box_uv;
|
|
|
|
//Bone Rig
|
|
if (!Format.bone_rig && old_format.bone_rig) {
|
|
Group.all.forEach(group => {
|
|
group.rotation.V3_set(0, 0, 0);
|
|
})
|
|
}
|
|
if (Format.bone_rig && !old_format.bone_rig) {
|
|
var loose_stuff = []
|
|
Outliner.root.forEach(el => {
|
|
if (el instanceof Group == false) {
|
|
loose_stuff.push(el)
|
|
}
|
|
})
|
|
if (loose_stuff.length) {
|
|
var root_group = new Group().init().addTo()
|
|
loose_stuff.forEach(el => {
|
|
el.addTo(root_group)
|
|
})
|
|
}
|
|
if (!Project.geometry_name && Project.name) {
|
|
Project.geometry_name = Project.name;
|
|
}
|
|
}
|
|
if (Format.bone_rig) {
|
|
Group.all.forEach(group => {
|
|
group.createUniqueName();
|
|
})
|
|
}
|
|
|
|
if (!Format.single_texture && old_format.single_texture && Texture.all.length) {
|
|
let texture = Texture.getDefault();
|
|
Outliner.elements.filter(el => el.applyTexture).forEach(el => {
|
|
el.applyTexture(texture, true)
|
|
})
|
|
}
|
|
|
|
//Rotate Cubes
|
|
if (!Format.rotate_cubes && old_format.rotate_cubes) {
|
|
Cube.all.forEach(cube => {
|
|
cube.rotation.V3_set(0, 0, 0)
|
|
})
|
|
}
|
|
|
|
//Meshes
|
|
if (!Format.meshes && old_format.meshes) {
|
|
Mesh.all.slice().forEach(mesh => {
|
|
mesh.remove()
|
|
})
|
|
}
|
|
|
|
//Locators
|
|
if (!Format.locators && old_format.locators) {
|
|
Locator.all.slice().forEach(locator => {
|
|
locator.remove()
|
|
})
|
|
}
|
|
|
|
//Texture Meshes
|
|
if (!Format.texture_meshes && old_format.texture_meshes) {
|
|
TextureMesh.all.slice().forEach(tm => {
|
|
tm.remove()
|
|
})
|
|
}
|
|
|
|
//Canvas Limit
|
|
if (Format.canvas_limit && !old_format.canvas_limit && !settings.deactivate_size_limit.value) {
|
|
|
|
Cube.all.forEach(function(s, i) {
|
|
//Push elements into 3x3 block box
|
|
[0, 1, 2].forEach(function(ax) {
|
|
var overlap = s.to[ax] + s.inflate - 32
|
|
if (overlap > 0) {
|
|
//If positive site overlaps
|
|
s.from[ax] -= overlap
|
|
s.to[ax] -= overlap
|
|
|
|
if (16 + s.from[ax] - s.inflate < 0) {
|
|
s.from[ax] = -16 + s.inflate
|
|
}
|
|
} else {
|
|
overlap = s.from[ax] - s.inflate + 16
|
|
if (overlap < 0) {
|
|
s.from[ax] -= overlap
|
|
s.to[ax] -= overlap
|
|
|
|
if (s.to[ax] + s.inflate > 32) {
|
|
s.to[ax] = 32 - s.inflate
|
|
}
|
|
}
|
|
}
|
|
})
|
|
})
|
|
}
|
|
|
|
//Rotation Limit
|
|
if (Format.rotation_limit && !old_format.rotation_limit && Format.rotate_cubes) {
|
|
Cube.all.forEach(cube => {
|
|
if (!cube.rotation.allEqual(0)) {
|
|
var axis = (cube.rotation_axis && getAxisNumber(cube.rotation_axis)) || 0;
|
|
var angle = limitNumber( Math.round(cube.rotation[axis]/22.5)*22.5, -45, 45 );
|
|
cube.rotation.V3_set(0, 0, 0)
|
|
cube.rotation[axis] = angle;
|
|
}
|
|
})
|
|
}
|
|
|
|
//Animation Mode
|
|
if (!Format.animation_mode && old_format.animation_mode) {
|
|
Animator.animations.length = 0;
|
|
}
|
|
Canvas.updateAllPositions()
|
|
Canvas.updateAllBones()
|
|
Canvas.updateAllFaces()
|
|
updateSelection()
|
|
}
|
|
delete() {
|
|
delete Formats[this.id];
|
|
if (this.codec && this.codec.format == this) delete this.codec.format;
|
|
}
|
|
}
|
|
|
|
new Property(ModelFormat, 'boolean', 'box_uv');
|
|
new Property(ModelFormat, 'boolean', 'optional_box_uv');
|
|
new Property(ModelFormat, 'boolean', 'single_texture');
|
|
new Property(ModelFormat, 'boolean', 'animated_textures');
|
|
new Property(ModelFormat, 'boolean', 'bone_rig');
|
|
new Property(ModelFormat, 'boolean', 'centered_grid');
|
|
new Property(ModelFormat, 'boolean', 'rotate_cubes');
|
|
new Property(ModelFormat, 'boolean', 'integer_size');
|
|
new Property(ModelFormat, 'boolean', 'meshes');
|
|
new Property(ModelFormat, 'boolean', 'texture_meshes');
|
|
new Property(ModelFormat, 'boolean', 'locators');
|
|
new Property(ModelFormat, 'boolean', 'canvas_limit');
|
|
new Property(ModelFormat, 'boolean', 'rotation_limit');
|
|
new Property(ModelFormat, 'boolean', 'uv_rotation');
|
|
new Property(ModelFormat, 'boolean', 'animation_files');
|
|
new Property(ModelFormat, 'boolean', 'display_mode');
|
|
new Property(ModelFormat, 'boolean', 'animation_mode');
|
|
new Property(ModelFormat, 'boolean', 'texture_folder');
|
|
|
|
new ModelFormat({
|
|
id: 'free',
|
|
icon: 'icon-format_free',
|
|
meshes: true,
|
|
rotate_cubes: true,
|
|
bone_rig: true,
|
|
centered_grid: true,
|
|
optional_box_uv: true,
|
|
uv_rotation: true,
|
|
animation_mode: true
|
|
})
|