This commit is contained in:
JannisX11 2020-03-10 22:19:17 +01:00
parent d3d50ffc79
commit 7941f20437
31 changed files with 622 additions and 690 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
/dist/
index.php
package-lock.json
node_modules/

View File

@ -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).

View File

@ -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);
}

View File

@ -23,7 +23,7 @@
<script>
if (typeof module === 'object') {window.module = module; module = undefined;}//jQuery Fix
const isApp = typeof require !== 'undefined';
const appVersion = '3.4.0';
const appVersion = '3.4.1';
</script>
<div id="loading_error_message" style="display: none;">
<div>An error occurred while loading Blockbench</div>
@ -58,6 +58,7 @@
<script src="js/interface/actions.js"></script>
<script src="js/interface/themes.js"></script>
<script src="js/blockbench.js"></script>
<script src="js/modes.js"></script>
<script src="js/interface/keyboard.js"></script>
<script src="js/interface/settings.js"></script>
<script src="js/interface/dialog.js"></script>

View File

@ -1225,6 +1225,7 @@ const Animator = {
animation.getBoneAnimator(group).displayFrame(Timeline.time)
}
})
group.mesh.updateMatrixWorld()
})
Animator.animations.forEach(animation => {

View File

@ -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]}}}')
}

View File

@ -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) {

View File

@ -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()

View File

@ -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: [

View File

@ -85,7 +85,15 @@ function Dialog(settings) {
switch (data.type) {
default:
bar.append(`<input class="dark_bordered half focusable_input" type="text" id="${form_id}" value="${data.value||''}" placeholder="${data.placeholder||''}">`)
bar.append(`<input class="dark_bordered half focusable_input" type="text" id="${form_id}" value="${data.value||''}" placeholder="${data.placeholder||''}" ${data.list ? `list="${scope.id}_${form_id}_list"` : ''}>`)
if (data.list) {
let id = `${scope.id}_${form_id}_list`
let list = $(`<datalist id="${scope.id}_${form_id}_list"></datalist>`)
for (let value of data.list) {
list.append(`<option value="${value}">`)
}
bar.append(list)
}
break;
case 'textarea':
bar.append(`<textarea class="focusable_input" style="height: ${data.height||150}px;" id="${form_id}"></textarea>`)

View File

@ -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
}

View File

@ -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;

View File

@ -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},

View File

@ -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'

View File

@ -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 {

View File

@ -2792,7 +2792,7 @@ skin_presets.panda = `{
"textureheight": 64,
"eyes": [
[11, 19, 2, 1],
[18, 19, 2, 1],
[18, 19, 2, 1]
],
"bones": [
{

156
js/modes.js Normal file
View File

@ -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})
}
})

View File

@ -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')

View File

@ -502,6 +502,8 @@ class NonGroup extends OutlinerElement {
break;
}
}
NonGroup.selected = selected;
NonGroup.all = elements;
Array.prototype.findRecursive = function(key1, val) {
var i = 0

View File

@ -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;

View File

@ -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) {

View File

@ -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) {

View File

@ -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)
})

View File

@ -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', {

View File

@ -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"
}

View File

@ -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",

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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°"
}

View File

@ -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度"
}

View File

@ -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",