diff --git a/.gitignore b/.gitignore
index 04c8f0b05..6f1ca902f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
/dist/
index.php
package-lock.json
+node_modules/
\ No newline at end of file
diff --git a/README.md b/README.md
index 568cd0be5..3391650a6 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,18 @@
# Blockbench
-Blockbench is a free, modern model editor for Minecraft Java and Bedrock Edition.
+Blockbench is a free, modern model editor for boxy models and pixel art textures.
+Models can be exported for Minecraft Java and Bedrock Edition as well as most game engines and other 3D applications.
Blockbench features a modern and intuitive UI, plugin support and innovative features. It is the industry standard for creating custom 3D models for the Minecraft Marketplace.
-Project and download page: [blockbench.net](https://www.blockbench.net)
+Website and download: [blockbench.net](https://www.blockbench.net)
![Interface](https://blockbench.net/wp-content/uploads/2019/07/interface_skidsteer.png)
+
+## Contribution
+
+I am not actively using this repository to develop Blockbench. Therefore, I currently won't accept pull requests, sorry!
+If you want something implemented in Blockbench, please write a plugin, create an issue labeled [Suggestion], or contact me on Discord.
+If you want to Blockbench translations, please visit [blockbench.net/translations](https://blockbench.net/translations/). Thank you!
+
+## Plugins
+
+Blockbench supports Javascript-based plugins. Learn more about creating plugins on [jannisx11.github.io/blockbench-docs](https://jannisx11.github.io/blockbench-docs/#creating-a-plugin).
diff --git a/css/panels.css b/css/panels.css
index 570fc39f2..d7c5d9cde 100644
--- a/css/panels.css
+++ b/css/panels.css
@@ -992,6 +992,9 @@
cursor: default;
pointer-events: none;
z-index: 5;
+ color: white;
+ mix-blend-mode: difference;
+ font-weight: 300;
}
.panel .bar.next_to_title {
margin-top: -30px;
@@ -1231,5 +1234,7 @@
}
.panel#color .sp-container.sp-flat {
overflow: visible;
+ margin: 2px 4px 0 4px;
+ width: calc(100% - 8px);
}
diff --git a/index.html b/index.html
index 7a2eaa1ed..2774ef9f7 100644
--- a/index.html
+++ b/index.html
@@ -23,7 +23,7 @@
An error occurred while loading Blockbench
@@ -58,6 +58,7 @@
+
diff --git a/js/animations.js b/js/animations.js
index 1133bf13f..70bfe1574 100644
--- a/js/animations.js
+++ b/js/animations.js
@@ -1225,6 +1225,7 @@ const Animator = {
animation.getBoneAnimator(group).displayFrame(Timeline.time)
}
})
+ group.mesh.updateMatrixWorld()
})
Animator.animations.forEach(animation => {
diff --git a/js/blockbench.js b/js/blockbench.js
index 28b420045..ed614424c 100644
--- a/js/blockbench.js
+++ b/js/blockbench.js
@@ -294,163 +294,6 @@ function createSelection() {
}
hideDialog()
}
-//Modes
-class Mode extends KeybindItem {
- constructor(data) {
- super(data)
- this.id = data.id;
- this.name = data.name || tl('mode.'+this.id);
- this.selected = false
- this.default_tool = data.default_tool;
- this.center_windows = data.center_windows||['preview'];
- this.selectCubes = data.selectCubes !== false
- this.hide_toolbars = data.hide_toolbars
- this.condition = data.condition;
- this.onSelect = data.onSelect;
- this.onUnselect = data.onUnselect;
- Modes.options[this.id] = this;
- }
- select() {
- var scope = this;
- if (Modes.selected) {
- delete Modes[Modes.selected.id];
- Modes.previous_id = Modes.selected.id;
- }
- if (typeof Modes.selected.onUnselect === 'function') {
- Modes.selected.onUnselect()
- }
- if (Modes.selected.selected) {
- Modes.selected.selected = false
- }
- this.selected = true;
- Modes.id = this.id
- Modes.selected = this;
- Modes[Modes.selected.id] = true;
-
- document.body.setAttribute('mode', this.id);
-
- $('#center > #preview').toggle(this.center_windows.includes('preview'));
- $('#center > #timeline').toggle(this.center_windows.includes('timeline'));
- $('#center > #start_screen').toggle(this.center_windows.includes('start_screen'));
-
- if (this.hide_toolbars) {
- $('#main_toolbar .toolbar_wrapper').css('visibility', 'hidden')
- } else {
- $('#main_toolbar .toolbar_wrapper').css('visibility', 'visible')
- }
-
- if (typeof this.onSelect === 'function') {
- this.onSelect()
- }
-
- updateInterface()
- Canvas.updateRenderSides()
- if (BarItems[this.default_tool]) {
- BarItems[this.default_tool].select()
- } else {
- BarItems.move_tool.select()
- }
- TickUpdates.selection = true;
- }
- trigger() {
- if (Condition(this.condition)) {
- this.select()
- }
- }
-}
-const Modes = {
- id: 'edit',
- selected: false,
- options: {},
-};
-onVueSetup(function() {
- Modes.vue = new Vue({
- el: '#mode_selector',
- data: {
- options: Modes.options
- }
- })
-});
-BARS.defineActions(function() {
- new Mode({
- id: 'start',
- category: 'navigate',
- center_windows: ['start_screen'],
- hide_toolbars: true,
- onSelect: function () {
- },
- onUnselect: function () {
- }
- })
- new Mode({
- id: 'edit',
- default_tool: 'move_tool',
- category: 'navigate',
- condition: () => Format,
- keybind: new Keybind({key: 49})
- })
- new Mode({
- id: 'paint',
- default_tool: 'brush_tool',
- category: 'navigate',
- condition: () => Format,
- keybind: new Keybind({key: 50}),
- onSelect: () => {
- if (Modes.previous_id == 'animate') {
- Animator.preview();
- }
- Cube.all.forEach(cube => {
- Canvas.buildGridBox(cube)
- })
- $('#main_colorpicker').spectrum('set', ColorPanel.vue._data.main_color);
- BarItems.slider_color_h.update();
- BarItems.slider_color_s.update();
- BarItems.slider_color_v.update();
-
- $('.UVEditor').find('#uv_size').hide()
- three_grid.visible = false;
- },
- onUnselect: () => {
- Cube.all.forEach(cube => {
- Canvas.buildGridBox(cube)
- })
- $('.UVEditor').find('#uv_size').show();
- three_grid.visible = true;
- },
- })
- new Mode({
- id: 'display',
- selectCubes: false,
- default_tool: 'move_tool',
- category: 'navigate',
- keybind: new Keybind({key: 51}),
- condition: () => Format.display_mode,
- onSelect: () => {
- enterDisplaySettings()
- },
- onUnselect: () => {
- exitDisplaySettings()
- },
- })
- new Mode({
- id: 'animate',
- default_tool: 'move_tool',
- category: 'navigate',
- center_windows: ['preview', 'timeline'],
- keybind: new Keybind({key: 52}),
- condition: () => Format.animation_mode,
- onSelect: () => {
- Animator.join()
- },
- onUnselect: () => {
- Animator.leave()
- }
- })
- //Update to 3.2.0
- if (Modes.options.animate.keybind.key == 51) {
- Modes.options.animate.keybind.set({key: 52})
- }
-})
//Backup
setInterval(function() {
if (Outliner.root.length || textures.length) {
@@ -500,95 +343,6 @@ const TickUpdates = {
}
}
-const FormatWizard = {
- start() {
- var dialog_1 = new Dialog({
- id: 'format_wizard_1',
- title: 'format_wizard.title',
- width: 540,
- form: {
- question: {type: 'text', text: 'Which platform do you want to create a model for?'},
- platform: {label: 'dialog.radio', type: 'radio', options: {
- 'mcj': 'Minecraft: Java Edition',
- 'mcbe': 'Minecraft: Bedrock Edition',
- 'obj': 'Game Engine'
- }},
- },
- onConfirm: function(formResult1) {
- if (formResult1.platform == 'obj') {
-
- FormatWizard.result('free');
-
- } else if (formResult1.platform == 'mcbe') {
- var types = {
- block: 'format_wizard.type.block',
- item: 'format_wizard.type.item',
- entity: 'format_wizard.type.entity',
- }
- } else {
- var types = {
- block: 'format_wizard.type.block',
- item: 'format_wizard.type.item',
- entity: 'format_wizard.type.entity',
- armor: 'format_wizard.type.armor',
- }
- }
- var dialog_2 = new Dialog({
- id: 'format_wizard_2',
- title: 'format_wizard.title',
- width: 540,
- form: {
- question: {type: 'text', text: 'What type of model do you want to edit?'},
- type: {label: 'dialog.radio', type: 'radio', options: types},
- },
- onConfirm: function(formResult2) {
- if (formResult1.platform == 'mcj' && (formResult2.type == 'entity' || formResult2.type == 'armor')) {
-
- var dialog_3 = new Dialog({
- id: 'format_wizard_3',
- title: 'format_wizard.title',
- width: 540,
- form: {
- question: {type: 'text', text: 'What do you want to create the model for?'},
- product: {label: 'dialog.radio', type: 'radio', options: {
- vanilla: '',
- optifine: '',
- modded: '',
- }},
- },
- onConfirm: function(formResult3) {
- switch (formResult3.product) {
- case 'vanilla':
- FormatWizard.result(''); break;
- case 'optifine':
- FormatWizard.result(formResult2.type == 'armor' ? 'java_armor' : 'optifine_entity'); break;
- case 'modded': default:
- FormatWizard.result('modded_entity'); break;
- }
- }
- }).show();
- } else if (formResult1.platform == 'mcj') {
- FormatWizard.result('java_block');
- } else {
- switch (formResult2.type) {
- case 'block':
- FormatWizard.result('not_supported_yet'); break;
- case 'item':
- FormatWizard.result('not_supported_yet'); break;
- default:
- FormatWizard.result('bedrock'); break;
- }
- }
- }
- }).show();
- }
- }).show();
- },
- result(result) {
-
- }
-}
-
const entityMode = {
- hardcodes: {"geometry.chicken":{"body":{"rotation":[90,0,0]}},"geometry.llama":{"chest1":{"rotation":[0,90,0]},"chest2":{"rotation":[0,90,0]},"body":{"rotation":[90,0,0]}},"geometry.cow":{"body":{"rotation":[90,0,0]}},"geometry.sheep.sheared":{"body":{"rotation":[90,0,0]}},"geometry.sheep":{"body":{"rotation":[90,0,0]}},"geometry.phantom":{"body":{"rotation":[0,0,0]},"wing0":{"rotation":[0,0,5.7]},"wingtip0":{"rotation":[0,0,5.7]},"wing1":{"rotation":[0,0,-5.7]},"wingtip1":{"rotation":[0,0,-5.7]},"head":{"rotation":[11.5,0,0]},"tail":{"rotation":[0,0,0]},"tailtip":{"rotation":[0,0,0]}},"geometry.pig":{"body":{"rotation":[90,0,0]}},"geometry.ocelot":{"body":{"rotation":[90,0,0]},"tail1":{"rotation":[90,0,0]},"tail2":{"rotation":[90,0,0]}},"geometry.cat":{"body":{"rotation":[90,0,0]},"tail1":{"rotation":[90,0,0]},"tail2":{"rotation":[90,0,0]}},"geometry.turtle":{"eggbelly":{"rotation":[90,0,0]},"body":{"rotation":[90,0,0]}},"geometry.villager.witch":{"hat2":{"rotation":[-3,0,1.5]},"hat3":{"rotation":[-6,0,3]},"hat4":{"rotation":[-12,0,6]}},"geometry.pufferfish.mid":{"spines_top_front":{"rotation":[45,0,0]},"spines_top_back":{"rotation":[-45,0,0]},"spines_bottom_front":{"rotation":[-45,0,0]},"spines_bottom_back":{"rotation":[45,0,0]},"spines_left_front":{"rotation":[0,45,0]},"spines_left_back":{"rotation":[0,-45,0]},"spines_right_front":{"rotation":[0,-45,0]},"spines_right_back":{"rotation":[0,45,0]}},"geometry.pufferfish.large":{"spines_top_front":{"rotation":[45,0,0]},"spines_top_back":{"rotation":[-45,0,0]},"spines_bottom_front":{"rotation":[-45,0,0]},"spines_bottom_back":{"rotation":[45,0,0]},"spines_left_front":{"rotation":[0,45,0]},"spines_left_back":{"rotation":[0,-45,0]},"spines_right_front":{"rotation":[0,-45,0]},"spines_right_back":{"rotation":[0,45,0]}},"geometry.tropicalfish_a":{"leftFin":{"rotation":[0,-35,0]},"rightFin":{"rotation":[0,35,0]}},"geometry.tropicalfish_b":{"leftFin":{"rotation":[0,-35,0]},"rightFin":{"rotation":[0,35,0]}}},
+ hardcodes: JSON.parse('{"geometry.chicken":{"body":{"rotation":[90,0,0]}},"geometry.llama":{"chest1":{"rotation":[0,90,0]},"chest2":{"rotation":[0,90,0]},"body":{"rotation":[90,0,0]}},"geometry.cow":{"body":{"rotation":[90,0,0]}},"geometry.sheep.sheared":{"body":{"rotation":[90,0,0]}},"geometry.sheep":{"body":{"rotation":[90,0,0]}},"geometry.phantom":{"body":{"rotation":[0,0,0]},"wing0":{"rotation":[0,0,5.7]},"wingtip0":{"rotation":[0,0,5.7]},"wing1":{"rotation":[0,0,-5.7]},"wingtip1":{"rotation":[0,0,-5.7]},"head":{"rotation":[11.5,0,0]},"tail":{"rotation":[0,0,0]},"tailtip":{"rotation":[0,0,0]}},"geometry.pig":{"body":{"rotation":[90,0,0]}},"geometry.ocelot":{"body":{"rotation":[90,0,0]},"tail1":{"rotation":[90,0,0]},"tail2":{"rotation":[90,0,0]}},"geometry.cat":{"body":{"rotation":[90,0,0]},"tail1":{"rotation":[90,0,0]},"tail2":{"rotation":[90,0,0]}},"geometry.turtle":{"eggbelly":{"rotation":[90,0,0]},"body":{"rotation":[90,0,0]}},"geometry.villager.witch":{"hat2":{"rotation":[-3,0,1.5]},"hat3":{"rotation":[-6,0,3]},"hat4":{"rotation":[-12,0,6]}},"geometry.pufferfish.mid":{"spines_top_front":{"rotation":[45,0,0]},"spines_top_back":{"rotation":[-45,0,0]},"spines_bottom_front":{"rotation":[-45,0,0]},"spines_bottom_back":{"rotation":[45,0,0]},"spines_left_front":{"rotation":[0,45,0]},"spines_left_back":{"rotation":[0,-45,0]},"spines_right_front":{"rotation":[0,-45,0]},"spines_right_back":{"rotation":[0,45,0]}},"geometry.pufferfish.large":{"spines_top_front":{"rotation":[45,0,0]},"spines_top_back":{"rotation":[-45,0,0]},"spines_bottom_front":{"rotation":[-45,0,0]},"spines_bottom_back":{"rotation":[45,0,0]},"spines_left_front":{"rotation":[0,45,0]},"spines_left_back":{"rotation":[0,-45,0]},"spines_right_front":{"rotation":[0,-45,0]},"spines_right_back":{"rotation":[0,45,0]}},"geometry.tropicalfish_a":{"leftFin":{"rotation":[0,-35,0]},"rightFin":{"rotation":[0,35,0]}},"geometry.tropicalfish_b":{"leftFin":{"rotation":[0,-35,0]},"rightFin":{"rotation":[0,35,0]}}}')
}
diff --git a/js/copy_paste.js b/js/copy_paste.js
index 7f6192141..b71bfe651 100644
--- a/js/copy_paste.js
+++ b/js/copy_paste.js
@@ -30,7 +30,7 @@ const Clipbench = {
if (display_mode) {
return Clipbench.types.display_slot
}
- if (Animator.open && Timeline.animators.length && (Timeline.selected.length || mode === 2)) {
+ if (Animator.open && Timeline.animators.length && (Timeline.selected.length || mode === 2) && ['keyframe', 'timeline'].includes(p)) {
return Clipbench.types.keyframe
}
if ((p == 'uv' || p == 'preview') && Modes.edit) {
diff --git a/js/display_mode.js b/js/display_mode.js
index 4856ef8a7..2930207ff 100644
--- a/js/display_mode.js
+++ b/js/display_mode.js
@@ -1460,6 +1460,7 @@ exitDisplaySettings = function() { //Enterung Display Setting Mode, changes the
display_area.updateMatrixWorld()
display_base.updateMatrixWorld()
lights.rotation.set(0, 0, 0);
+ if (scene.parent) scene.parent.remove(scene)
display_mode = false;
main_preview.fullscreen()
diff --git a/js/interface/actions.js b/js/interface/actions.js
index 1b1e0ac8e..90604a536 100644
--- a/js/interface/actions.js
+++ b/js/interface/actions.js
@@ -1632,6 +1632,10 @@ const BARS = {
'transform_space'
]
})
+ // update 3.4.1
+ if (!Toolbars.main_tools.children.includes(BarItems.transform_space)) {
+ Toolbars.main_tools.add(BarItems.transform_space, -1)
+ }
Toolbars.brush = new Toolbar({
id: 'brush',
children: [
diff --git a/js/interface/dialog.js b/js/interface/dialog.js
index 250f873a7..261d33e35 100644
--- a/js/interface/dialog.js
+++ b/js/interface/dialog.js
@@ -85,7 +85,15 @@ function Dialog(settings) {
switch (data.type) {
default:
- bar.append(`
`)
+ bar.append(`
`)
+ if (data.list) {
+ let id = `${scope.id}_${form_id}_list`
+ let list = $(`
`)
+ for (let value of data.list) {
+ list.append(`
`)
+ }
+ bar.append(list)
+ }
break;
case 'textarea':
bar.append(``)
diff --git a/js/io/bbmodel.js b/js/io/bbmodel.js
index 42b149a32..7d5dcc5cc 100644
--- a/js/io/bbmodel.js
+++ b/js/io/bbmodel.js
@@ -180,7 +180,7 @@ var codec = new Codec('project', {
var copy = NonGroup.fromSave(element, true)
for (var face in copy.faces) {
if (!Format.single_texture) {
- var texture = element.faces[face].texture && textures[element.faces[face].texture]
+ var texture = element.faces[face].texture !== null && textures[element.faces[face].texture]
if (texture) {
copy.faces[face].texture = texture.uuid
}
diff --git a/js/io/gltf.js b/js/io/gltf.js
index 7d08cfcf9..071f41aa9 100644
--- a/js/io/gltf.js
+++ b/js/io/gltf.js
@@ -33,6 +33,7 @@ var codec = new Codec('gltf', {
let times = [];
let values = [];
let keyframes = animator[channel].slice();
+ keyframes.sort((a, b) => a.time - b.time)
keyframes.forEach(kf => {
times.push(kf.time);
Timeline.time = kf.time;
diff --git a/js/io/io.js b/js/io/io.js
index daf2f8ad6..53473941f 100644
--- a/js/io/io.js
+++ b/js/io/io.js
@@ -411,6 +411,7 @@ function setupDragHandlers() {
var tex = textures.findInArray('uuid', texture_li.attr('texid'))
if (tex) {
tex.fromFile(files[0])
+ TickUpdates.selection = true;
return;
}
}
@@ -888,7 +889,7 @@ BARS.defineActions(function() {
form: {
format: {type: 'text', label: 'data.format', text: Format.name||'unknown'},
name: {label: 'dialog.project.name', value: Project.name},
- parent: {label: 'dialog.project.parent', value: Project.parent, condition: !Format.bone_rig},
+ parent: {label: 'dialog.project.parent', value: Project.parent, condition: !Format.bone_rig, list: ['paro', 'foo', 'bar']},
geometry_name: {label: 'dialog.project.geoname', value: Project.geometry_name, condition: Format.bone_rig},
ambientocclusion: {label: 'dialog.project.ao', type: 'checkbox', value: Project.ambientocclusion, condition: Format.id == 'java_block'},
box_uv: {label: 'dialog.project.box_uv', type: 'checkbox', value: Project.box_uv, condition: Format.optional_box_uv},
diff --git a/js/io/java_block.js b/js/io/java_block.js
index 3d53b8ddc..458dcdd60 100644
--- a/js/io/java_block.js
+++ b/js/io/java_block.js
@@ -312,7 +312,19 @@ var codec = new Codec('java_block', {
base_cube = new Cube(obj)
if (obj.__comment) base_cube.name = obj.__comment
//Faces
- var uv_stated = false;
+ var faces_without_uv = false;
+ for (var key in base_cube.faces) {
+ if (obj.faces[key] && !obj.faces[key].uv) {
+ faces_without_uv = true;
+ }
+ }
+ if (faces_without_uv) {
+ base_cube.autouv = 2
+ base_cube.mapAutoUV()
+ } else {
+ base_cube.autouv = 0;
+ }
+
for (var key in base_cube.faces) {
var read_face = obj.faces[key];
var new_face = base_cube.faces[key];
@@ -322,10 +334,9 @@ var codec = new Codec('java_block', {
new_face.uv = [0,0,0,0]
} else {
if (typeof read_face.uv === 'object') {
- uv_stated = true
new_face.uv.forEach((n, i) => {
- new_face.uv[i] *= main_uv.getResolution(i%2) / 16;
+ new_face.uv[i] = read_face.uv[i] * main_uv.getResolution(i%2) / 16;
})
}
if (read_face.texture === '#missing') {
@@ -354,12 +365,7 @@ var codec = new Codec('java_block', {
}
}
}
- if (!uv_stated) {
- base_cube.autouv = 2
- base_cube.mapAutoUV()
- } else {
- base_cube.autouv = 0;
- }
+
if (!add) {
Outliner.root.push(base_cube)
base_cube.parent = 'root'
diff --git a/js/io/modded_entity.js b/js/io/modded_entity.js
index 3e47ea810..8e2f64ad8 100644
--- a/js/io/modded_entity.js
+++ b/js/io/modded_entity.js
@@ -104,15 +104,10 @@ var codec = new Codec('modded_entity', {
var model = (settings.credit.value
- ? '//'+settings.credit.value+'\n'
+ ? '// '+settings.credit.value+'\n'
: '')+
- '//Paste this code into your mod.\n' +
- '\nimport org.lwjgl.opengl.GL11;'+
- '\nimport net.minecraft.client.model.ModelBase;'+
- '\nimport net.minecraft.client.model.ModelBox;'+
- `\nimport net.minecraft.client.model.${rendererName};`+
- '\nimport net.minecraft.client.renderer.GlStateManager;'+
- '\nimport net.minecraft.entity.Entity;\n';
+ '// Paste this code into your mod.\n' +
+ '// Make sure to generate all required imports\n'
if (ver == 1) {
model += '\npublic class '+model_id+' extends EntityModel {';
} else {
diff --git a/js/io/skin.js b/js/io/skin.js
index c1f4638fc..571ab1359 100644
--- a/js/io/skin.js
+++ b/js/io/skin.js
@@ -2792,7 +2792,7 @@ skin_presets.panda = `{
"textureheight": 64,
"eyes": [
[11, 19, 2, 1],
- [18, 19, 2, 1],
+ [18, 19, 2, 1]
],
"bones": [
{
diff --git a/js/modes.js b/js/modes.js
new file mode 100644
index 000000000..3bac41626
--- /dev/null
+++ b/js/modes.js
@@ -0,0 +1,156 @@
+class Mode extends KeybindItem {
+ constructor(data) {
+ super(data)
+ this.id = data.id;
+ this.name = data.name || tl('mode.'+this.id);
+ this.selected = false
+ this.default_tool = data.default_tool;
+ this.center_windows = data.center_windows||['preview'];
+ this.selectCubes = data.selectCubes !== false
+ this.hide_toolbars = data.hide_toolbars
+ this.condition = data.condition;
+ this.onSelect = data.onSelect;
+ this.onUnselect = data.onUnselect;
+ Modes.options[this.id] = this;
+ }
+ select() {
+ var scope = this;
+ if (Modes.selected) {
+ delete Modes[Modes.selected.id];
+ Modes.previous_id = Modes.selected.id;
+ }
+ if (typeof Modes.selected.onUnselect === 'function') {
+ Modes.selected.onUnselect()
+ }
+ if (Modes.selected.selected) {
+ Modes.selected.selected = false
+ }
+ this.selected = true;
+ Modes.id = this.id
+ Modes.selected = this;
+ Modes[Modes.selected.id] = true;
+
+ document.body.setAttribute('mode', this.id);
+
+ $('#center > #preview').toggle(this.center_windows.includes('preview'));
+ $('#center > #timeline').toggle(this.center_windows.includes('timeline'));
+ $('#center > #start_screen').toggle(this.center_windows.includes('start_screen'));
+
+ if (this.hide_toolbars) {
+ $('#main_toolbar .toolbar_wrapper').css('visibility', 'hidden')
+ } else {
+ $('#main_toolbar .toolbar_wrapper').css('visibility', 'visible')
+ }
+
+ if (typeof this.onSelect === 'function') {
+ this.onSelect()
+ }
+
+ updateInterface()
+ Canvas.updateRenderSides()
+ if (BarItems[this.default_tool]) {
+ BarItems[this.default_tool].select()
+ } else {
+ BarItems.move_tool.select()
+ }
+ TickUpdates.selection = true;
+ }
+ trigger() {
+ if (Condition(this.condition)) {
+ this.select()
+ }
+ }
+}
+const Modes = {
+ id: 'edit',
+ selected: false,
+ options: {},
+};
+onVueSetup(function() {
+ Modes.vue = new Vue({
+ el: '#mode_selector',
+ data: {
+ options: Modes.options
+ }
+ })
+});
+BARS.defineActions(function() {
+ new Mode({
+ id: 'start',
+ category: 'navigate',
+ center_windows: ['start_screen'],
+ hide_toolbars: true,
+ onSelect: function () {
+ },
+ onUnselect: function () {
+ }
+ })
+ new Mode({
+ id: 'edit',
+ default_tool: 'move_tool',
+ category: 'navigate',
+ condition: () => Format,
+ keybind: new Keybind({key: 49})
+ })
+ new Mode({
+ id: 'paint',
+ default_tool: 'brush_tool',
+ category: 'navigate',
+ condition: () => Format,
+ keybind: new Keybind({key: 50}),
+ onSelect: () => {
+ if (Modes.previous_id == 'animate') {
+ Animator.preview();
+ }
+ Cube.all.forEach(cube => {
+ Canvas.buildGridBox(cube)
+ })
+ $('#main_colorpicker').spectrum('set', ColorPanel.vue._data.main_color);
+ BarItems.slider_color_h.update();
+ BarItems.slider_color_s.update();
+ BarItems.slider_color_v.update();
+
+ $('.UVEditor').find('#uv_size').hide()
+ three_grid.visible = false;
+ },
+ onUnselect: () => {
+ Cube.all.forEach(cube => {
+ Canvas.buildGridBox(cube)
+ })
+ $('.UVEditor').find('#uv_size').show();
+ three_grid.visible = true;
+ },
+ })
+ new Mode({
+ id: 'display',
+ selectCubes: false,
+ default_tool: 'move_tool',
+ category: 'navigate',
+ keybind: new Keybind({key: 51}),
+ condition: () => Format.display_mode,
+ onSelect: () => {
+ enterDisplaySettings()
+ },
+ onUnselect: () => {
+ exitDisplaySettings()
+ },
+ })
+ new Mode({
+ id: 'animate',
+ default_tool: 'move_tool',
+ category: 'navigate',
+ center_windows: ['preview', 'timeline'],
+ keybind: new Keybind({key: 52}),
+ condition: () => Format.animation_mode,
+ onSelect: () => {
+ Animator.join()
+ },
+ onUnselect: () => {
+ Animator.leave()
+ }
+ })
+ //Update to 3.2.0
+ if (Modes.options.animate.keybind.key == 51) {
+ Modes.options.animate.keybind.set({key: 52})
+ }
+})
\ No newline at end of file
diff --git a/js/outliner/group.js b/js/outliner/group.js
index 4c1502358..32ca652d8 100644
--- a/js/outliner/group.js
+++ b/js/outliner/group.js
@@ -407,8 +407,8 @@ class Group extends OutlinerElement {
}},
*/
'rename',
- {icon: 'sort_by_alpha', name: 'menu.group.sort', click: function(group) {group.sortContent()}},
- {icon: 'fa-leaf', name: 'menu.group.resolve', click: function(group) {
+ {icon: 'sort_by_alpha', name: 'menu.group.sort', condition: {modes: ['edit']}, click: function(group) {group.sortContent()}},
+ {icon: 'fa-leaf', name: 'menu.group.resolve', condition: {modes: ['edit']}, click: function(group) {
Undo.initEdit({outliner: true})
group.resolve()
Undo.finishEdit('group resolve')
diff --git a/js/outliner/outliner.js b/js/outliner/outliner.js
index a705cb3ca..c42e8668f 100644
--- a/js/outliner/outliner.js
+++ b/js/outliner/outliner.js
@@ -502,6 +502,8 @@ class NonGroup extends OutlinerElement {
break;
}
}
+ NonGroup.selected = selected;
+ NonGroup.all = elements;
Array.prototype.findRecursive = function(key1, val) {
var i = 0
diff --git a/js/preview/preview.js b/js/preview/preview.js
index 1ff3a0ef7..c1c43d75a 100644
--- a/js/preview/preview.js
+++ b/js/preview/preview.js
@@ -553,7 +553,9 @@ class Preview {
if (this.static_rclick && (event.which === 3 || (event.type == 'touchend' && this.rclick_cooldown == true))) {
var data = this.raycast(event)
if (Toolbox.selected.selectCubes && Modes.selected.selectCubes && data && data.cube) {
- data.cube.showContextMenu(event)
+ if (!Modes.animate) {
+ data.cube.showContextMenu(event)
+ }
} else {
this.menu.open(event, this)
}
@@ -1586,7 +1588,7 @@ function buildGrid() {
x: side_grid,
z: side_grid.clone()
}
- scene.add(Canvas.side_grids.x)
+ three_grid.add(Canvas.side_grids.x)
Canvas.side_grids.x.name = 'side_grid_x'
Canvas.side_grids.x.visible = !Modes.display;
Canvas.side_grids.x.rotation.z = Math.PI/2;
@@ -1595,7 +1597,7 @@ function buildGrid() {
el.layers.set(1)
});
- scene.add(Canvas.side_grids.z)
+ three_grid.add(Canvas.side_grids.z)
Canvas.side_grids.z.name = 'side_grid_z'
Canvas.side_grids.z.visible = !Modes.display;
Canvas.side_grids.z.rotation.z = Math.PI/2;
diff --git a/js/preview/transformer.js b/js/preview/transformer.js
index 950c6f5fc..ba943cc98 100644
--- a/js/preview/transformer.js
+++ b/js/preview/transformer.js
@@ -923,21 +923,6 @@
Transformer.rotation_ref = space.mesh;
}
-
-
-
- /* else if (Group.selected && !Blockbench.globalMovement) {
- Transformer.rotation_ref = rotation_object.mesh;
-
- } else if (Group.selected && Blockbench.globalMovement && Group.selected.parent && Format.bone_rig) {
- Transformer.rotation_ref = Group.selected.parent.mesh;
-
- } else if (!Blockbench.globalMovement && Cube.selected[0] && Cube.selected[0].mesh) {
- Transformer.rotation_ref = Cube.selected[0].mesh;
-
- } else if (!Blockbench.globalMovement && Locator.selected[0]) {
- Transformer.rotation_ref = Locator.selected[0].parent.mesh;
- }*/
}
} else if (Modes.display) {
@@ -964,9 +949,10 @@
Group.selected.mesh.getWorldPosition(this.position);
if (Toolbox.selected.id == 'resize_tool') {
Transformer.rotation_ref = Group.selected.mesh;
- } else if (!Toolbox.selected.id == 'move_tool' || !Group.selected.ik_enabled) {
+ } else {
Transformer.rotation_ref = Group.selected.mesh.parent;
}
+
}
}
function displayDistance(number) {
diff --git a/js/texturing/painter.js b/js/texturing/painter.js
index 88789ae45..af8db12e8 100644
--- a/js/texturing/painter.js
+++ b/js/texturing/painter.js
@@ -373,7 +373,6 @@ const Painter = {
var a = b_opacity * opacity;
var before = Painter.getAlphaMatrix(texture, px, py)
Painter.setAlphaMatrix(texture, px, py, a);
- //if (before) a = Math.clamp(a-before, 0, 1);
if (a > before) {
a = (a - before) / (1 - before);
} else if (before) {
@@ -385,15 +384,12 @@ const Painter = {
})
} else if (tool === 'eraser') {
Painter.editCircle(ctx, x, y, size, softness, function(pxcolor, opacity) {
- if (!Painter.lock_alpha) {
- var a = b_opacity;
- return {
- r: pxcolor.r,
- g: pxcolor.g,
- b: pxcolor.b,
- a: pxcolor.a*(1-a)
- };
- }
+ return {
+ r: pxcolor.r,
+ g: pxcolor.g,
+ b: pxcolor.b,
+ a: Painter.lock_alpha ? pxcolor.a : (pxcolor.a*(1-b_opacity))
+ };
})
}
ctx.restore();
@@ -626,6 +622,7 @@ const Painter = {
} else {
for (var cube2 of Cube.all) {
if (
+ cube.inflate === cube2.inflate &&
cube.from[2] === cube2.from[2] && cube.to[2] === cube2.to[2] &&
cube.from[1] === cube2.from[1] && cube.to[1] === cube2.to[1] &&
cube.size(0) === cube2.size(0) && cube.to[0]-center === center-cube2.from[0]
@@ -703,7 +700,7 @@ const Painter = {
},
editCircle(ctx, x, y, r, s, editPx) {
r = Math.round(r+1)/2
- Painter.scanCanvas(ctx, x-r-2, y-r-2, 2*r+4, 2*r+4, function (px, py, pixel) {
+ Painter.scanCanvas(ctx, x-Math.ceil(r)-2, y-Math.ceil(r)-2, 2*r+3, 2*r+3, function (px, py, pixel) {
if (
settings.paint_side_restrict.value &&
Painter.editing_area &&
@@ -718,8 +715,8 @@ const Painter = {
return;
}
- px -= x;
- py -= y;
+ px -= x - r%1;
+ py -= y - r%1;
var distance = Math.sqrt(px*px + py*py)
if (s*r != 0) {
diff --git a/js/texturing/textures.js b/js/texturing/textures.js
index 6d3ace053..99ab3d9ab 100644
--- a/js/texturing/textures.js
+++ b/js/texturing/textures.js
@@ -296,10 +296,7 @@ class Texture {
this.startWatcher()
Painter.current = {}
- if (!isApp && Project.dataURLTextures) {
- this.loadEmpty()
-
- } else if (EditSession.active) {
+ if (EditSession.active) {
this.load(() => {
var before = {textures: {}}
before.textures[scope.uuid] = true;
@@ -362,6 +359,7 @@ class Texture {
return this;
}
updateSource(dataUrl) {
+ // Update the source, only used when source is secure + base64
if (!dataUrl) dataUrl = this.source;
this.source = dataUrl;
this.img.src = dataUrl;
@@ -440,8 +438,7 @@ class Texture {
tex_version++;
}
this.source = this.source.replace(/\?\d+$/, '?' + tex_version)
- this.img.src = this.source;
- this.updateMaterial();
+ this.load();
TickUpdates.main_uv = true;
TickUpdates.texture_list = true;
}
@@ -803,7 +800,7 @@ class Texture {
var image = nativeImage.createFromDataURL(scope.source).toPNG()
}
tex_version++;
- if (!as && this.path && this.path.substr(1,1) === ':') {
+ if (!as && this.path && this.path.substr(1,1) === ':' && fs.existsSync(this.path)) {
fs.writeFile(this.path, image, function (err) {
scope.fromPath(scope.path)
})
diff --git a/js/transform.js b/js/transform.js
index ee366dba9..2c1845ea4 100644
--- a/js/transform.js
+++ b/js/transform.js
@@ -45,8 +45,7 @@ function getSelectionCenter() {
var center = [0, 0, 0]
var i = 0;
selected.forEach(obj => {
- var m = obj.mesh
- if (m) {
+ if (obj.getWorldCenter) {
var pos = obj.getWorldCenter();
center[0] += pos.x
center[1] += pos.y
@@ -1316,34 +1315,37 @@ BARS.defineActions(function() {
new Action('toggle_visibility', {
icon: 'visibility',
category: 'transform',
+ condition: {modes: ['edit']},
click: function () {toggleCubeProperty('visibility')}
})
new Action('toggle_export', {
icon: 'save',
category: 'transform',
+ condition: {modes: ['edit']},
click: function () {toggleCubeProperty('export')}
})
new Action('toggle_autouv', {
icon: 'fullscreen_exit',
category: 'transform',
+ condition: {modes: ['edit']},
click: function () {toggleCubeProperty('autouv')}
})
new Action('toggle_shade', {
icon: 'wb_sunny',
category: 'transform',
- condition: () => !Project.box_uv,
+ condition: () => !Project.box_uv && Modes.edit,
click: function () {toggleCubeProperty('shade')}
})
new Action('toggle_mirror_uv', {
icon: 'icon-mirror_x',
category: 'transform',
- condition: () => Project.box_uv,
+ condition: () => Project.box_uv && Modes.edit,
click: function () {toggleCubeProperty('shade')}
})
new Action('update_autouv', {
icon: 'brightness_auto',
category: 'transform',
- condition: () => !Project.box_uv,
+ condition: () => !Project.box_uv && Modes.edit,
click: function () {
if (Cube.selected.length) {
Undo.initEdit({elements: Cube.selected[0].forSelected(), selection: true})
@@ -1357,6 +1359,7 @@ BARS.defineActions(function() {
new Action('origin_to_geometry', {
icon: 'filter_center_focus',
category: 'transform',
+ condition: {modes: ['edit']},
click: function () {origin2geometry()}
})
new Action('rescale_toggle', {
diff --git a/lang/de.json b/lang/de.json
index b329c92ae..3f90de2af 100644
--- a/lang/de.json
+++ b/lang/de.json
@@ -1013,79 +1013,79 @@
"menu.help.about": "Über...",
"menu.preview.background.clipboard": "Aus Zwischenablage laden",
"dialog.ignore": "Ignorieren",
- "generic.unset": "Unset",
- "message.invalid_builtin_parent.title": "Invalid Built-in Parent",
- "message.invalid_builtin_parent.message": "The link to the invalid parent model '%0' was removed in order to export a valid model.",
- "dialog.resize_texture.fill": "Fill with",
- "dialog.resize_texture.fill.transparent": "Transparent",
- "dialog.resize_texture.fill.color": "Color",
- "dialog.resize_texture.fill.repeat": "Repeat",
- "dialog.resize_texture.fill.stretch": "Stretch",
- "dialog.scale.element_pivot": "Element Pivot",
- "dialog.scale.selection_center": "Selection Center",
- "dialog.create_gif.length_mode": "Length Mode",
- "dialog.create_gif.length_mode.seconds": "Seconds",
+ "generic.unset": "(Keine)",
+ "message.invalid_builtin_parent.title": "Ungültiges Elternmodell",
+ "message.invalid_builtin_parent.message": "Die Referenz auf das ungültige Elternmodell '%0' wurde entfernt, um ein funktionierendes Modell zu speichern.",
+ "dialog.resize_texture.fill": "Füllen mit",
+ "dialog.resize_texture.fill.transparent": "Transparenz",
+ "dialog.resize_texture.fill.color": "Farbe",
+ "dialog.resize_texture.fill.repeat": "Wiederholen",
+ "dialog.resize_texture.fill.stretch": "Ausdehnen",
+ "dialog.scale.element_pivot": "Angelpunkt",
+ "dialog.scale.selection_center": "Mittelpunkt der Auswahl",
+ "dialog.create_gif.length_mode": "Längenmodus",
+ "dialog.create_gif.length_mode.seconds": "Sekunden",
"dialog.create_gif.length_mode.frames": "Frames",
- "dialog.create_gif.length_mode.animation": "Animation Length",
- "dialog.create_gif.length_mode.turntable": "Turntable Rotation",
- "dialog.save_angle.projection": "Projection",
- "dialog.save_angle.projection.perspective": "Perspective",
- "dialog.save_angle.projection.orthographic": "Orthographic",
- "dialog.sketchfab_uploader.animations": "Animations",
- "dialog.settings.theme": "Theme",
- "settings.category.interface": "Interface",
- "settings.preview_checkerboard": "Preview Checkerboard",
- "settings.preview_checkerboard.desc": "Toggle the checkerboard background behind the preview",
- "settings.uv_checkerboard": "UV Editor Checkerboard",
- "settings.uv_checkerboard.desc": "Toggle the checkerboard background behind the UV editor",
- "category.paint": "Paint",
- "action.fill_mode.color_connected": "Connected Colors",
- "action.draw_shape_type": "Shape Type",
- "action.draw_shape_type.rectangle": "Rectangle",
- "action.draw_shape_type.rectangle_h": "Rectangle (Hollow)",
+ "dialog.create_gif.length_mode.animation": "Animationslänge",
+ "dialog.create_gif.length_mode.turntable": "Umdrehung",
+ "dialog.save_angle.projection": "Projektion",
+ "dialog.save_angle.projection.perspective": "Perspektivisch",
+ "dialog.save_angle.projection.orthographic": "Parallel",
+ "dialog.sketchfab_uploader.animations": "Animationen",
+ "dialog.settings.theme": "Farbschema",
+ "settings.category.interface": "Benutzeroberfläche",
+ "settings.preview_checkerboard": "Vorschau Schachbrettmuster",
+ "settings.preview_checkerboard.desc": "Aktiviert das Schachbrettmuster hinter der 3D Vorschau",
+ "settings.uv_checkerboard": "UV Fenster Schachbrettmuster",
+ "settings.uv_checkerboard.desc": "Aktiviert das Schachbrettmuster hinter dem UV Fenster",
+ "category.paint": "Malen",
+ "action.fill_mode.color_connected": "Verbundene Farben",
+ "action.draw_shape_type": "Form",
+ "action.draw_shape_type.rectangle": "Rechteck",
+ "action.draw_shape_type.rectangle_h": "Rechteck (Hohl)",
"action.draw_shape_type.ellipse": "Ellipse",
- "action.draw_shape_type.ellipse_h": "Ellipse (Hollow)",
- "action.draw_shape_type.line": "Line",
- "action.mirror_painting": "Mirror Painting",
- "action.mirror_painting.description": "Mirror your paint strokes to the other side of the model",
- "action.lock_alpha": "Lock Alpha Channel",
- "action.lock_alpha.description": "Lock the transparency of all pixels",
- "action.draw_shape_tool": "Draw Shape",
- "action.draw_shape_tool.desc": "Tool to draw simple shapes on textures",
- "action.copy_paste_tool": "Copy Paste Tool",
- "action.copy_paste_tool.desc": "Tool to copy and paste selections of textures",
- "action.export_gltf": "Export As glTF",
- "action.export_gltf.desc": "Export model and animations as glTF file to use in other 3D applications",
- "action.transform_space": "Transform Space",
- "action.transform_space.desc": "Default transform space for elements and bones",
+ "action.draw_shape_type.ellipse_h": "Ellipse (Hohl)",
+ "action.draw_shape_type.line": "Linie",
+ "action.mirror_painting": "Gespiegelt Malen",
+ "action.mirror_painting.description": "Spiegelt alle Pinselstriche auf die andere Seite des Modells",
+ "action.lock_alpha": "Transparenzkanal sperren",
+ "action.lock_alpha.description": "Sperrt die Transparenz aller Pixel",
+ "action.draw_shape_tool": "Form zeichnen",
+ "action.draw_shape_tool.desc": "Werkzeug zum Zeichnen einfacher Formen",
+ "action.copy_paste_tool": "Kopierwerkzeug",
+ "action.copy_paste_tool.desc": "Werkzeug zum Kopieren und verschieben von Ausschnitten aus Texturen",
+ "action.export_gltf": "Als glTF exportieren",
+ "action.export_gltf.desc": "Exportiert das Modell und die Animationen als glTF Datei, zur Weiterverwendung in anderen 3D Programmen",
+ "action.transform_space": "Transformationsraum",
+ "action.transform_space.desc": "Raum, in dem Elemente bewegt werden",
"action.transform_space.global": "Global",
- "action.transform_space.bone": "Bone",
- "action.transform_space.local": "Local",
- "action.toggle_camera_projection": "Toggle Camera Projection",
- "action.toggle_camera_projection.desc": "Toggle the camera projection between perspective and orthographic",
- "action.load_camera_angle": "Camera Angle: %0",
- "action.load_camera_angle.desc": "Load the camera angle '%0'",
- "action.slider_face_tint": "Tint Index",
- "action.slider_face_tint.desc": "Set the tint index of the current face. -1 means unset.",
- "menu.help.quickstart": "Quickstart Wizard",
- "menu.help.developer": "Developer",
- "menu.help.developer.dev_tools": "Open Dev Tools",
- "menu.help.developer.reset_storage": "Factory Reset",
- "menu.help.developer.reset_storage.confirm": "Are you sure you want to reset Blockbench to factory settings? This will delete all custom settings, keybindings and installed plugins.",
- "menu.help.developer.cache_reload": "Cache Reload",
- "menu.texture.resize": "Resize...",
- "menu.preview.orthographic": "Orthographic",
- "menu.preview.save_angle": "Save Angle...",
- "menu.preview.angle": "Angles",
- "menu.preview.angle.initial": "Initial Angle",
- "menu.preview.angle.load": "Load",
- "menu.preview.maximize": "Maximize",
- "panel.color.both": "Both",
- "uv_editor.copy_selection": "Copy Selection",
- "uv_editor.paste_selection": "Paste Selection",
- "uv_editor.copy_paste_tool.place": "Place",
- "uv_editor.copy_paste_tool.cut": "Cut",
- "uv_editor.copy_paste_tool.mirror_x": "Mirror X",
- "uv_editor.copy_paste_tool.mirror_y": "Mirror Y",
- "uv_editor.copy_paste_tool.rotate": "Rotate 90 Degrees"
+ "action.transform_space.bone": "Knochen",
+ "action.transform_space.local": "Lokal",
+ "action.toggle_camera_projection": "Kameraprojektion Umschalten",
+ "action.toggle_camera_projection.desc": "Schaltet die Kameraprojektion zwischen perspektivisch und parallel um",
+ "action.load_camera_angle": "Kamerablickwinkel: %s",
+ "action.load_camera_angle.desc": "Den Kamerablickwinkel '%0' laden",
+ "action.slider_face_tint": "Färbungsindex",
+ "action.slider_face_tint.desc": "Legt den Färbungsindex für die ausgewählten Flächen fest. -1 entspricht keiner Färbung.",
+ "menu.help.quickstart": "Schnellstartassistent",
+ "menu.help.developer": "Entwickler",
+ "menu.help.developer.dev_tools": "Entwicklerwerkzeuge öffnen",
+ "menu.help.developer.reset_storage": "Auf Werkseinstellungen zurücksetzen",
+ "menu.help.developer.reset_storage.confirm": "Bist du dir sicher, dass du Blockbench auf Werkseinstellungen zurücksetzen möchtest? Der Vorgang wird alle Benutzereinstellungen und Plugins zurücksetzen.",
+ "menu.help.developer.cache_reload": "Cache neu laden",
+ "menu.texture.resize": "Größe ändern",
+ "menu.preview.orthographic": "Parallel",
+ "menu.preview.save_angle": "Blickwinkel speichern...",
+ "menu.preview.angle": "Blickwinkel",
+ "menu.preview.angle.initial": "Standardblickwinkel",
+ "menu.preview.angle.load": "Laden",
+ "menu.preview.maximize": "Maximieren",
+ "panel.color.both": "Beides",
+ "uv_editor.copy_selection": "Auswahl Kopieren",
+ "uv_editor.paste_selection": "Auswahl einfügen",
+ "uv_editor.copy_paste_tool.place": "Platzieren",
+ "uv_editor.copy_paste_tool.cut": "Ausschneiden",
+ "uv_editor.copy_paste_tool.mirror_x": "Spiegeln (X)",
+ "uv_editor.copy_paste_tool.mirror_y": "Spiegeln (Y)",
+ "uv_editor.copy_paste_tool.rotate": "Um 90 Grad drehen"
}
\ No newline at end of file
diff --git a/lang/en.json b/lang/en.json
index 0ee711d47..f9a990b5f 100644
--- a/lang/en.json
+++ b/lang/en.json
@@ -228,7 +228,7 @@
"dialog.project.title": "Project",
"dialog.project.name": "File Name",
"dialog.project.parent": "Parent Model",
- "dialog.project.geoname": "Mob Geometry Name",
+ "dialog.project.geoname": "Model Identifier",
"dialog.project.openparent": "Open Parent",
"dialog.project.ao": "Ambient Occlusion",
"dialog.project.box_uv": "Box UV",
diff --git a/lang/es.json b/lang/es.json
index dceb062d3..7821e7771 100644
--- a/lang/es.json
+++ b/lang/es.json
@@ -1012,80 +1012,80 @@
"menu.help.donate": "Donar",
"menu.help.about": "Acerca de...",
"menu.preview.background.clipboard": "Cargar desde Portapapeles",
- "dialog.ignore": "Ignore",
- "generic.unset": "Unset",
- "message.invalid_builtin_parent.title": "Invalid Built-in Parent",
- "message.invalid_builtin_parent.message": "The link to the invalid parent model '%0' was removed in order to export a valid model.",
- "dialog.resize_texture.fill": "Fill with",
- "dialog.resize_texture.fill.transparent": "Transparent",
+ "dialog.ignore": "Ignorar",
+ "generic.unset": "Desajustar",
+ "message.invalid_builtin_parent.title": "Padre Incorporado Inválido",
+ "message.invalid_builtin_parent.message": "El enlace al modelo inválido padre '%0' fue quitado para exportar un modelo válido.",
+ "dialog.resize_texture.fill": "Rellenar con",
+ "dialog.resize_texture.fill.transparent": "Transparente",
"dialog.resize_texture.fill.color": "Color",
- "dialog.resize_texture.fill.repeat": "Repeat",
- "dialog.resize_texture.fill.stretch": "Stretch",
- "dialog.scale.element_pivot": "Element Pivot",
- "dialog.scale.selection_center": "Selection Center",
- "dialog.create_gif.length_mode": "Length Mode",
- "dialog.create_gif.length_mode.seconds": "Seconds",
+ "dialog.resize_texture.fill.repeat": "Repetir",
+ "dialog.resize_texture.fill.stretch": "Estirar",
+ "dialog.scale.element_pivot": "Pivote de Elemento",
+ "dialog.scale.selection_center": "Centro de Selección",
+ "dialog.create_gif.length_mode": "Modo de Longitud",
+ "dialog.create_gif.length_mode.seconds": "Segundos",
"dialog.create_gif.length_mode.frames": "Frames",
- "dialog.create_gif.length_mode.animation": "Animation Length",
- "dialog.create_gif.length_mode.turntable": "Turntable Rotation",
- "dialog.save_angle.projection": "Projection",
- "dialog.save_angle.projection.perspective": "Perspective",
- "dialog.save_angle.projection.orthographic": "Orthographic",
- "dialog.sketchfab_uploader.animations": "Animations",
- "dialog.settings.theme": "Theme",
- "settings.category.interface": "Interface",
- "settings.preview_checkerboard": "Preview Checkerboard",
- "settings.preview_checkerboard.desc": "Toggle the checkerboard background behind the preview",
- "settings.uv_checkerboard": "UV Editor Checkerboard",
- "settings.uv_checkerboard.desc": "Toggle the checkerboard background behind the UV editor",
- "category.paint": "Paint",
- "action.fill_mode.color_connected": "Connected Colors",
- "action.draw_shape_type": "Shape Type",
- "action.draw_shape_type.rectangle": "Rectangle",
- "action.draw_shape_type.rectangle_h": "Rectangle (Hollow)",
- "action.draw_shape_type.ellipse": "Ellipse",
- "action.draw_shape_type.ellipse_h": "Ellipse (Hollow)",
- "action.draw_shape_type.line": "Line",
- "action.mirror_painting": "Mirror Painting",
- "action.mirror_painting.description": "Mirror your paint strokes to the other side of the model",
- "action.lock_alpha": "Lock Alpha Channel",
- "action.lock_alpha.description": "Lock the transparency of all pixels",
- "action.draw_shape_tool": "Draw Shape",
- "action.draw_shape_tool.desc": "Tool to draw simple shapes on textures",
- "action.copy_paste_tool": "Copy Paste Tool",
- "action.copy_paste_tool.desc": "Tool to copy and paste selections of textures",
- "action.export_gltf": "Export As glTF",
- "action.export_gltf.desc": "Export model and animations as glTF file to use in other 3D applications",
- "action.transform_space": "Transform Space",
- "action.transform_space.desc": "Default transform space for elements and bones",
+ "dialog.create_gif.length_mode.animation": "Longitud de Animación",
+ "dialog.create_gif.length_mode.turntable": "Rotación de Bombero",
+ "dialog.save_angle.projection": "Proyección",
+ "dialog.save_angle.projection.perspective": "Perspectiva",
+ "dialog.save_angle.projection.orthographic": "Ortogonal",
+ "dialog.sketchfab_uploader.animations": "Animaciones",
+ "dialog.settings.theme": "Tema",
+ "settings.category.interface": "Interfaz",
+ "settings.preview_checkerboard": "Previsualizar Cuadrícula",
+ "settings.preview_checkerboard.desc": "Cambia el fondo de la cuadrícula detrás de la previsualización",
+ "settings.uv_checkerboard": "Cuadrícula del Editor de UV",
+ "settings.uv_checkerboard.desc": "Cambia el fondo de la cuadrícula detrás del editor de UV",
+ "category.paint": "Pintar",
+ "action.fill_mode.color_connected": "Colores Conectados",
+ "action.draw_shape_type": "Tipo de Forma",
+ "action.draw_shape_type.rectangle": "Rectángulo",
+ "action.draw_shape_type.rectangle_h": "Rectángulo (Hueco)",
+ "action.draw_shape_type.ellipse": "Elipse",
+ "action.draw_shape_type.ellipse_h": "Elipse (Hueca)",
+ "action.draw_shape_type.line": "Línea",
+ "action.mirror_painting": "Invertir Pintura",
+ "action.mirror_painting.description": "Invierte tus trazos de pintura al otro lado del moedlo",
+ "action.lock_alpha": "Bloquear Canal Alfa",
+ "action.lock_alpha.description": "Bloquea la transparencia de todos los píxeles",
+ "action.draw_shape_tool": "Dibujar Figura",
+ "action.draw_shape_tool.desc": "Herramienta para dibujar figuras simples en texturas",
+ "action.copy_paste_tool": "Herramienta de Copiar y Pega",
+ "action.copy_paste_tool.desc": "Herramienta para copiar y pegar selecciones de texturas",
+ "action.export_gltf": "Exportar como gITF",
+ "action.export_gltf.desc": "Exporta el modelo y las animaciones como un archivo gITF para usarlo en otras aplicaciones 3D",
+ "action.transform_space": "Transformar Espacio",
+ "action.transform_space.desc": "Espacio de transformación por defecto para elementos y huesos",
"action.transform_space.global": "Global",
- "action.transform_space.bone": "Bone",
+ "action.transform_space.bone": "Hueso",
"action.transform_space.local": "Local",
- "action.toggle_camera_projection": "Toggle Camera Projection",
- "action.toggle_camera_projection.desc": "Toggle the camera projection between perspective and orthographic",
- "action.load_camera_angle": "Camera Angle: %0",
- "action.load_camera_angle.desc": "Load the camera angle '%0'",
- "action.slider_face_tint": "Tint Index",
- "action.slider_face_tint.desc": "Set the tint index of the current face. -1 means unset.",
- "menu.help.quickstart": "Quickstart Wizard",
- "menu.help.developer": "Developer",
- "menu.help.developer.dev_tools": "Open Dev Tools",
- "menu.help.developer.reset_storage": "Factory Reset",
- "menu.help.developer.reset_storage.confirm": "Are you sure you want to reset Blockbench to factory settings? This will delete all custom settings, keybindings and installed plugins.",
- "menu.help.developer.cache_reload": "Cache Reload",
- "menu.texture.resize": "Resize...",
- "menu.preview.orthographic": "Orthographic",
- "menu.preview.save_angle": "Save Angle...",
- "menu.preview.angle": "Angles",
- "menu.preview.angle.initial": "Initial Angle",
- "menu.preview.angle.load": "Load",
- "menu.preview.maximize": "Maximize",
- "panel.color.both": "Both",
- "uv_editor.copy_selection": "Copy Selection",
- "uv_editor.paste_selection": "Paste Selection",
- "uv_editor.copy_paste_tool.place": "Place",
- "uv_editor.copy_paste_tool.cut": "Cut",
- "uv_editor.copy_paste_tool.mirror_x": "Mirror X",
- "uv_editor.copy_paste_tool.mirror_y": "Mirror Y",
- "uv_editor.copy_paste_tool.rotate": "Rotate 90 Degrees"
+ "action.toggle_camera_projection": "Cambiar Cámara de Proyección",
+ "action.toggle_camera_projection.desc": "Cambia la cámara de proyección entre perspectiva y ortogonal",
+ "action.load_camera_angle": "Ángulo de Cámara: %0",
+ "action.load_camera_angle.desc": "Cargar el ángulo de cámara: '%0'",
+ "action.slider_face_tint": "Índice de Tintado",
+ "action.slider_face_tint.desc": "Ajusta el índice de tintado de la cara actual. -1 significa sin ajustar.",
+ "menu.help.quickstart": "Asistente de Inicio Rápido",
+ "menu.help.developer": "Desarrollador",
+ "menu.help.developer.dev_tools": "Abre las Herramientas de Desarrollador",
+ "menu.help.developer.reset_storage": "Reinicio de Fábrica",
+ "menu.help.developer.reset_storage.confirm": "¿Seguro que quieres reiniciar Blockbench a los ajustes de fábrica? Esto borrará todos los ajustes personalizados, las teclas asignadas y los plugins instalados.",
+ "menu.help.developer.cache_reload": "Recargar Caché",
+ "menu.texture.resize": "Redimensionar...",
+ "menu.preview.orthographic": "Ortogonal",
+ "menu.preview.save_angle": "Guardar Ángulo...",
+ "menu.preview.angle": "Ángulos",
+ "menu.preview.angle.initial": "Ángulo inicial",
+ "menu.preview.angle.load": "Cargar",
+ "menu.preview.maximize": "Maximizar",
+ "panel.color.both": "Ambos",
+ "uv_editor.copy_selection": "Copiar selección",
+ "uv_editor.paste_selection": "Pegar selección",
+ "uv_editor.copy_paste_tool.place": "Lugar",
+ "uv_editor.copy_paste_tool.cut": "Cortar",
+ "uv_editor.copy_paste_tool.mirror_x": "Invertir X",
+ "uv_editor.copy_paste_tool.mirror_y": "Invertir Y",
+ "uv_editor.copy_paste_tool.rotate": "Rotar 90 Grados"
}
\ No newline at end of file
diff --git a/lang/fr.json b/lang/fr.json
index e9efd6cf8..fd5fb0fe4 100644
--- a/lang/fr.json
+++ b/lang/fr.json
@@ -1012,80 +1012,80 @@
"menu.help.donate": "Faire un dons",
"menu.help.about": "A propos",
"menu.preview.background.clipboard": "Charger depuis le presse-papier",
- "dialog.ignore": "Ignore",
- "generic.unset": "Unset",
- "message.invalid_builtin_parent.title": "Invalid Built-in Parent",
- "message.invalid_builtin_parent.message": "The link to the invalid parent model '%0' was removed in order to export a valid model.",
- "dialog.resize_texture.fill": "Fill with",
+ "dialog.ignore": "Ignorer",
+ "generic.unset": "Non défini",
+ "message.invalid_builtin_parent.title": "Parent intégré invalide",
+ "message.invalid_builtin_parent.message": "Le lien vers le modèle parent invalide '%0' a été retiré pour exporter un modèle valide.",
+ "dialog.resize_texture.fill": "Remplir avec",
"dialog.resize_texture.fill.transparent": "Transparent",
- "dialog.resize_texture.fill.color": "Color",
- "dialog.resize_texture.fill.repeat": "Repeat",
- "dialog.resize_texture.fill.stretch": "Stretch",
- "dialog.scale.element_pivot": "Element Pivot",
- "dialog.scale.selection_center": "Selection Center",
- "dialog.create_gif.length_mode": "Length Mode",
- "dialog.create_gif.length_mode.seconds": "Seconds",
- "dialog.create_gif.length_mode.frames": "Frames",
- "dialog.create_gif.length_mode.animation": "Animation Length",
- "dialog.create_gif.length_mode.turntable": "Turntable Rotation",
+ "dialog.resize_texture.fill.color": "Couleur",
+ "dialog.resize_texture.fill.repeat": "Répéter",
+ "dialog.resize_texture.fill.stretch": "Étirer",
+ "dialog.scale.element_pivot": "Pivot d'élément",
+ "dialog.scale.selection_center": "Centre de la sélection",
+ "dialog.create_gif.length_mode": "Mode Longueur",
+ "dialog.create_gif.length_mode.seconds": "Secondes",
+ "dialog.create_gif.length_mode.frames": "Images",
+ "dialog.create_gif.length_mode.animation": "Longueur d'animation",
+ "dialog.create_gif.length_mode.turntable": "Rotation platine",
"dialog.save_angle.projection": "Projection",
"dialog.save_angle.projection.perspective": "Perspective",
- "dialog.save_angle.projection.orthographic": "Orthographic",
+ "dialog.save_angle.projection.orthographic": "Orthographique",
"dialog.sketchfab_uploader.animations": "Animations",
- "dialog.settings.theme": "Theme",
+ "dialog.settings.theme": "Thème",
"settings.category.interface": "Interface",
- "settings.preview_checkerboard": "Preview Checkerboard",
- "settings.preview_checkerboard.desc": "Toggle the checkerboard background behind the preview",
- "settings.uv_checkerboard": "UV Editor Checkerboard",
- "settings.uv_checkerboard.desc": "Toggle the checkerboard background behind the UV editor",
- "category.paint": "Paint",
- "action.fill_mode.color_connected": "Connected Colors",
- "action.draw_shape_type": "Shape Type",
+ "settings.preview_checkerboard": "Prévisualiser damier",
+ "settings.preview_checkerboard.desc": "Basculer le damier d'arrière-plan de la prévisualisation",
+ "settings.uv_checkerboard": "Damier de l'éditeur UV",
+ "settings.uv_checkerboard.desc": "Basculer le damier d'arrière-plan de l'éditeur UV",
+ "category.paint": "Peinture",
+ "action.fill_mode.color_connected": "Couleurs connectées",
+ "action.draw_shape_type": "Type d'ombre",
"action.draw_shape_type.rectangle": "Rectangle",
- "action.draw_shape_type.rectangle_h": "Rectangle (Hollow)",
+ "action.draw_shape_type.rectangle_h": "Rectangle (vide)",
"action.draw_shape_type.ellipse": "Ellipse",
- "action.draw_shape_type.ellipse_h": "Ellipse (Hollow)",
- "action.draw_shape_type.line": "Line",
- "action.mirror_painting": "Mirror Painting",
- "action.mirror_painting.description": "Mirror your paint strokes to the other side of the model",
- "action.lock_alpha": "Lock Alpha Channel",
- "action.lock_alpha.description": "Lock the transparency of all pixels",
- "action.draw_shape_tool": "Draw Shape",
- "action.draw_shape_tool.desc": "Tool to draw simple shapes on textures",
- "action.copy_paste_tool": "Copy Paste Tool",
- "action.copy_paste_tool.desc": "Tool to copy and paste selections of textures",
- "action.export_gltf": "Export As glTF",
- "action.export_gltf.desc": "Export model and animations as glTF file to use in other 3D applications",
- "action.transform_space": "Transform Space",
- "action.transform_space.desc": "Default transform space for elements and bones",
+ "action.draw_shape_type.ellipse_h": "Ellipse (vide)",
+ "action.draw_shape_type.line": "Ligne",
+ "action.mirror_painting": "Peinture en miroir",
+ "action.mirror_painting.description": "Renverse vos traits de l'autre côté du modèle",
+ "action.lock_alpha": "Verrouiller canal alpha",
+ "action.lock_alpha.description": "Verrouiller la transparence de tous les pixels",
+ "action.draw_shape_tool": "Dessiner forme",
+ "action.draw_shape_tool.desc": "Outil de dessin d'ombres simples pour les textures",
+ "action.copy_paste_tool": "Outil duplication",
+ "action.copy_paste_tool.desc": "Outil pour copier et coller des sélections de textures",
+ "action.export_gltf": "Exporter en tant que gITF",
+ "action.export_gltf.desc": "Exporter le modèle et les animations en tant que fichier gITF compatible avec d'autres applications 3D",
+ "action.transform_space": "Transformer espace",
+ "action.transform_space.desc": "Transformation d'espace par défaut pour éléments et os",
"action.transform_space.global": "Global",
- "action.transform_space.bone": "Bone",
+ "action.transform_space.bone": "Os",
"action.transform_space.local": "Local",
- "action.toggle_camera_projection": "Toggle Camera Projection",
- "action.toggle_camera_projection.desc": "Toggle the camera projection between perspective and orthographic",
- "action.load_camera_angle": "Camera Angle: %0",
- "action.load_camera_angle.desc": "Load the camera angle '%0'",
- "action.slider_face_tint": "Tint Index",
- "action.slider_face_tint.desc": "Set the tint index of the current face. -1 means unset.",
- "menu.help.quickstart": "Quickstart Wizard",
- "menu.help.developer": "Developer",
- "menu.help.developer.dev_tools": "Open Dev Tools",
- "menu.help.developer.reset_storage": "Factory Reset",
- "menu.help.developer.reset_storage.confirm": "Are you sure you want to reset Blockbench to factory settings? This will delete all custom settings, keybindings and installed plugins.",
- "menu.help.developer.cache_reload": "Cache Reload",
- "menu.texture.resize": "Resize...",
- "menu.preview.orthographic": "Orthographic",
- "menu.preview.save_angle": "Save Angle...",
+ "action.toggle_camera_projection": "Basculer projection caméra",
+ "action.toggle_camera_projection.desc": "Basculer la projection caméra entre perspective et orthographique",
+ "action.load_camera_angle": "Angle de caméra : %0",
+ "action.load_camera_angle.desc": "Charge l'angle de caméra '%0'",
+ "action.slider_face_tint": "Index de teinte",
+ "action.slider_face_tint.desc": "Définit l'index de teinte de la face actuelle. -1 indique qu'il n'est pas défini.",
+ "menu.help.quickstart": "Wizard démarrage rapide",
+ "menu.help.developer": "Développeur",
+ "menu.help.developer.dev_tools": "Ouvrir outils développeur",
+ "menu.help.developer.reset_storage": "Formatage d'usine",
+ "menu.help.developer.reset_storage.confirm": "Voulez-vous vraiment réinitialiser Blockbench à ses paramètres d'usine ? Cela effacera tout paramètre personnalisé, raccourci et plugin installé.",
+ "menu.help.developer.cache_reload": "Rechargement cache",
+ "menu.texture.resize": "Redimentionner…",
+ "menu.preview.orthographic": "Orthographique",
+ "menu.preview.save_angle": "Sauvegarder angle…",
"menu.preview.angle": "Angles",
- "menu.preview.angle.initial": "Initial Angle",
- "menu.preview.angle.load": "Load",
- "menu.preview.maximize": "Maximize",
- "panel.color.both": "Both",
- "uv_editor.copy_selection": "Copy Selection",
- "uv_editor.paste_selection": "Paste Selection",
- "uv_editor.copy_paste_tool.place": "Place",
- "uv_editor.copy_paste_tool.cut": "Cut",
- "uv_editor.copy_paste_tool.mirror_x": "Mirror X",
- "uv_editor.copy_paste_tool.mirror_y": "Mirror Y",
- "uv_editor.copy_paste_tool.rotate": "Rotate 90 Degrees"
+ "menu.preview.angle.initial": "Angle initial",
+ "menu.preview.angle.load": "Charger",
+ "menu.preview.maximize": "Maximiser",
+ "panel.color.both": "Les deux",
+ "uv_editor.copy_selection": "Copier la sélection",
+ "uv_editor.paste_selection": "Coller la sélection",
+ "uv_editor.copy_paste_tool.place": "Placer",
+ "uv_editor.copy_paste_tool.cut": "Couper",
+ "uv_editor.copy_paste_tool.mirror_x": "Miroir X",
+ "uv_editor.copy_paste_tool.mirror_y": "Miroir Y",
+ "uv_editor.copy_paste_tool.rotate": "Rotation de 90 degrés"
}
\ No newline at end of file
diff --git a/lang/ja.json b/lang/ja.json
index 4917524d3..7f4806b31 100644
--- a/lang/ja.json
+++ b/lang/ja.json
@@ -669,7 +669,7 @@
"panel.variable_placeholders.info": "プレビューする変数を 名前 = 値で表示する",
"status_bar.vertex_distance": "間隔:%0",
"dialog.create_gif.title": "GIF",
- "dialog.create_gif.length": "Length",
+ "dialog.create_gif.length": "長さ",
"dialog.create_gif.fps": "FPS",
"dialog.create_gif.compression": "圧縮率",
"dialog.create_gif.play": "アニメーションを再生",
@@ -979,8 +979,8 @@
"timeline.timeline": "取扱説明書",
"menu.palette.load": "パレットをロード",
"menu.palette.load.default": "デフォルト",
- "panel.color.picker": "スポイト",
- "panel.color.palette": "パレット",
+ "panel.color.picker": "Picker",
+ "panel.color.palette": "Palette",
"generic.import": "インポート",
"settings.brush_modifier.none": "なし",
"action.export_entity": "統合版Entityをエクスポート",
@@ -991,101 +991,101 @@
"action.add_marker.desc": "タイムラインマーカーを設定します",
"timeline.pre_effect_script": "Script",
"format.skin": "Skin",
- "format.skin.desc": "Edit player and entity skins",
- "message.sketchfab.setup_guide": "Want to learn how to set up models in Sketchfab? Read %0",
- "dialog.skin.title": "Create Skin",
- "dialog.skin.model": "Skin",
- "dialog.skin.texture": "Texture (Optional)",
- "action.toggle_skin_layer": "Toggle Skin Layer",
- "action.toggle_skin_layer.desc": "Toggle the hat and clothing layer of the skin model",
- "action.gui_light": "GUI Light",
- "action.gui_light.desc": "Select the way the item is lit in the inventory",
- "action.gui_light.side": "Side Light",
- "action.gui_light.front": "Front Light",
- "action.move_keyframe_back": "Move Keyframes Back",
- "action.move_keyframe_forth": "Move Keyframes Forth",
+ "format.skin.desc": "スキンを編集",
+ "message.sketchfab.setup_guide": "Sketchfabでモデルを設定する方法を学びたいですか?%0",
+ "dialog.skin.title": "Skin",
+ "dialog.skin.model": "スキン",
+ "dialog.skin.texture": "テクスチャを追加",
+ "action.toggle_skin_layer": "レイヤーを切り替え",
+ "action.toggle_skin_layer.desc": "スキンモデルのレイヤーを切り替えます",
+ "action.gui_light": "GUIライト",
+ "action.gui_light.desc": "インベントリでアイテムを照らす方法を選択します",
+ "action.gui_light.side": "Sideライト",
+ "action.gui_light.front": "Frontライト",
+ "action.move_keyframe_back": "キーフレームを戻す",
+ "action.move_keyframe_forth": "キーフレームを前方に移動する",
"menu.help": "Help",
- "menu.help.discord": "Discord Server",
- "menu.help.report_issue": "Report an Issue",
- "menu.help.plugin_documentation": "Plugin API Documentation",
- "menu.help.search_action": "Search and Run Action",
- "menu.help.donate": "Donate",
+ "menu.help.discord": "Discord",
+ "menu.help.report_issue": "問題を報告",
+ "menu.help.plugin_documentation": "プラグインAPI",
+ "menu.help.search_action": "検索および実行",
+ "menu.help.donate": "寄付",
"menu.help.about": "About...",
- "menu.preview.background.clipboard": "Load from Clipboard",
- "dialog.ignore": "Ignore",
+ "menu.preview.background.clipboard": "クリップボードから読み込む",
+ "dialog.ignore": "スルー",
"generic.unset": "Unset",
- "message.invalid_builtin_parent.title": "Invalid Built-in Parent",
- "message.invalid_builtin_parent.message": "The link to the invalid parent model '%0' was removed in order to export a valid model.",
- "dialog.resize_texture.fill": "Fill with",
+ "message.invalid_builtin_parent.title": "Error",
+ "message.invalid_builtin_parent.message": "有効なモデルをエクスポートするために、無効なモデル '%0'へのリンクが削除されました。",
+ "dialog.resize_texture.fill": "Fill",
"dialog.resize_texture.fill.transparent": "Transparent",
"dialog.resize_texture.fill.color": "Color",
"dialog.resize_texture.fill.repeat": "Repeat",
"dialog.resize_texture.fill.stretch": "Stretch",
"dialog.scale.element_pivot": "Element Pivot",
"dialog.scale.selection_center": "Selection Center",
- "dialog.create_gif.length_mode": "Length Mode",
+ "dialog.create_gif.length_mode": "Lengthモード",
"dialog.create_gif.length_mode.seconds": "Seconds",
- "dialog.create_gif.length_mode.frames": "Frames",
- "dialog.create_gif.length_mode.animation": "Animation Length",
- "dialog.create_gif.length_mode.turntable": "Turntable Rotation",
- "dialog.save_angle.projection": "Projection",
- "dialog.save_angle.projection.perspective": "Perspective",
- "dialog.save_angle.projection.orthographic": "Orthographic",
- "dialog.sketchfab_uploader.animations": "Animations",
- "dialog.settings.theme": "Theme",
- "settings.category.interface": "Interface",
- "settings.preview_checkerboard": "Preview Checkerboard",
- "settings.preview_checkerboard.desc": "Toggle the checkerboard background behind the preview",
- "settings.uv_checkerboard": "UV Editor Checkerboard",
- "settings.uv_checkerboard.desc": "Toggle the checkerboard background behind the UV editor",
- "category.paint": "Paint",
+ "dialog.create_gif.length_mode.frames": "フレーム",
+ "dialog.create_gif.length_mode.animation": "アニメーションの長さ",
+ "dialog.create_gif.length_mode.turntable": "ターンテーブル",
+ "dialog.save_angle.projection": "プロジェクション",
+ "dialog.save_angle.projection.perspective": "視点",
+ "dialog.save_angle.projection.orthographic": "直交",
+ "dialog.sketchfab_uploader.animations": "アニメーション",
+ "dialog.settings.theme": "テーマ",
+ "settings.category.interface": "インタフェース",
+ "settings.preview_checkerboard": "プレビュー",
+ "settings.preview_checkerboard.desc": "プレビューチェッカーボードの背景を切り替えます",
+ "settings.uv_checkerboard": "UV エディター",
+ "settings.uv_checkerboard.desc": "UVエディターのチェッカーボードの背景を切り替えます",
+ "category.paint": "ペイント",
"action.fill_mode.color_connected": "Connected Colors",
- "action.draw_shape_type": "Shape Type",
- "action.draw_shape_type.rectangle": "Rectangle",
- "action.draw_shape_type.rectangle_h": "Rectangle (Hollow)",
- "action.draw_shape_type.ellipse": "Ellipse",
- "action.draw_shape_type.ellipse_h": "Ellipse (Hollow)",
- "action.draw_shape_type.line": "Line",
- "action.mirror_painting": "Mirror Painting",
- "action.mirror_painting.description": "Mirror your paint strokes to the other side of the model",
- "action.lock_alpha": "Lock Alpha Channel",
- "action.lock_alpha.description": "Lock the transparency of all pixels",
- "action.draw_shape_tool": "Draw Shape",
- "action.draw_shape_tool.desc": "Tool to draw simple shapes on textures",
- "action.copy_paste_tool": "Copy Paste Tool",
- "action.copy_paste_tool.desc": "Tool to copy and paste selections of textures",
- "action.export_gltf": "Export As glTF",
- "action.export_gltf.desc": "Export model and animations as glTF file to use in other 3D applications",
+ "action.draw_shape_type": "シャープ",
+ "action.draw_shape_type.rectangle": "四角形■",
+ "action.draw_shape_type.rectangle_h": "四角形□",
+ "action.draw_shape_type.ellipse": "円●",
+ "action.draw_shape_type.ellipse_h": "円○",
+ "action.draw_shape_type.line": "線",
+ "action.mirror_painting": "ミラーペイント",
+ "action.mirror_painting.description": "モデルの反対側にもペイントします",
+ "action.lock_alpha": "アルファチャンネルを固定",
+ "action.lock_alpha.description": "ピクセルの透明度をロックします",
+ "action.draw_shape_tool": "図形",
+ "action.draw_shape_tool.desc": "テクスチャにシンプルな形状を描きます",
+ "action.copy_paste_tool": "コピーペースト",
+ "action.copy_paste_tool.desc": "選択したテクスチャをコピー/貼り付けする",
+ "action.export_gltf": "glTFとしてエクスポート",
+ "action.export_gltf.desc": "モデルとアニメーションをglTFファイルとしてエクスポートします",
"action.transform_space": "Transform Space",
"action.transform_space.desc": "Default transform space for elements and bones",
"action.transform_space.global": "Global",
"action.transform_space.bone": "Bone",
"action.transform_space.local": "Local",
- "action.toggle_camera_projection": "Toggle Camera Projection",
- "action.toggle_camera_projection.desc": "Toggle the camera projection between perspective and orthographic",
- "action.load_camera_angle": "Camera Angle: %0",
- "action.load_camera_angle.desc": "Load the camera angle '%0'",
- "action.slider_face_tint": "Tint Index",
- "action.slider_face_tint.desc": "Set the tint index of the current face. -1 means unset.",
- "menu.help.quickstart": "Quickstart Wizard",
- "menu.help.developer": "Developer",
- "menu.help.developer.dev_tools": "Open Dev Tools",
- "menu.help.developer.reset_storage": "Factory Reset",
- "menu.help.developer.reset_storage.confirm": "Are you sure you want to reset Blockbench to factory settings? This will delete all custom settings, keybindings and installed plugins.",
- "menu.help.developer.cache_reload": "Cache Reload",
- "menu.texture.resize": "Resize...",
+ "action.toggle_camera_projection": "カメラの切り替え",
+ "action.toggle_camera_projection.desc": "カメラの投影を遠近法と正投影法の間で切り替えます",
+ "action.load_camera_angle": "カメラアングル: %0",
+ "action.load_camera_angle.desc": "カメラアングル '%0'を読み込みます",
+ "action.slider_face_tint": "色合い指数",
+ "action.slider_face_tint.desc": "現在の顔の色合い指数を設定します。 -1は未設定を意味します",
+ "menu.help.quickstart": "クイックスタート",
+ "menu.help.developer": "デベロッパー",
+ "menu.help.developer.dev_tools": "開発ツールを開く",
+ "menu.help.developer.reset_storage": "初期化",
+ "menu.help.developer.reset_storage.confirm": "Blockbenchを工場出荷時設定にリセットします。すべてのカスタム設定、キーバインド、およびインストールされたプラグインが削除されます。",
+ "menu.help.developer.cache_reload": "キャッシュのリロード",
+ "menu.texture.resize": "リサイズ...",
"menu.preview.orthographic": "Orthographic",
- "menu.preview.save_angle": "Save Angle...",
- "menu.preview.angle": "Angles",
- "menu.preview.angle.initial": "Initial Angle",
- "menu.preview.angle.load": "Load",
- "menu.preview.maximize": "Maximize",
+ "menu.preview.save_angle": "アングルを保存...",
+ "menu.preview.angle": "アングル",
+ "menu.preview.angle.initial": "初期角度",
+ "menu.preview.angle.load": "ロード",
+ "menu.preview.maximize": "最大化",
"panel.color.both": "Both",
- "uv_editor.copy_selection": "Copy Selection",
- "uv_editor.paste_selection": "Paste Selection",
- "uv_editor.copy_paste_tool.place": "Place",
- "uv_editor.copy_paste_tool.cut": "Cut",
+ "uv_editor.copy_selection": "選択範囲をコピー",
+ "uv_editor.paste_selection": "選択範囲を貼り付け",
+ "uv_editor.copy_paste_tool.place": "配置",
+ "uv_editor.copy_paste_tool.cut": "カット",
"uv_editor.copy_paste_tool.mirror_x": "Mirror X",
"uv_editor.copy_paste_tool.mirror_y": "Mirror Y",
- "uv_editor.copy_paste_tool.rotate": "Rotate 90 Degrees"
+ "uv_editor.copy_paste_tool.rotate": "Rotate 90°"
}
\ No newline at end of file
diff --git a/lang/zh.json b/lang/zh.json
index 279661f0f..7034904d8 100644
--- a/lang/zh.json
+++ b/lang/zh.json
@@ -336,7 +336,7 @@
"action.load_plugin": "从文件加载插件",
"action.load_plugin.desc": "通过导入源文件来加载插件。",
"action.reload_plugins": "重载插件",
- "action.reload_plugins.desc": "重载所有开发插件。",
+ "action.reload_plugins.desc": "重新载入所有开发插件",
"action.uv_dialog": "打开全部 UV 窗口",
"action.uv_dialog.desc": "打开 UV 对话框以查看彼此相邻的所有面",
"action.uv_dialog_full": "大视图",
@@ -419,8 +419,8 @@
"action.rescale_toggle.desc": "根据当前旋转重新缩放立方体",
"action.bone_reset_toggle": "重置骨骼",
"action.bone_reset_toggle.desc": "阻止骨骼显示父模型中的立方体",
- "action.reload": "重载 Blockbench",
- "action.reload.desc": "重载 Blockbench,这将删除所有未保存的进度",
+ "action.reload": "重启 Blockbench",
+ "action.reload.desc": "重启 Blockbench,如果你有未保存的工程将会丢失",
"menu.file": "文件",
"menu.edit": "编辑",
"menu.transform": "模型控制",
@@ -705,7 +705,7 @@
"action.open_backup_folder.desc": "打开 Blockbench 备份文件夹",
"switches.mirror": "镜像 UV",
"language_name": "简体中文",
- "message.plugin_reload": "已重载 %0 个本地插件",
+ "message.plugin_reload": "已重新载入 %0 个本地插件",
"settings.brightness": "亮度",
"settings.brightness.desc": "预览的亮度,默认值为 50",
"menu.preview.perspective.reset": "重置相机位置",
@@ -1012,80 +1012,80 @@
"menu.help.donate": "捐赠",
"menu.help.about": "关于……",
"menu.preview.background.clipboard": "从剪贴板中进行加载",
- "dialog.ignore": "Ignore",
- "generic.unset": "Unset",
- "message.invalid_builtin_parent.title": "Invalid Built-in Parent",
- "message.invalid_builtin_parent.message": "The link to the invalid parent model '%0' was removed in order to export a valid model.",
- "dialog.resize_texture.fill": "Fill with",
- "dialog.resize_texture.fill.transparent": "Transparent",
- "dialog.resize_texture.fill.color": "Color",
- "dialog.resize_texture.fill.repeat": "Repeat",
- "dialog.resize_texture.fill.stretch": "Stretch",
- "dialog.scale.element_pivot": "Element Pivot",
- "dialog.scale.selection_center": "Selection Center",
- "dialog.create_gif.length_mode": "Length Mode",
- "dialog.create_gif.length_mode.seconds": "Seconds",
- "dialog.create_gif.length_mode.frames": "Frames",
- "dialog.create_gif.length_mode.animation": "Animation Length",
- "dialog.create_gif.length_mode.turntable": "Turntable Rotation",
- "dialog.save_angle.projection": "Projection",
- "dialog.save_angle.projection.perspective": "Perspective",
- "dialog.save_angle.projection.orthographic": "Orthographic",
- "dialog.sketchfab_uploader.animations": "Animations",
- "dialog.settings.theme": "Theme",
- "settings.category.interface": "Interface",
- "settings.preview_checkerboard": "Preview Checkerboard",
- "settings.preview_checkerboard.desc": "Toggle the checkerboard background behind the preview",
- "settings.uv_checkerboard": "UV Editor Checkerboard",
- "settings.uv_checkerboard.desc": "Toggle the checkerboard background behind the UV editor",
- "category.paint": "Paint",
- "action.fill_mode.color_connected": "Connected Colors",
- "action.draw_shape_type": "Shape Type",
- "action.draw_shape_type.rectangle": "Rectangle",
- "action.draw_shape_type.rectangle_h": "Rectangle (Hollow)",
- "action.draw_shape_type.ellipse": "Ellipse",
- "action.draw_shape_type.ellipse_h": "Ellipse (Hollow)",
- "action.draw_shape_type.line": "Line",
- "action.mirror_painting": "Mirror Painting",
- "action.mirror_painting.description": "Mirror your paint strokes to the other side of the model",
- "action.lock_alpha": "Lock Alpha Channel",
- "action.lock_alpha.description": "Lock the transparency of all pixels",
- "action.draw_shape_tool": "Draw Shape",
- "action.draw_shape_tool.desc": "Tool to draw simple shapes on textures",
- "action.copy_paste_tool": "Copy Paste Tool",
- "action.copy_paste_tool.desc": "Tool to copy and paste selections of textures",
- "action.export_gltf": "Export As glTF",
- "action.export_gltf.desc": "Export model and animations as glTF file to use in other 3D applications",
- "action.transform_space": "Transform Space",
- "action.transform_space.desc": "Default transform space for elements and bones",
- "action.transform_space.global": "Global",
- "action.transform_space.bone": "Bone",
- "action.transform_space.local": "Local",
- "action.toggle_camera_projection": "Toggle Camera Projection",
- "action.toggle_camera_projection.desc": "Toggle the camera projection between perspective and orthographic",
- "action.load_camera_angle": "Camera Angle: %0",
- "action.load_camera_angle.desc": "Load the camera angle '%0'",
- "action.slider_face_tint": "Tint Index",
- "action.slider_face_tint.desc": "Set the tint index of the current face. -1 means unset.",
- "menu.help.quickstart": "Quickstart Wizard",
- "menu.help.developer": "Developer",
- "menu.help.developer.dev_tools": "Open Dev Tools",
- "menu.help.developer.reset_storage": "Factory Reset",
- "menu.help.developer.reset_storage.confirm": "Are you sure you want to reset Blockbench to factory settings? This will delete all custom settings, keybindings and installed plugins.",
- "menu.help.developer.cache_reload": "Cache Reload",
- "menu.texture.resize": "Resize...",
- "menu.preview.orthographic": "Orthographic",
- "menu.preview.save_angle": "Save Angle...",
- "menu.preview.angle": "Angles",
- "menu.preview.angle.initial": "Initial Angle",
- "menu.preview.angle.load": "Load",
- "menu.preview.maximize": "Maximize",
- "panel.color.both": "Both",
- "uv_editor.copy_selection": "Copy Selection",
- "uv_editor.paste_selection": "Paste Selection",
- "uv_editor.copy_paste_tool.place": "Place",
- "uv_editor.copy_paste_tool.cut": "Cut",
- "uv_editor.copy_paste_tool.mirror_x": "Mirror X",
- "uv_editor.copy_paste_tool.mirror_y": "Mirror Y",
- "uv_editor.copy_paste_tool.rotate": "Rotate 90 Degrees"
+ "dialog.ignore": "忽略",
+ "generic.unset": "取消设置",
+ "message.invalid_builtin_parent.title": "内置的父级模型无效",
+ "message.invalid_builtin_parent.message": "为了导出可用的模型文件,删除了无效的内置父级模型 “%0”",
+ "dialog.resize_texture.fill": "填充",
+ "dialog.resize_texture.fill.transparent": "透明",
+ "dialog.resize_texture.fill.color": "颜色",
+ "dialog.resize_texture.fill.repeat": "重复",
+ "dialog.resize_texture.fill.stretch": "伸展",
+ "dialog.scale.element_pivot": "元素枢轴",
+ "dialog.scale.selection_center": "选择中心",
+ "dialog.create_gif.length_mode": "长度模式",
+ "dialog.create_gif.length_mode.seconds": "秒",
+ "dialog.create_gif.length_mode.frames": "框架",
+ "dialog.create_gif.length_mode.animation": "动画长度",
+ "dialog.create_gif.length_mode.turntable": "转盘旋转",
+ "dialog.save_angle.projection": "投影",
+ "dialog.save_angle.projection.perspective": "透视图",
+ "dialog.save_angle.projection.orthographic": "正射投影",
+ "dialog.sketchfab_uploader.animations": "动画制作",
+ "dialog.settings.theme": "主题",
+ "settings.category.interface": "界面",
+ "settings.preview_checkerboard": "预览网格",
+ "settings.preview_checkerboard.desc": "修改预览网格的背景",
+ "settings.uv_checkerboard": "UV编辑器网格",
+ "settings.uv_checkerboard.desc": "修改UV编辑器后的网格背景",
+ "category.paint": "漆",
+ "action.fill_mode.color_connected": "联系的颜色",
+ "action.draw_shape_type": "形状类型",
+ "action.draw_shape_type.rectangle": "矩形",
+ "action.draw_shape_type.rectangle_h": "矩形(空心)",
+ "action.draw_shape_type.ellipse": "椭圆",
+ "action.draw_shape_type.ellipse_h": "椭圆(空心)",
+ "action.draw_shape_type.line": "直线",
+ "action.mirror_painting": "镜像绘画",
+ "action.mirror_painting.description": "在一边绘画像素的同时另一也会有同样的像素",
+ "action.lock_alpha": "锁定 Alpha 通道",
+ "action.lock_alpha.description": "锁定所有像素的透明度",
+ "action.draw_shape_tool": "绘制形状",
+ "action.draw_shape_tool.desc": "在贴图上绘制简单形状的工具",
+ "action.copy_paste_tool": "复制粘贴工具",
+ "action.copy_paste_tool.desc": "复制和粘贴材质的工具",
+ "action.export_gltf": "导出为 glTF 文件",
+ "action.export_gltf.desc": "将模型和动画导出为 glTF 文件使其能在其他3D建模软件中使用",
+ "action.transform_space": "变换空间",
+ "action.transform_space.desc": "默认转换元素体素和绑骨",
+ "action.transform_space.global": "全部",
+ "action.transform_space.bone": "绑骨",
+ "action.transform_space.local": "本地",
+ "action.toggle_camera_projection": "切换相机投影",
+ "action.toggle_camera_projection.desc": "切换透视图和正视之间的相机投影",
+ "action.load_camera_angle": "摄影机角度: %0",
+ "action.load_camera_angle.desc": "载入相机角度 “%0”",
+ "action.slider_face_tint": "色调指数",
+ "action.slider_face_tint.desc": "设置当前面的色调索引, -1 表示不设置 ",
+ "menu.help.quickstart": "快速入门向导",
+ "menu.help.developer": "开发者",
+ "menu.help.developer.dev_tools": "打开开发工具",
+ "menu.help.developer.reset_storage": "恢复全部默认设置",
+ "menu.help.developer.reset_storage.confirm": "你确定要将 Blockbench 重置为默认设置吗?\n这将重置或删除所有自定义设置,按键绑定和已安装的插件",
+ "menu.help.developer.cache_reload": "缓存刷新",
+ "menu.texture.resize": "调整大小",
+ "menu.preview.orthographic": "预览正交",
+ "menu.preview.save_angle": "保存角度",
+ "menu.preview.angle": "角度",
+ "menu.preview.angle.initial": "初始角度",
+ "menu.preview.angle.load": "加载",
+ "menu.preview.maximize": "最大化",
+ "panel.color.both": "两者",
+ "uv_editor.copy_selection": "复制所选内容",
+ "uv_editor.paste_selection": "粘贴所选内容",
+ "uv_editor.copy_paste_tool.place": "此地",
+ "uv_editor.copy_paste_tool.cut": "剪切",
+ "uv_editor.copy_paste_tool.mirror_x": "镜像 X 轴",
+ "uv_editor.copy_paste_tool.mirror_y": "镜像 Y 轴",
+ "uv_editor.copy_paste_tool.rotate": "旋转90度"
}
\ No newline at end of file
diff --git a/package.json b/package.json
index 5fc52803f..c15cfa5ae 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "Blockbench",
"description": "Model editing and animation software",
- "version": "3.4.0",
+ "version": "3.4.1",
"license": "MIT",
"author": {
"name": "JannisX11",