2
0
mirror of https://github.com/JannisX11/blockbench.git synced 2025-03-19 17:01:55 +08:00
This commit is contained in:
JannisX11 2019-07-19 17:31:22 +02:00
parent 5c5765f154
commit abdf97db96
41 changed files with 541 additions and 439 deletions

@ -1,7 +1,7 @@
/*Defaults*/
div.tool.wide {
width: 72px;
padding-top: 0px;
padding: 1px 0;
}
.hidden, .tooltip_shift, .custom_select ul, .mobile_only, .m_disp {
display: none;
@ -81,6 +81,9 @@
height: 40px;
padding-bottom: 5px;
}
input.medium_width {
width: 64px;
}
/*General*/
canvas.preview {
@ -457,7 +460,7 @@
margin-left: auto;
margin-right: auto;
background-color: var(--color-ui);
overflow-y: auto;
overflow-y: scroll;
image-rendering: auto;
}
#start_screen > content > section {

@ -327,6 +327,9 @@
background: var(--color-accent);
color: var(--color-text_acc);
}
#display_sliders p {
margin-top: 6px;
}
/*Outliner*/
#cubes_list {

@ -430,9 +430,9 @@
opacity: 0.6;
}
div.nslide {
height: 30px;
height: 28px;
width: 100%;
padding: 4px;
padding: 3px;
padding-left: 6px;
cursor: e-resize;
overflow: hidden;
@ -477,4 +477,7 @@
}
input:checked + label.toggle_panel {
background-color: var(--color-selected);
}
}
.y_scrollable {
overflow-y: scroll;
}

@ -26,7 +26,7 @@
<script>
if (typeof module === 'object') {window.module = module; module = undefined;}//jQuery Fix
const isApp = typeof require !== 'undefined';
const appVersion = '3.0.1';
const appVersion = '3.0.2';
</script>
<script src="lib/vue.min.js"></script>
<script src="lib/vue_sortable.js"></script>
@ -338,11 +338,11 @@
<label class="tl">data.origin</label>
<div class="dialog_bar">
<label for="scaling_origin_x" class="inline_label tl">X</label>
<input type="number" id="scaling_origin_x" class="dark_bordered mediun_width" oninput="scaleAll()">
<input type="number" id="scaling_origin_x" class="dark_bordered medium_width" oninput="scaleAll()">
<label for="scaling_origin_y" class="inline_label tl">Y</label>
<input type="number" id="scaling_origin_y" class="dark_bordered mediun_width" oninput="scaleAll()">
<input type="number" id="scaling_origin_y" class="dark_bordered medium_width" oninput="scaleAll()">
<label for="scaling_origin_z" class="inline_label tl">Z</label>
<input type="number" id="scaling_origin_z" class="dark_bordered mediun_width" oninput="scaleAll()">
<input type="number" id="scaling_origin_z" class="dark_bordered medium_width" oninput="scaleAll()">
</div>
<label class="tl">dialog.scale.scale</label>
@ -530,122 +530,124 @@
<div id="layout_settings" class="hidden tab_content">
<h2 class="tl i_b">dialog.settings.layout</h2>
<div class="bar next_to_title" id="layout_title_bar"></div>
<div id="color_wrapper">
<div class="color_field">
<input type="color" class="color_input" id="color_ui" oninput="changeUIColor(event)" onclick="initUIColor(event)">
<label for="color_ui" style="background-color: var(--color-ui)" class="color_input"></label>
<div class="desc">
<h4 class="tl">layout.color.ui</h4>
<p class="tl">layout.color.ui.desc</p>
<div class="y_scrollable" id="layout_list">
<div id="color_wrapper">
<div class="color_field">
<input type="color" class="color_input" id="color_ui" oninput="changeUIColor(event)" onclick="initUIColor(event)">
<label for="color_ui" style="background-color: var(--color-ui)" class="color_input"></label>
<div class="desc">
<h4 class="tl">layout.color.ui</h4>
<p class="tl">layout.color.ui.desc</p>
</div>
</div>
<div class="color_field">
<input type="color" class="color_input" id="color_bright_ui" oninput="changeUIColor(event)" onclick="initUIColor(event)">
<label for="color_bright_ui" style="background-color: var(--color-bright_ui)" class="color_input"></label>
<div class="desc">
<h4 class="tl">layout.color.bright_ui</h4>
<p class="tl">layout.color.bright_ui.desc</p>
</div>
</div>
<div class="color_field">
<input type="color" class="color_input" id="color_back" oninput="changeUIColor(event)" onclick="initUIColor(event)">
<label for="color_back" style="background-color: var(--color-back)" class="color_input"></label>
<div class="desc">
<h4 class="tl">layout.color.back</h4>
<p class="tl">layout.color.back.desc</p>
</div>
</div>
<div class="color_field">
<input type="color" class="color_input" id="color_dark" oninput="changeUIColor(event)" onclick="initUIColor(event)">
<label for="color_dark" style="background-color: var(--color-dark)" class="color_input"></label>
<div class="desc">
<h4 class="tl">layout.color.dark</h4>
<p class="tl">layout.color.dark.desc</p>
</div>
</div>
<!--Button-->
<div class="color_field">
<input type="color" class="color_input" id="color_button" oninput="changeUIColor(event)" onclick="initUIColor(event)">
<label for="color_button" style="background-color: var(--color-button)" class="color_input"></label>
<div class="desc">
<h4 class="tl">layout.color.button</h4>
<p class="tl">layout.color.button.desc</p>
</div>
</div>
<div class="color_field">
<input type="color" class="color_input" id="color_selected" oninput="changeUIColor(event)" onclick="initUIColor(event)">
<label for="color_selected" style="background-color: var(--color-selected)" class="color_input"></label>
<div class="desc">
<h4 class="tl">layout.color.selected</h4>
<p class="tl">layout.color.selected.desc</p>
</div>
</div>
<div class="color_field">
<input type="color" class="color_input" id="color_border" oninput="changeUIColor(event)" onclick="initUIColor(event)">
<label for="color_border" style="background-color: var(--color-border)" class="color_input"></label>
<div class="desc">
<h4 class="tl">layout.color.border</h4>
<p class="tl">layout.color.border.desc</p>
</div>
</div>
<div class="color_field">
<input type="color" class="color_input" id="color_accent" oninput="changeUIColor(event)" onclick="initUIColor(event)">
<label for="color_accent" style="background-color: var(--color-accent)" class="color_input"></label>
<div class="desc">
<h4 class="tl">layout.color.accent</h4>
<p class="tl">layout.color.accent.desc</p>
</div>
</div>
<div class="color_field">
<input type="color" class="color_input" id="color_text" oninput="changeUIColor(event)" onclick="initUIColor(event)">
<label for="color_text" style="background-color: var(--color-text)" class="color_input"></label>
<div class="desc">
<h4 class="tl">layout.color.text</h4>
<p class="tl">layout.color.text.desc</p>
</div>
</div>
<div class="color_field">
<input type="color" class="color_input" id="color_light" oninput="changeUIColor(event)" onclick="initUIColor(event)">
<label for="color_light" style="background-color: var(--color-light)" class="color_input"></label>
<div class="desc">
<h4 class="tl">layout.color.light</h4>
<p class="tl">layout.color.light.desc</p>
</div>
</div>
<div class="color_field">
<input type="color" class="color_input" id="color_text_acc" oninput="changeUIColor(event)" onclick="initUIColor(event)">
<label for="color_text_acc" style="background-color: var(--color-text_acc)" class="color_input"></label>
<div class="desc">
<h4 class="tl">layout.color.accent_text</h4>
<p class="tl">layout.color.accent_text.desc</p>
</div>
</div>
<div class="color_field">
<input type="color" class="color_input" id="color_grid" oninput="changeUIColor(event)" onclick="initUIColor(event)">
<label for="color_grid" style="background-color: var(--color-grid)" class="color_input"></label>
<div class="desc">
<h4 class="tl">layout.color.grid</h4>
<p class="tl">layout.color.grid.desc</p>
</div>
</div>
<div class="color_field">
<input type="color" class="color_input" id="color_wireframe" oninput="changeUIColor(event)" onclick="initUIColor(event)">
<label for="color_wireframe" style="background-color: var(--color-wireframe)" class="color_input"></label>
<div class="desc">
<h4 class="tl">layout.color.wireframe</h4>
<p class="tl">layout.color.wireframe.desc</p>
</div>
</div>
</div>
<div class="color_field">
<input type="color" class="color_input" id="color_bright_ui" oninput="changeUIColor(event)" onclick="initUIColor(event)">
<label for="color_bright_ui" style="background-color: var(--color-bright_ui)" class="color_input"></label>
<div class="desc">
<h4 class="tl">layout.color.bright_ui</h4>
<p class="tl">layout.color.bright_ui.desc</p>
</div>
</div>
<div class="color_field">
<input type="color" class="color_input" id="color_back" oninput="changeUIColor(event)" onclick="initUIColor(event)">
<label for="color_back" style="background-color: var(--color-back)" class="color_input"></label>
<div class="desc">
<h4 class="tl">layout.color.back</h4>
<p class="tl">layout.color.back.desc</p>
</div>
</div>
<div class="color_field">
<input type="color" class="color_input" id="color_dark" oninput="changeUIColor(event)" onclick="initUIColor(event)">
<label for="color_dark" style="background-color: var(--color-dark)" class="color_input"></label>
<div class="desc">
<h4 class="tl">layout.color.dark</h4>
<p class="tl">layout.color.dark.desc</p>
</div>
</div>
<!--Button-->
<div class="color_field">
<input type="color" class="color_input" id="color_button" oninput="changeUIColor(event)" onclick="initUIColor(event)">
<label for="color_button" style="background-color: var(--color-button)" class="color_input"></label>
<div class="desc">
<h4 class="tl">layout.color.button</h4>
<p class="tl">layout.color.button.desc</p>
</div>
</div>
<div class="color_field">
<input type="color" class="color_input" id="color_selected" oninput="changeUIColor(event)" onclick="initUIColor(event)">
<label for="color_selected" style="background-color: var(--color-selected)" class="color_input"></label>
<div class="desc">
<h4 class="tl">layout.color.selected</h4>
<p class="tl">layout.color.selected.desc</p>
</div>
</div>
<div class="color_field">
<input type="color" class="color_input" id="color_border" oninput="changeUIColor(event)" onclick="initUIColor(event)">
<label for="color_border" style="background-color: var(--color-border)" class="color_input"></label>
<div class="desc">
<h4 class="tl">layout.color.border</h4>
<p class="tl">layout.color.border.desc</p>
</div>
</div>
<div class="color_field">
<input type="color" class="color_input" id="color_accent" oninput="changeUIColor(event)" onclick="initUIColor(event)">
<label for="color_accent" style="background-color: var(--color-accent)" class="color_input"></label>
<div class="desc">
<h4 class="tl">layout.color.accent</h4>
<p class="tl">layout.color.accent.desc</p>
</div>
</div>
<div class="color_field">
<input type="color" class="color_input" id="color_text" oninput="changeUIColor(event)" onclick="initUIColor(event)">
<label for="color_text" style="background-color: var(--color-text)" class="color_input"></label>
<div class="desc">
<h4 class="tl">layout.color.text</h4>
<p class="tl">layout.color.text.desc</p>
</div>
</div>
<div class="color_field">
<input type="color" class="color_input" id="color_light" oninput="changeUIColor(event)" onclick="initUIColor(event)">
<label for="color_light" style="background-color: var(--color-light)" class="color_input"></label>
<div class="desc">
<h4 class="tl">layout.color.light</h4>
<p class="tl">layout.color.light.desc</p>
</div>
</div>
<div class="color_field">
<input type="color" class="color_input" id="color_text_acc" oninput="changeUIColor(event)" onclick="initUIColor(event)">
<label for="color_text_acc" style="background-color: var(--color-text_acc)" class="color_input"></label>
<div class="desc">
<h4 class="tl">layout.color.accent_text</h4>
<p class="tl">layout.color.accent_text.desc</p>
</div>
</div>
<div class="color_field">
<input type="color" class="color_input" id="color_grid" oninput="changeUIColor(event)" onclick="initUIColor(event)">
<label for="color_grid" style="background-color: var(--color-grid)" class="color_input"></label>
<div class="desc">
<h4 class="tl">layout.color.grid</h4>
<p class="tl">layout.color.grid.desc</p>
</div>
</div>
<div class="color_field">
<input type="color" class="color_input" id="color_wireframe" oninput="changeUIColor(event)" onclick="initUIColor(event)">
<label for="color_wireframe" style="background-color: var(--color-wireframe)" class="color_input"></label>
<div class="desc">
<h4 class="tl">layout.color.wireframe</h4>
<p class="tl">layout.color.wireframe.desc</p>
</div>
</div>
</div>
<div class="dialog_bar">
<label class="name_space_left tl" for="layout_font_main">layout.font.main</label>
<input type="text" class="half dark_bordered" id="layout_font_main" oninput="changeUIFont('main')">
</div>
<div class="dialog_bar">
<label class="name_space_left tl" for="layout_font_main">layout.font.main</label>
<input type="text" class="half dark_bordered" id="layout_font_main" oninput="changeUIFont('main')">
</div>
<div class="dialog_bar">
<label class="name_space_left tl" for="layout_font_headline">layout.font.headline</label>
<input type="text" class="half dark_bordered" id="layout_font_headline" oninput="changeUIFont('headline')">
<div class="dialog_bar">
<label class="name_space_left tl" for="layout_font_headline">layout.font.headline</label>
<input type="text" class="half dark_bordered" id="layout_font_headline" oninput="changeUIFont('headline')">
</div>
</div>
</div>
@ -944,22 +946,29 @@
</div>
</div>
<div id="right_bar" class="sidebar">
<!--div id="options" class="panel selection_only">
<p class="tl">panel.options.angle</p>
<div class="toolbar_wrapper rotation"></div>
<p class="tl">data.origin</p>
<div class="toolbar_wrapper origin"></div>
</div-->
<div id="element" class="panel selection_only">
<p class="tl">panel.element.position</p>
<div class="toolbar_wrapper element_position"></div>
<p class="tl">panel.element.size</p>
<div class="toolbar_wrapper element_size"></div>
<p class="tl">panel.element.origin</p>
<div class="toolbar_wrapper element_origin"></div>
<p class="tl">panel.element.rotation</p>
<div class="toolbar_wrapper element_rotation"></div>
</div>
<div id="color" class="panel">
<div id="main_colorpicker_preview"><div></div></div>
<input id="main_colorpicker">
</div>
<div id="outliner" class="panel grow">
<div class="toolbar_wrapper outliner"></div>
<ul id="cubes_list" class="list">
<vue-tree :option="option"></vue-tree>
</ul>
</div>
<div id="chat" class="panel grow">
<div class="bar next_to_title" id="chat_title_bar"></div>
<ul id="chat_history" v-if="expanded">

@ -961,7 +961,7 @@ const Timeline = {
if (time == undefined || isNaN(time)) {
time = Timeline.second;
}
var fps = settings.animation_snap.value;
var fps = Math.clamp(settings.animation_snap.value, 1, 120);
return Math.clamp(Math.round(time*fps)/fps, 0);
},
setup() {
@ -1068,7 +1068,7 @@ const Timeline = {
$('#timeline_inner .keyframe:not(.ui-draggable)').draggable({
axis: 'x',
distance: 4,
helper: false,
helper: () => $('<div></div>'),
start: function(event, ui) {
Undo.initEdit({keyframes: Timeline.keyframes, keep_saved: true})
var id = $(ui.helper).attr('id')
@ -1148,7 +1148,7 @@ const Timeline = {
else {step = 0.05}
if (step < 1) {
var FPS = 1/settings.animation_snap.value;
var FPS = 1/Math.clamp(settings.animation_snap.value, 1, 120);
step = Math.round(step/FPS) * FPS
step = 1/Math.round(1/step)
}

@ -14,7 +14,7 @@ const Pressing = {
alt: false,
}
var main_uv;
const Prop = {
var Prop = {
active_panel : 'preview',
wireframe : false,
file_path : '',
@ -221,10 +221,14 @@ function updateSelection() {
main_uv.loadData()
$('.selection_only').css('visibility', 'visible')
} else {
$('.selection_only').css('visibility', 'hidden')
}
if (Group.selected && Format.bone_rig) {
$('.selection_only#options').css('visibility', 'visible')
if (Format.bone_rig && Group.selected) {
$('.selection_only').css('visibility', 'visible')
} else {
$('.selection_only').css('visibility', 'hidden')
if (Locator.selected.length) {
$('.selection_only#element').css('visibility', 'visible')
}
}
}
if (Modes.animate) {
if (Animator.selected && Group.selected) {
@ -441,7 +445,7 @@ setInterval(function() {
}, 1e3*30)
//Misc
const TickUpdates = {
Run: function() {
Run() {
if (TickUpdates.outliner) {
delete TickUpdates.outliner;
loadOutlinerDraggable()
@ -465,7 +469,7 @@ const TickUpdates = {
}
}
const Screencam = {
fullScreen: function(options, cb) {
fullScreen(options, cb) {
setTimeout(function() {
currentwindow.capturePage(function(screenshot) {
var dataUrl = screenshot.toDataURL()
@ -483,7 +487,7 @@ const Screencam = {
})
}, 40)
},
returnScreenshot: function(dataUrl, cb) {
returnScreenshot(dataUrl, cb) {
if (cb) {
cb(dataUrl)
} else if (isApp) {
@ -524,10 +528,10 @@ const Screencam = {
}).show()
}
},
cleanCanvas: function(options, cb) {
cleanCanvas(options, cb) {
quad_previews.current.screenshot(options, cb)
},
createGif: function(options, cb) {
createGif(options, cb) {
/*
var images = [];
var preview = quad_previews.current;
@ -615,7 +619,7 @@ const Screencam = {
}
const Clipbench = {
elements: [],
copy: function(event, cut) {
copy(event, cut) {
var p = Prop.active_panel
var text = window.getSelection()+'';
if (text) {
@ -651,7 +655,7 @@ const Clipbench = {
}
}
},
paste: function(event) {
paste(event) {
var p = Prop.active_panel
if (open_dialog == 'uv_dialog') {
uv_dialog.paste(event)
@ -749,7 +753,7 @@ const Clipbench = {
Undo.finishEdit('paste', {outliner: true, elements: selected, selection: true});
}
},
setTexture: function(texture) {
setTexture(texture) {
//Sets the raw image of the texture
if (!isApp) return;
@ -760,7 +764,7 @@ const Clipbench = {
}
clipboard.writeImage(img)
},
setGroup: function(group) {
setGroup(group) {
if (!group) {
Clipbench.group = undefined
return;
@ -770,7 +774,7 @@ const Clipbench = {
clipboard.writeHTML(JSON.stringify({type: 'group', content: Clipbench.group}))
}
},
setElements: function(arr) {
setElements(arr) {
if (!arr) {
Clipbench.elements = []
return;
@ -782,7 +786,7 @@ const Clipbench = {
clipboard.writeHTML(JSON.stringify({type: 'elements', content: Clipbench.elements}))
}
},
setKeyframes: function(keyframes) {
setKeyframes(keyframes) {
Clipbench.keyframes = []
if (!keyframes || keyframes.length === 0) {
return;
@ -808,7 +812,7 @@ const Clipbench = {
clipboard.writeHTML(JSON.stringify({type: 'keyframes', content: Clipbench.keyframes}))
}
},
setText: function(text) {
setText(text) {
if (isApp) {
clipboard.writeText(text)
} else {

@ -359,7 +359,7 @@ function showSaveDialog(close) {
unsaved_textures++;
}
})
if ((window.Prop && Prop.project_saved === false && elements.length > 0) || unsaved_textures) {
if ((window.Prop && Prop.project_saved === false && (elements.length > 0 || Group.all.length > 0)) || unsaved_textures) {
var answer = electron.dialog.showMessageBox(currentwindow, {
type: 'question',
buttons: [tl('dialog.save'), tl('dialog.discard'), tl('dialog.cancel')],

@ -358,6 +358,7 @@ class NumSlider extends Widget {
if (typeof scope.onBefore === 'function') {
scope.onBefore()
}
scope.sliding = true;
scope.pre = 0;
scope.left = ui.position.left
scope.last_value = scope.value
@ -366,6 +367,7 @@ class NumSlider extends Widget {
scope.slide(event, ui)
},
stop: function() {
delete scope.sliding;
if (typeof scope.onAfter === 'function') {
scope.onAfter(scope.value - scope.last_value)
}
@ -520,8 +522,12 @@ class NumSlider extends Widget {
if (!BARS.condition(this.condition)) return;
var number = this.get();
this.setValue(number)
if (isNaN(number)) number = '';
$('#nslide_head #nslide_offset').text(this.name+': '+this.value)
if (isNaN(number)) {
this.jq_outer.find('.nslide:not(.editing)').text('')
}
if (this.sliding) {
$('#nslide_head #nslide_offset').text(this.name+': '+this.value)
}
}
}
class BarSlider extends Widget {
@ -953,7 +959,7 @@ const BARS = {
category: 'tools',
selectFace: true,
transformerMode: 'translate',
toolbar: 'move',
toolbar: Blockbench.isMobile ? 'element_position' : 'main_tools',
alt_tool: 'resize_tool',
modes: ['edit', 'display', 'animate'],
keybind: new Keybind({key: 86}),
@ -964,7 +970,7 @@ const BARS = {
category: 'tools',
selectFace: true,
transformerMode: 'scale',
toolbar: 'resize',
toolbar: Blockbench.isMobile ? 'element_size' : 'main_tools',
alt_tool: 'move_tool',
modes: ['edit', 'display', 'animate'],
keybind: new Keybind({key: 83}),
@ -975,7 +981,7 @@ const BARS = {
category: 'tools',
selectFace: true,
transformerMode: 'rotate',
toolbar: 'rotate',
toolbar: Blockbench.isMobile ? 'element_rotation' : 'main_tools',
alt_tool: 'pivot_tool',
modes: ['edit', 'display', 'animate'],
keybind: new Keybind({key: 82}),
@ -985,7 +991,7 @@ const BARS = {
icon: 'gps_fixed',
category: 'tools',
transformerMode: 'translate',
toolbar: 'pivot',
toolbar: Blockbench.isMobile ? 'element_origin' : 'main_tools',
alt_tool: 'rotate_tool',
modes: ['edit'],
keybind: new Keybind({key: 80}),
@ -1365,27 +1371,51 @@ const BARS = {
vertical: Blockbench.isMobile,
default_place: true
})
Toolbars.rotation = new Toolbar({
id: 'rotation',
Toolbars.element_position = new Toolbar({
id: 'element_position',
children: [
'slider_rotation_x',
'slider_rotation_y',
'slider_rotation_z',
'rescale_toggle',
'bone_reset_toggle'
'slider_pos_x',
'slider_pos_y',
'slider_pos_z',
'local_move'
],
default_place: true
default_place: !Blockbench.isMobile
})
Toolbars.origin = new Toolbar({
id: 'origin',
Toolbars.element_size = new Toolbar({
id: 'element_size',
children: [
'slider_size_x',
'slider_size_y',
'slider_size_z',
'scale'
],
default_place: !Blockbench.isMobile
})
Toolbars.element_origin = new Toolbar({
id: 'element_origin',
children: [
'slider_origin_x',
'slider_origin_y',
'slider_origin_z',
'origin_to_geometry'
],
default_place: true
default_place: !Blockbench.isMobile
})
Toolbars.element_rotation = new Toolbar({
id: 'element_rotation',
children: [
'slider_rotation_x',
'slider_rotation_y',
'slider_rotation_z',
'rescale_toggle'
],
default_place: !Blockbench.isMobile
})
Toolbars.display = new Toolbar({
id: 'display',
children: [
@ -1470,42 +1500,9 @@ const BARS = {
default_place: true
})
//Tools
Toolbars.move = new Toolbar({
id: 'move',
Toolbars.main_tools = new Toolbar({
id: 'main_tools',
children: [
'slider_pos_x',
'slider_pos_y',
'slider_pos_z',
'_',
'local_move'
]
})
Toolbars.resize = new Toolbar({
id: 'resize',
children: [
'slider_size_x',
'slider_size_y',
'slider_size_z',
'_',
'slider_inflate'
]
})
Toolbars.rotate = new Toolbar({
id: 'rotate',
children: [
'slider_rotation_x',
'slider_rotation_y',
'slider_rotation_z',
'rescale_toggle'
]
})
Toolbars.pivot = new Toolbar({
id: 'pivot',
children: [
'slider_origin_x',
'slider_origin_y',
'slider_origin_z',
'origin_to_geometry'
]
})
Toolbars.brush = new Toolbar({

@ -204,7 +204,7 @@ function Dialog(settings) {
jq_dialog.draggable({
handle: ".dialog_handle"
})
var x = ($(window).width()-540)/2
var x = Math.clamp(($(window).width()-540)/2, 0, 2000)
jq_dialog.css('left', x+'px')
jq_dialog.css('position', 'absolute')
}

@ -322,12 +322,14 @@ function setupInterface() {
'save_textures'
])
})
Interface.Panels.options = new Panel({
id: 'options',
condition: () => Modes.id === 'edit',
Interface.Panels.element = new Panel({
id: 'element',
condition: () => Modes.edit,
toolbars: {
rotation: Toolbars.rotation,
origin: Toolbars.origin,
element_position: Toolbars.element_position,
element_size: Toolbars.element_size,
element_origin: Toolbars.element_origin,
element_rotation: Toolbars.element_rotation,
}
})
Interface.Panels.color = new Panel({
@ -659,8 +661,8 @@ function showDialog(dialog) {
handle: ".dialog_handle",
containment: 'body'
})
var x = ($(window).width()-obj.width()) / 2;
var top = ($(window).height() - obj.height()) / 2;
var x = ($(window).width()-obj.outerWidth()) / 2;
var top = ($(window).height() - obj.outerHeight()) / 2;
obj.css('left', x+'px')
obj.css('top', 'px')
obj.css('max-height', ($(window).height()-128)+'px')
@ -685,6 +687,7 @@ function setSettingsTab(tab) {
//Settings
$('#settingslist').css('max-height', ($(window).height() - 420) +'px')
} else if (tab === 'layout_settings') {
$('#layout_list').css('max-height', ($(window).height() - 420) +'px')
$('#layout_font_main').val(app_colors.main.font)
$('#layout_font_headline').val(app_colors.headline.font)
}
@ -934,7 +937,18 @@ var documentReady = new Promise((resolve, reject) => {
}
//DIscord
//Electron
if (isApp && !compareVersions(process.versions.electron, '4.0.0')) {
addStartScreenSection({
graphic: {type: 'icon', icon: 'fas.fa-atom'},
text: [
{type: 'h1', text: 'Electron Update Recommended'},
{text: 'Your Blockbench is using an old version of Electron. Install the latest version to get the best performance and newest features. Just run the latest Blockbench installer. This only takes a minute and will not affect your custom settings.'},
{text: '[Blockbench Downloads](https://blockbench.net/downloads/)'}
]
})
}
//Discord
if (startup_count < 6) {
addStartScreenSection({
color: '#7289da',

@ -353,7 +353,6 @@ const MenuBar = {
for (var key in Formats) {
(function() {
var format = Formats[key];
if (!format.allow_new) return;
arr.push({
id: format.id,
name: format.name,
@ -441,6 +440,7 @@ const MenuBar = {
'_',
'add_cube',
'add_group',
'add_locator',
'duplicate',
'delete',
'_',

@ -216,7 +216,7 @@ BARS.defineActions(function() {
id: 'save_project',
icon: 'save',
category: 'file',
keybind: new Keybind({key: 83, ctrl: true}),
keybind: new Keybind({key: 83, ctrl: true, alt: true}),
click: function () {
saveTextures()
if (isApp && ModelMeta.save_path) {
@ -226,16 +226,25 @@ BARS.defineActions(function() {
}
}
})
if (BarItems.save_project.keybind.key == 83 && BarItems.save_project.keybind.ctrl && !BarItems.save_project.keybind.alt && !BarItems.save_project.keybind.shift) {
//Blockbench 3.0.2 update
BarItems.save_project.keybind.set({key: 83, ctrl: true, alt: true}).save(true)
}
new Action({
id: 'save_project_as',
icon: 'save',
category: 'file',
keybind: new Keybind({key: 83, ctrl: true, shift: true}),
keybind: new Keybind({key: 83, ctrl: true, alt: true, shift: true}),
click: function () {
saveTextures()
codec.export()
}
})
if (BarItems.save_project_as.keybind.key == 83 && BarItems.save_project_as.keybind.ctrl && !BarItems.save_project_as.keybind.alt && BarItems.save_project_as.keybind.shift) {
//Blockbench 3.0.2 update
BarItems.save_project_as.keybind.set({key: 83, ctrl: true, alt: true, shift: true}).save(true)
}
})
})()

@ -142,7 +142,7 @@ function parseGeometry(data) {
if (b.cubes) {
b.cubes.forEach(function(s) {
var base_cube = new Cube({
name: b.name,
name: s.name || b.name,
autouv: 0,
color: bi%8,
rotation: s.rotation,
@ -312,7 +312,7 @@ var codec = new Codec('bedrock', {
if (obj.export) {
if (obj instanceof Cube) {
var cube = {
name: obj.name != g.name ? undefined : obj.name,
name: obj.name == g.name ? undefined : obj.name,
origin: obj.from.slice(),
size: obj.size(),
inflate: obj.inflate||undefined,

@ -402,7 +402,7 @@ var codec = new Codec('bedrock_old', {
name: this.fileName(),
startpath: this.startPath(),
content: this.compile({raw: isApp}),
custom_writer: isApp ? (a, b) => scope.overwrite(a, b) : null,
custom_writer: isApp ? (a, path) => scope.overwrite(a, path, () => scope.afterSave(path)) : null,
})
},
@ -466,8 +466,8 @@ var codec = new Codec('bedrock_old', {
}
}
}
obj[model_name] = content
content = autoStringify(obj)
obj[model_name] = this.compile({raw: true});
content = autoStringify(obj);
Blockbench.writeFile(path, {content}, cb);
}

@ -67,6 +67,17 @@ class ModelFormat {
}
main_uv.setGrid()
buildGrid()
if (Format.bone_rig) {
scene.position.set(0, 0, 0);
} else {
scene.position.set(-8, -8, -8);
}
/*
var center = Format.bone_rig ? -8 : 0;
previews.forEach(preview => {
preview.controls.target.set(center, -3, center);
preview.camOrtho.position.add(preview.controls.target);
})*/
BARS.updateConditions()
Canvas.updateRenderSides()
return this;
@ -283,12 +294,6 @@ class Codec {
Blockbench.showQuickMessage(tl('message.save_file', [name]));
}
}
new ModelFormat({
id: 'free',
icon: 'icon-format_free',
rotate_cubes: true,
optional_box_uv: true,
})
//New
function resetProject() {
@ -799,6 +804,12 @@ function autoParseJSON(data, feedback) {
BARS.defineActions(function() {
new ModelFormat({
id: 'free',
icon: 'icon-format_free',
rotate_cubes: true,
optional_box_uv: true,
})
//Project
new Action({
id: 'project_window',
@ -880,6 +891,7 @@ BARS.defineActions(function() {
id: 'convert_project',
icon: 'fas.fa-file-import',
category: 'file',
condition: () => (!EditSession.active || EditSession.hosting),
click: function () {
var options = {};
@ -932,6 +944,7 @@ BARS.defineActions(function() {
id: 'add_model',
icon: 'assessment',
category: 'file',
condition: _ => (Format.id == 'java_block' || Format.id == 'free'),
click: function () {
Blockbench.import({
extensions: ['json'],
@ -949,6 +962,7 @@ BARS.defineActions(function() {
id: 'extrude_texture',
icon: 'eject',
category: 'file',
condition: _ => !Project.box_uv,
click: function () {
Blockbench.import({
extensions: ['png'],
@ -967,7 +981,7 @@ BARS.defineActions(function() {
id: 'export_over',
icon: 'save',
category: 'file',
keybind: new Keybind({key: 69, ctrl: true}),
keybind: new Keybind({key: 83, ctrl: true}),
click: function () {
if (isApp) {
saveTextures()
@ -992,33 +1006,39 @@ BARS.defineActions(function() {
}
}
})
new Action({
id: 'export_asset_archive',
icon: 'archive',
category: 'file',
condition: _ => !isApp && Format && Format.codec,
click: function() {
var archive = new JSZip();
var content = Format.codec.compile()
archive.file((Project.name||'model')+'.json', content)
textures.forEach(tex => {
if (tex.mode === 'bitmap') {
archive.file(pathToName(tex.name) + '.png', tex.source.replace('data:image/png;base64,', ''), {base64: true});
}
})
archive.generateAsync({type: 'blob'}).then(content => {
Blockbench.export({
type: 'Zip Archive',
extensions: ['zip'],
name: 'assets',
startpath: ModelMeta.export_path,
content: content,
savetype: 'zip'
if (BarItems.export_over.keybind.key == 69 && BarItems.export_over.keybind.ctrl) {
//Blockbench 3.0.2 update
BarItems.export_over.keybind.set({key: 83, ctrl: true}).save(true)
}
if (!isApp) {
new Action({
id: 'export_asset_archive',
icon: 'archive',
category: 'file',
condition: _ => Format && Format.codec,
click: function() {
var archive = new JSZip();
var content = Format.codec.compile()
archive.file((Project.name||'model')+'.json', content)
textures.forEach(tex => {
if (tex.mode === 'bitmap') {
archive.file(pathToName(tex.name) + '.png', tex.source.replace('data:image/png;base64,', ''), {base64: true});
}
})
Prop.project_saved = true;
})
}
})
archive.generateAsync({type: 'blob'}).then(content => {
Blockbench.export({
type: 'Zip Archive',
extensions: ['zip'],
name: 'assets',
startpath: ModelMeta.export_path,
content: content,
savetype: 'zip'
})
Prop.project_saved = true;
})
}
})
}
new Action({
id: 'upload_sketchfab',
icon: 'icon-sketchfab',

@ -29,6 +29,7 @@ var codec = new Codec('obj', {
compile(options) {
if (!options) options = 0;
var old_scene_position = new THREE.Vector3().copy(scene.position);
scene.position.set(0,0,0)
var output = '# Made in Blockbench '+appVersion+'\n';
@ -146,7 +147,7 @@ var codec = new Codec('obj', {
}
} else {
console.warn( 'THREE.OBJExporter.parseMesh(): geometry type unsupported', mesh );
// TODO: Support only BufferGeometry and use use setFromObject()
// TODO: Support only BufferGeometry and use setFromObject()
}
// update index
@ -176,7 +177,7 @@ var codec = new Codec('obj', {
}
mtlOutput += 'newmtl none'
scene.position.set(-8,-8,-8)
scene.position.copy(old_scene_position)
_obj_export = {
obj: output,
@ -186,6 +187,7 @@ var codec = new Codec('obj', {
return options.all_files ? _obj_export : output;
},
write(content, path) {
var scope = this;
var mtl_path = path.replace(/\.obj$/, '.mtl')
content = this.compile({mtl_name: pathToName(mtl_path, true)})

@ -502,11 +502,6 @@ class Cube extends NonGroup {
pos.add(m.getWorldPosition(new THREE.Vector3()))
if (Format.bone_rig) {
pos.x += 8
pos.y += 8
pos.z += 8
}
return pos;
}
setColor(index) {

@ -62,6 +62,9 @@ class Group extends OutlinerElement {
}
init() {
super.init();
if (typeof this.parent !== 'object') {
this.addTo();
}
return this;
}
select(event) {
@ -304,6 +307,7 @@ class Group extends OutlinerElement {
base_group.children.push(child.getSaveCopy());
}
delete base_group.parent;
return base_group;
}
getChildlessCopy() {
var base_group = new Group();

@ -80,7 +80,7 @@ BARS.defineActions(function() {
click: function () {
var elements = []
Undo.initEdit({elements, outliner: true});
elements.push(new Locator().init().select());
elements.push(new Locator().addTo(Group.selected||selected[0]).init().select());
Undo.finishEdit('add locator');
}
})

@ -16,7 +16,7 @@ const Outliner = {
return;
}
Undo.initEdit({elements: obj.forSelected(), outliner: true, selection: true})
obj.forSelected(function(cube) {
obj.forSelected().slice().forEach(cube => {
cube.remove()
})
updateSelection()

@ -622,8 +622,8 @@ const Painter = {
let obj = cubes[i]
if (obj.visibility === true) {
var template = new cubeTempl(obj)
if (options.double_use && Project.box_uv) {
var double_key = [...obj.uv_offset, ...obj.size(undefined, true)].join('_')
if (options.double_use && Project.box_uv && textures.length) {
var double_key = [...obj.uv_offset, ...obj.size(undefined, true), ].join('_')
if (doubles[double_key]) {
doubles[double_key].push(template)
doubles[double_key][0].duplicates = doubles[double_key];

@ -113,11 +113,7 @@ class Plugin {
}
loadFromFile(file, first) {
var scope = this;
var path = file.path
Plugins.registered[this.id] = this;
localStorage.setItem('plugin_dev_path', file.path)
onInstall = undefined
if (!isApp && !first) return this;
if (first) {
if (isApp) {
if (!confirm(tl('message.load_plugin_app'))) return;
@ -125,18 +121,43 @@ class Plugin {
if (!confirm(tl('message.load_plugin_web'))) return;
}
}
$.getScript(file.path, function() {
scope.id = (plugin_data && plugin_data.id)||pathToName(file.path)
scope.id = pathToName(file.path)
Plugins.registered[this.id] = this;
localStorage.setItem('plugin_dev_path', file.path)
Plugins.all.safePush(this)
scope.fromFile = true
if (isApp) {
$.getScript(file.path, function() {
if (window.plugin_data) {
scope.id = (plugin_data && plugin_data.id)||pathToName(file.path)
scope.extend(plugin_data)
scope.bindGlobalData()
}
scope.installed = true
scope.path = file.path
Plugins.installed.safePush(scope.path)
saveInstalledPlugins()
Plugins.sort()
})
} else {
try {
eval(file.content);
} catch (err) {
throw err;
return;
}
if (!Plugins.registered && window.plugin_data) {
scope.id = (plugin_data && plugin_data.id)||scope.id
scope.extend(plugin_data)
scope.bindGlobalData()
}
scope.installed = true
scope.fromFile = true
scope.path = file.path
scope.extend(plugin_data)
scope.bindGlobalData()
Plugins.installed.safePush(scope.path)
saveInstalledPlugins()
Plugins.sort()
})
Plugins.all.safePush(this)
}
return this;
}
uninstall() {
@ -278,7 +299,7 @@ function loadInstalledPlugins() {
if (id.substr(-3) !== '.js') {
//downloaded public plugin
var plugin = new Plugin(id).install(false, function() {
this.extend(plugin_data)
this.extend(window.plugin_data)
Plugins.sort()
})
}

@ -35,7 +35,7 @@ class Preview {
this.camOrtho = new THREE.OrthographicCamera(-600, 600, -400, 400, 1, 100)
this.camOrtho.backgroundHandle = [{n: false, a: 'x'}, {n: false, a: 'y'}]
this.camOrtho.axis = null
this.camOrtho.zoom = 0.6
this.camOrtho.zoom = 0.5
this.camPers.preview = this.camOrtho.preview = this;
for (var i = 4; i <= 6; i++) {
this.camPers.layers.enable(i);
@ -462,7 +462,7 @@ class Preview {
if ((event.shiftKey || event.ctrlKey) && scope.selection.old_selected.indexOf(cube) >= 0) {
var isSelected = true
} else {
if (cube instanceof Cube && cube.mesh) {
if (cube instanceof Cube && cube.visibility && cube.mesh) {
var mesh = cube.mesh
var from = new THREE.Vector3().copy(mesh.geometry.vertices[6]).applyMatrix4(mesh.matrixWorld)
var to = new THREE.Vector3().copy(mesh.geometry.vertices[0]).applyMatrix4(mesh.matrixWorld)
@ -815,7 +815,6 @@ function initCanvas() {
display_area.name = 'display_area'
display_scene.name = 'display_scene'
scene.position.set(-8,-8,-8)
scene.add(Vertexsnap.vertexes)
Vertexsnap.vertexes.name = 'vertex_handles'
@ -1242,6 +1241,7 @@ BARS.defineActions(function() {
description: 'menu.preview.perspective.normal',
icon: 'videocam',
category: 'view',
condition: _ => !Modes.display,
keybind: new Keybind({key: 101}),
click: function () {
quad_previews.current.setNormalCamera()
@ -1255,6 +1255,7 @@ BARS.defineActions(function() {
icon: 'videocam',
color: 'y',
category: 'view',
condition: _ => !Modes.display,
keybind: new Keybind({key: 104}),
click: function () {
quad_previews.current.setOrthographicCamera(0)
@ -1267,6 +1268,7 @@ BARS.defineActions(function() {
icon: 'videocam',
color: 'y',
category: 'view',
condition: _ => !Modes.display,
keybind: new Keybind({key: 98}),
click: function () {
quad_previews.current.setOrthographicCamera(1)
@ -1279,6 +1281,7 @@ BARS.defineActions(function() {
icon: 'videocam',
color: 'z',
category: 'view',
condition: _ => !Modes.display,
keybind: new Keybind({key: 100}),
click: function () {
quad_previews.current.setOrthographicCamera(2)
@ -1291,6 +1294,7 @@ BARS.defineActions(function() {
icon: 'videocam',
color: 'z',
category: 'view',
condition: _ => !Modes.display,
keybind: new Keybind({key: 102}),
click: function () {
quad_previews.current.setOrthographicCamera(3)
@ -1303,6 +1307,7 @@ BARS.defineActions(function() {
icon: 'videocam',
color: 'x',
category: 'view',
condition: _ => !Modes.display,
keybind: new Keybind({key: 103}),
click: function () {
quad_previews.current.setOrthographicCamera(4)
@ -1315,6 +1320,7 @@ BARS.defineActions(function() {
icon: 'videocam',
color: 'x',
category: 'view',
condition: _ => !Modes.display,
keybind: new Keybind({key: 105}),
click: function () {
quad_previews.current.setOrthographicCamera(5)

@ -622,8 +622,6 @@
var previousValue = 0;
var tempScale = 1;
var worldOffset = new THREE.Vector3(8, 8, 8)
var parentRotationMatrix = new THREE.Matrix4();
var worldPosition = new THREE.Vector3();
@ -833,7 +831,7 @@
//Center
if (Toolbox.selected.id === 'rotate_tool' || Toolbox.selected.id === 'pivot_tool') {
rotation_object.mesh.getWorldPosition(this.position)
Transformer.position.add(worldOffset);
Transformer.position.sub(scene.position);
} else {
var center = getSelectionCenter()
Transformer.position.fromArray(center)
@ -861,9 +859,6 @@
this.attach(Group.selected);
Group.selected.mesh.getWorldPosition(this.position);
this.position.x += 8;
this.position.y += 8;
this.position.z += 8;
if (Toolbox.selected.transformerMode == 'rotate') {
this.rotation.set(0, 0, 0);
}

@ -230,7 +230,9 @@ const Vertexsnap = {
var mesh = new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1), material)
var pos = mesh.position.copy(v)
pos.applyMatrix4(cube.mesh.matrixWorld)
pos.addScalar(8)
if (!Format.bone_rig) {
pos.addScalar(8)
}
mesh.rotation.copy(cube.mesh.rotation)
mesh.cube = cube
mesh.isVertex = true
@ -392,7 +394,7 @@ function scaleAll(save, size) {
parseFloat($('#scaling_origin_y').val())||0,
parseFloat($('#scaling_origin_z').val())||0,
]
var clip = false
var overflow = [];
selected.forEach(function(obj) {
obj.autouv = 0;
origin.forEach(function(ogn, i) {
@ -400,13 +402,13 @@ function scaleAll(save, size) {
if (obj.from) {
obj.from[i] = (obj.before.from[i] - ogn) * size;
if (obj.from[i] + ogn > 32 || obj.from[i] + ogn < -16) clip = true;
if (obj.from[i] + ogn > 32 || obj.from[i] + ogn < -16) overflow.push(obj);
obj.from[i] = limitToBox(obj.from[i] + ogn);
}
if (obj.to) {
obj.to[i] = (obj.before.to[i] - ogn) * size;
if (obj.to[i] + ogn > 32 || obj.to[i] + ogn < -16) clip = true;
if (obj.to[i] + ogn > 32 || obj.to[i] + ogn < -16) overflow.push(obj);
obj.to[i] = limitToBox(obj.to[i] + ogn);
}
@ -440,7 +442,8 @@ function scaleAll(save, size) {
}
}, Group)
}
if (clip && Format.canvas_limit) {
if (overflow.length && Format.canvas_limit) {
scaleAll.overflow = overflow;
$('#scaling_clipping_warning').text('Model clipping: Your model is too large for the canvas')
$('#scale_overflow_btn').css('display', 'inline-block')
} else {
@ -485,21 +488,9 @@ function cancelScaleAll() {
hideDialog()
}
function scaleAllSelectOverflow() {
var overflow = [];
selected.forEach(function(obj) {
var clip = false
obj.from.forEach(function(ogn, i) {
if (obj.from && (obj.from[i] > 32 || obj.from[i] < -16)) clip = true
if (obj.to && (obj.to[i] > 32 || obj.to[i] < -16)) clip = true
})
if (clip) {
overflow.push(obj)
}
})
cancelScaleAll()
selected.length = 0;
overflow.forEach(obj => {
scaleAll.overflow.forEach(obj => {
obj.selectLow()
})
updateSelection();
@ -870,7 +861,7 @@ BARS.defineActions(function() {
}
new NumSlider({
id: 'slider_origin_x',
condition: () => () => (Modes.edit && getRotationObject()),
condition: () => (Modes.edit && getRotationObject()),
get: function() {
if (Format.bone_rig && Group.selected) {
return Group.selected.origin[0];
@ -891,7 +882,7 @@ BARS.defineActions(function() {
})
new NumSlider({
id: 'slider_origin_y',
condition: () => () => (Modes.edit && getRotationObject()),
condition: () => (Modes.edit && getRotationObject()),
get: function() {
if (Format.bone_rig && Group.selected) {
return Group.selected.origin[1];
@ -912,7 +903,7 @@ BARS.defineActions(function() {
})
new NumSlider({
id: 'slider_origin_z',
condition: () => () => (Modes.edit && getRotationObject()),
condition: () => (Modes.edit && getRotationObject()),
get: function() {
if (Format.bone_rig && Group.selected) {
return Group.selected.origin[2];

@ -17,6 +17,9 @@ var Undo = {
}
- This still causes issues, for example with different texture selections
*/
if (aspects.textures && aspects.textures.length == 0 && Format.single_texture && textures.length == 1) {
aspects.textures[0] = textures[0];
}
Undo.current_save = new Undo.save(aspects)
return Undo.current_save;
},

@ -71,6 +71,7 @@ BARS.defineActions(function() {
$(n).removeClass('sel')
})
updateInterfacePanels()
resizeWindow()
}
})
new Action({
@ -89,6 +90,7 @@ BARS.defineActions(function() {
$(n).removeClass('sel')
})
updateInterfacePanels()
resizeWindow()
}
})
}

@ -563,8 +563,6 @@
"panel.display": "Anzeigeeinstellungen",
"panel.textures": "Texturen",
"panel.outliner": "Outliner",
"panel.options": "Drehung",
"panel.options.angle": "Winkel",
"uv_editor.title": "UV Bearbeiten",
"uv_editor.all_faces": "Alle",
"uv_editor.no_faces": "Keine",
@ -862,7 +860,6 @@
"action.edit_session.desc": "Mit einer Session verbinden, um mit anderen zusammenzuarbeiten",
"action.reset_keyframe": "Keyframe zurücksetzen",
"action.reset_keyframe.desc": "Alle Werte der ausgewählten Keyframes zurücksetzen",
"panel.options.origin": "Angelpunkt",
"dialog.edit_session.title": "Zusammenarbeiten",
"edit_session.username": "Name",
"edit_session.token": "Schlüssel",
@ -962,5 +959,10 @@
"action.import_optifine_part": "OptiFine Part Importieren",
"action.import_optifine_part.desc": "Importiere ein Part Modell als Teil eines OptiFine Entity Modells",
"data.locator": "Locator",
"mode.start.no_recents": "Keine zuletzt verwendeten Modelle"
"mode.start.no_recents": "Keine zuletzt verwendeten Modelle",
"panel.element": "Element",
"panel.element.position": "Position",
"panel.element.size": "Größe",
"panel.element.origin": "Angelpunkt",
"panel.element.rotation": "Rotation"
}

@ -439,7 +439,7 @@
"settings.negative_size": "Negative Size",
"settings.negative_size.desc": "Allow the resize tool to use negative sizes",
"settings.animation_snap": "Animation Snap",
"settings.animation_snap.desc": "Snap interval for keyframes in the animation timeline",
"settings.animation_snap.desc": "Snap interval for keyframes in the animation timeline in steps per second",
"settings.dialog_unsaved_textures": "Unsaved Textures",
"settings.dialog_unsaved_textures.desc": "Show \"Unsaved Textures\" dialog",
@ -970,9 +970,11 @@
"panel.variable_placeholders": "Variable Placeholders",
"panel.variable_placeholders.info": "List the variables you want to preview via name=value",
"panel.options": "Rotation",
"panel.options.angle": "Angle",
"panel.options.origin": "Origin",
"panel.element": "Element",
"panel.element.position": "Position",
"panel.element.size": "Size",
"panel.element.origin": "Pivot Point",
"panel.element.rotation": "Rotation",
"uv_editor.title": "UV Editor",
"uv_editor.all_faces": "All",

@ -563,8 +563,6 @@
"panel.display": "Visualización",
"panel.textures": "Texturas",
"panel.outliner": "Esquema",
"panel.options": "Rotación",
"panel.options.angle": "Ángulo",
"uv_editor.title": "Editor de UV",
"uv_editor.all_faces": "Todo",
"uv_editor.no_faces": "Ninguno",
@ -862,7 +860,6 @@
"action.edit_session.desc": "Conectarse a una sesión de edición para colaborar con otros usuarios",
"action.reset_keyframe": "Resetear Frames Clave",
"action.reset_keyframe.desc": "Resetea todos los valores de los frames clave seleccionados",
"panel.options.origin": "Origen",
"dialog.edit_session.title": "Editar Sesión",
"edit_session.username": "Nombre de Usuario",
"edit_session.token": "Token",
@ -958,9 +955,14 @@
"display.reference.crossbow": "Ballesta",
"dialog.settings.search_results": "Search Results",
"settings.animation_snap": "Animation Snap",
"settings.animation_snap.desc": "Snap interval for keyframes in the animation timeline",
"settings.animation_snap.desc": "Snap interval for keyframes in the animation timeline in steps per second",
"action.import_optifine_part": "Import OptiFine Part",
"action.import_optifine_part.desc": "Import an entity part model for OptiFine",
"data.locator": "Locator",
"mode.start.no_recents": "No recently opened models"
"mode.start.no_recents": "No recently opened models",
"panel.element": "Element",
"panel.element.position": "Position",
"panel.element.size": "Size",
"panel.element.origin": "Pivot Point",
"panel.element.rotation": "Rotation"
}

@ -563,8 +563,6 @@
"panel.display": "Afficher",
"panel.textures": "Textures",
"panel.outliner": "Liste des blocs",
"panel.options": "Rotation",
"panel.options.angle": "Angle",
"uv_editor.title": "Éditeur UV",
"uv_editor.all_faces": "Toutes",
"uv_editor.no_faces": "Aucun",
@ -862,7 +860,6 @@
"action.edit_session.desc": "Connectez-vous à une session pour collaborer avec d'autres utilisateurs.",
"action.reset_keyframe": "Réinitialiser l'image clé",
"action.reset_keyframe.desc": "Réinitialiser toutes les valeurs des images clés sélectionnées",
"panel.options.origin": "Origine",
"dialog.edit_session.title": "Editer la session",
"edit_session.username": "Nom d'utilisateur",
"edit_session.token": "Jeton",
@ -958,9 +955,14 @@
"display.reference.crossbow": "Arbalète",
"dialog.settings.search_results": "Search Results",
"settings.animation_snap": "Animation Snap",
"settings.animation_snap.desc": "Snap interval for keyframes in the animation timeline",
"settings.animation_snap.desc": "Snap interval for keyframes in the animation timeline in steps per second",
"action.import_optifine_part": "Import OptiFine Part",
"action.import_optifine_part.desc": "Import an entity part model for OptiFine",
"data.locator": "Locator",
"mode.start.no_recents": "No recently opened models"
"mode.start.no_recents": "No recently opened models",
"panel.element": "Element",
"panel.element.position": "Position",
"panel.element.size": "Size",
"panel.element.origin": "Pivot Point",
"panel.element.rotation": "Rotation"
}

@ -563,8 +563,6 @@
"panel.display": "Display",
"panel.textures": "Texture",
"panel.outliner": "Outliner",
"panel.options": "Rotazione",
"panel.options.angle": "Angolo",
"uv_editor.title": "Editor UV",
"uv_editor.all_faces": "Tutte",
"uv_editor.no_faces": "Nulla",
@ -862,7 +860,6 @@
"action.edit_session.desc": "Connettersi ad una sessione modifiche per collaborare con altri utenti",
"action.reset_keyframe": "Ripristina Fotogramma",
"action.reset_keyframe.desc": "Ripristina tutti i valori dei fotogrammi selezionati",
"panel.options.origin": "Origine",
"dialog.edit_session.title": "Sessione Modifiche",
"edit_session.username": "Username",
"edit_session.token": "Chiave",
@ -962,5 +959,10 @@
"action.import_optifine_part": "Importare parte OptiFine",
"action.import_optifine_part.desc": "Importare una parte di un modello per OptiFine",
"data.locator": "Locator",
"mode.start.no_recents": "No recently opened models"
"mode.start.no_recents": "No recently opened models",
"panel.element": "Element",
"panel.element.position": "Position",
"panel.element.size": "Size",
"panel.element.origin": "Pivot Point",
"panel.element.rotation": "Rotation"
}

@ -1,7 +1,7 @@
{
"dialog.ok": "OK",
"dialog.cancel": "キャンセル",
"dialog.confirm": "確認",
"dialog.confirm": "完了",
"dialog.close": "閉じる",
"dialog.import": "インポート",
"dialog.save": "保存",
@ -331,13 +331,13 @@
"action.uv_slider_size_y.desc": "選択したすべてのキューブのUVを垂直方向に拡張",
"action.vertex_snap_mode": "Snap Mode",
"action.vertex_snap_mode.desc": "頂点スナップが、選択された位置に移動するか、サイズを変更するかを選択する",
"action.move_tool": "Move",
"action.move_tool": "移動",
"action.move_tool.desc": "要素を選択して移動するツール",
"action.resize_tool": "Resize",
"action.resize_tool": "サイズ",
"action.resize_tool.desc": "要素を選択してサイズを変更するツール",
"action.brush_tool": "Paint Brush",
"action.brush_tool.desc": "テクスチャまたはUVエディタにペイントする",
"action.vertex_snap_tool": "Snap",
"action.vertex_snap_tool": "スナップ",
"action.vertex_snap_tool.desc": "2つのブロックの頂点を接続する",
"action.swap_tools": "Swap Tools",
"action.swap_tools.desc": "移動ツールとサイズ変更ツールを切り替える",
@ -469,15 +469,15 @@
"action.reset_interface.desc": "GUIのサイズをリセット",
"action.toggle_wireframe": "ワイヤーフレームを固定",
"action.toggle_wireframe.desc": "ワイヤフレーム表示を切り替えます",
"action.screenshot_model": "Screenshot Model",
"action.screenshot_model": "モデル",
"action.screenshot_model.desc": "現在の角度からモデルのスクリーンショットを撮る",
"action.screenshot_app": "Screenshot App",
"action.screenshot_app": "全体",
"action.screenshot_app.desc": "アプリケーション全体のスクリーンショットを撮る",
"action.toggle_quad_view": "クワッドビューを固定",
"action.toggle_quad_view.desc": "4ビューポートモードを切り替える",
"action.import_texture": "Import Texture",
"action.import_texture": "インポート",
"action.import_texture.desc": "ファイルシステムから1つ、または複数のテクスチャをインポートする",
"action.create_texture": "Create Texture",
"action.create_texture": "作成",
"action.create_texture.desc": "テクスチャまたはテンプレートテクスチャを作成する",
"action.save_textures": "Save Textures",
"action.save_textures.desc": "すべてのテクスチャを保存する",
@ -563,8 +563,6 @@
"panel.display": "表示",
"panel.textures": "Textures",
"panel.outliner": "Outliner",
"panel.options": "Rotation",
"panel.options.angle": "Angle",
"uv_editor.title": "UV Editor",
"uv_editor.all_faces": "All",
"uv_editor.no_faces": "None",
@ -590,7 +588,7 @@
"display.slot.gui": "GUI",
"display.rotation": "回転",
"display.translation": "位置",
"display.scale": "スケール",
"display.scale": "大きさ",
"display.slot": "スロット",
"display.reference": "参照モデル",
"display.presetname": "名前",
@ -669,8 +667,8 @@
"action.face_tint.desc": "現在の面の色合いオプションを有効にします",
"action.uv_shift": "Shift UV",
"action.uv_shift.desc": "すべてのUVを固定値でシフトする",
"menu.toolbar.edit": "Customize",
"menu.toolbar.reset": "Reset",
"menu.toolbar.edit": "カスタマイズ",
"menu.toolbar.reset": "リセット",
"uv_editor.rotated": "回転済み",
"uv_editor.auto_cull": "Cullfaceを手動にする",
"uv_editor.copied": "コピー",
@ -757,10 +755,10 @@
"panel.variable_placeholders": "可変プレースホルダ",
"panel.variable_placeholders.info": "プレビューする変数を 名前 = 値で表示する",
"status_bar.vertex_distance": "間隔:%0",
"dialog.create_gif.title": "レコードGIF",
"dialog.create_gif.title": "GIF",
"dialog.create_gif.length": "長さ(秒)",
"dialog.create_gif.fps": "FPS",
"dialog.create_gif.compression": "圧縮",
"dialog.create_gif.compression": "圧縮",
"dialog.create_gif.play": "アニメーションを再生",
"category.animation": "アニメーション",
"action.record_model_gif": "Record GIF",
@ -862,7 +860,6 @@
"action.edit_session.desc": "他のクリエイターとセッションを通して共同作業が出来ます",
"action.reset_keyframe": "Reset Keyframe",
"action.reset_keyframe.desc": "キー設定をすべてリセットします",
"panel.options.origin": "原点",
"dialog.edit_session.title": "セッションを編集",
"edit_session.username": "ユーザーネーム",
"edit_session.token": "Token",
@ -886,71 +883,71 @@
"edit_session.welcome": "セッションへようこそ!%0さん",
"dialog.yes": "Yes",
"dialog.no": "No",
"generic.remove": "Remove",
"generic.remove": "削除",
"generic.download": "ダウンロード",
"generic.search": "検索",
"dates.today": "今日",
"dates.yesterday": "昨日",
"dates.this_week": "今週",
"dates.weeks_ago": "%0週間前",
"mode.start": "スタート",
"mode.start": "Start",
"mode.start.new": "New",
"mode.start.recent": "Recent",
"format.free": "Free Model",
"format.free.desc": "Model without restrictions for Unity etc.",
"format.java_block": "Java Block/Item",
"format.java_block.desc": "Block model for Java Edition. Size and rotations are limited.",
"format.free.desc": "スタンダードモデリング",
"format.java_block": "Java block/item",
"format.java_block.desc": "Java Editionモデリング (サイズと回転は限られています)",
"format.bedrock": "Bedrock Model",
"format.bedrock.desc": "Model for Bedrock Edition",
"format.bedrock_old": "Bedrock Legacy Model",
"format.bedrock_old.desc": "Pre-1.12 Bedrock Edition entity model",
"format.bedrock.desc": "統合版 モデリング",
"format.bedrock_old": "統合版デフォルトモデル",
"format.bedrock_old.desc": "統合版-1.12 エンティティモデル",
"format.modded_entity": "Modded Entity",
"format.modded_entity.desc": "Entity model for mods. Can be exported as .java class files.",
"format.modded_entity.desc": "エンティティモデリング",
"format.optifine_entity": "OptiFine Entity",
"format.optifine_entity.desc": "Custom entity model for OptiFine",
"keys.mouse": "Mouse Button %0",
"message.cleared_blank_faces.title": "Blank Faces",
"message.cleared_blank_faces.message": "Blockbench has found %0 cubes without any texture. Do you want to remove those elements?",
"message.wireframe.enabled": "Wireframe view enabled",
"message.wireframe.disabled": "Wireframe view disabled",
"dialog.project.box_uv": "Box UV",
"dialog.convert_project.title": "Convert Project",
"dialog.convert_project.format": "Format",
"dialog.convert_project.text": "Are you sure you want to convert this project? You cannot undo this step.",
"dialog.create_texture.double_use": "Keep Multi Texture Occupancy",
"dialog.model_stats.title": "Model Stats",
"dialog.model_stats.cubes": "Cubes",
"dialog.model_stats.locators": "Locators",
"dialog.model_stats.groups": "Groups",
"dialog.model_stats.vertices": "Vertices",
"dialog.model_stats.faces": "Faces",
"settings.username": "Username",
"settings.username.desc": "Username for edit sessions",
"settings.painting_grid": "Painting Grid",
"settings.painting_grid.desc": "Show grid on textured cubes in paint mode",
"action.slider_brush_min_opacity": "Minimum Opacity",
"action.slider_brush_min_opacity.desc": "Minimum opacity of the noise brush in percent",
"format.optifine_entity.desc": "OptiFine カスタムエンティティモデリング",
"keys.mouse": "マウス %0",
"message.cleared_blank_faces.title": "空白の面",
"message.cleared_blank_faces.message": "%0個のテクスチャがない面を発見しました。それらをすべて削除しますか",
"message.wireframe.enabled": "ワイヤーフレームを有効にしました",
"message.wireframe.disabled": "ワイヤーフレームを無効にしました",
"dialog.project.box_uv": "ボックスUV",
"dialog.convert_project.title": "プロジェクトを変換",
"dialog.convert_project.format": "フォーマット",
"dialog.convert_project.text": "このプロジェクトを変換しますか?この動作は戻せません",
"dialog.create_texture.double_use": "マルチテクスチャをキープする",
"dialog.model_stats.title": "モデルステータス",
"dialog.model_stats.cubes": "キューブ",
"dialog.model_stats.locators": "ロケーター",
"dialog.model_stats.groups": "グループ",
"dialog.model_stats.vertices": "頂点",
"dialog.model_stats.faces": "",
"settings.username": "ニックネーム",
"settings.username.desc": "セッション用のニックネームを編集",
"settings.painting_grid": "ペイントグリット",
"settings.painting_grid.desc": "キューブ上にグリットを表示する",
"action.slider_brush_min_opacity": "最小不透明度",
"action.slider_brush_min_opacity.desc": "ブラシの最小不透明度",
"action.convert_project": "Convert Project",
"action.convert_project.desc": "Converts the current project to a project for another model format",
"action.close_project": "Close Project",
"action.close_project": "プロジェクトを閉じる",
"action.close_project.desc": "Closes the currently open project",
"action.export_bedrock": "Export Bedrock Geometry",
"action.export_bedrock.desc": "Export the model as a bedrock edition geometry file.",
"action.save_project": "Save Project",
"action.save_project": "プロジェクトを保存",
"action.save_project.desc": "Saves the current model as a project file",
"action.save_project_as": "Save Project As",
"action.save_project_as": "すべてのプロジェクトを保存",
"action.save_project_as.desc": "Saves the current model as a project file at a new location",
"action.export_over": "Overwrite Model",
"action.export_over": "上書き保存",
"action.export_over.desc": "Saves the model, textures and animations by overwriting the files",
"action.add_locator": "ロケータ-を追加",
"action.add_locator.desc": "Adds a new locator to control positions of particles, leashes etc",
"action.sidebar_left": "Textures and UV",
"action.sidebar_left.desc": "Open the interface for UV and textures",
"action.sidebar_right": "Elements",
"action.sidebar_right": "エレメント",
"action.sidebar_right.desc": "Open the interface to edit elements",
"action.uv_turn_mapping": "Turn Mapping",
"action.uv_turn_mapping.desc": "Turn the UV mapping around 90 degrees",
"action.remove_blank_faces": "Remove Blank Faces",
"action.remove_blank_faces": "空白の面を削除",
"action.remove_blank_faces.desc": "Deletes all untextured faces of the selection",
"menu.uv.select": "Select Cubes",
"web.download_app": "Download App",
@ -958,9 +955,14 @@
"display.reference.crossbow": "クロスボウ",
"dialog.settings.search_results": "Search Results",
"settings.animation_snap": "Animation Snap",
"settings.animation_snap.desc": "Snap interval for keyframes in the animation timeline",
"settings.animation_snap.desc": "Snap interval for keyframes in the animation timeline in steps per second",
"action.import_optifine_part": "Import OptiFine Part",
"action.import_optifine_part.desc": "Import an entity part model for OptiFine",
"data.locator": "Locator",
"mode.start.no_recents": "No recently opened models"
"data.locator": "ロケーター",
"mode.start.no_recents": "最近開いたモデルはありません",
"panel.element": "Element",
"panel.element.position": "Position",
"panel.element.size": "Size",
"panel.element.origin": "Pivot Point",
"panel.element.rotation": "Rotation"
}

@ -563,8 +563,6 @@
"panel.display": "Toning",
"panel.textures": "Afbeeldingen",
"panel.outliner": "Outliner",
"panel.options": "Rotatie",
"panel.options.angle": "Hoek",
"uv_editor.title": "UV Editor",
"uv_editor.all_faces": "Alle",
"uv_editor.no_faces": "Geen",
@ -862,7 +860,6 @@
"action.edit_session.desc": "Connect to an edit session to collaborate with other users",
"action.reset_keyframe": "Reset Keyframe",
"action.reset_keyframe.desc": "Reset all values of the selected keyframes",
"panel.options.origin": "Origin",
"dialog.edit_session.title": "Edit Session",
"edit_session.username": "Username",
"edit_session.token": "Token",
@ -958,9 +955,14 @@
"display.reference.crossbow": "Crossbow",
"dialog.settings.search_results": "Search Results",
"settings.animation_snap": "Animation Snap",
"settings.animation_snap.desc": "Snap interval for keyframes in the animation timeline",
"settings.animation_snap.desc": "Snap interval for keyframes in the animation timeline in steps per second",
"action.import_optifine_part": "Import OptiFine Part",
"action.import_optifine_part.desc": "Import an entity part model for OptiFine",
"data.locator": "Locator",
"mode.start.no_recents": "No recently opened models"
"mode.start.no_recents": "No recently opened models",
"panel.element": "Element",
"panel.element.position": "Position",
"panel.element.size": "Size",
"panel.element.origin": "Pivot Point",
"panel.element.rotation": "Rotation"
}

@ -563,8 +563,6 @@
"panel.display": "Wyświetlanie",
"panel.textures": "Tekstury",
"panel.outliner": "Outliner",
"panel.options": "Rotacja",
"panel.options.angle": "Kąt",
"uv_editor.title": "Edytor UV",
"uv_editor.all_faces": "Wszystkie",
"uv_editor.no_faces": "Żadne",
@ -862,7 +860,6 @@
"action.edit_session.desc": "Connect to an edit session to collaborate with other users",
"action.reset_keyframe": "Reset Keyframe",
"action.reset_keyframe.desc": "Reset all values of the selected keyframes",
"panel.options.origin": "Origin",
"dialog.edit_session.title": "Edit Session",
"edit_session.username": "Username",
"edit_session.token": "Token",
@ -958,9 +955,14 @@
"display.reference.crossbow": "Crossbow",
"dialog.settings.search_results": "Search Results",
"settings.animation_snap": "Animation Snap",
"settings.animation_snap.desc": "Snap interval for keyframes in the animation timeline",
"settings.animation_snap.desc": "Snap interval for keyframes in the animation timeline in steps per second",
"action.import_optifine_part": "Import OptiFine Part",
"action.import_optifine_part.desc": "Import an entity part model for OptiFine",
"data.locator": "Locator",
"mode.start.no_recents": "No recently opened models"
"mode.start.no_recents": "No recently opened models",
"panel.element": "Element",
"panel.element.position": "Position",
"panel.element.size": "Size",
"panel.element.origin": "Pivot Point",
"panel.element.rotation": "Rotation"
}

@ -563,8 +563,6 @@
"panel.display": "Padrão",
"panel.textures": "Texturas",
"panel.outliner": "Organizador",
"panel.options": "Rotação",
"panel.options.angle": "Ângulo",
"uv_editor.title": "Editor de UV",
"uv_editor.all_faces": "Todas",
"uv_editor.no_faces": "Nenhum",
@ -862,7 +860,6 @@
"action.edit_session.desc": "Conectar a uma sessão de edição para colaborar com outros usuários",
"action.reset_keyframe": "Redefinir Quadro",
"action.reset_keyframe.desc": "Redefinir todos os valores dos quadros selecionados",
"panel.options.origin": "Origem",
"dialog.edit_session.title": "Sessão de Edição",
"edit_session.username": "Nome de usuário",
"edit_session.token": "Token",
@ -958,9 +955,14 @@
"display.reference.crossbow": "Crossbow",
"dialog.settings.search_results": "Search Results",
"settings.animation_snap": "Animation Snap",
"settings.animation_snap.desc": "Snap interval for keyframes in the animation timeline",
"settings.animation_snap.desc": "Snap interval for keyframes in the animation timeline in steps per second",
"action.import_optifine_part": "Import OptiFine Part",
"action.import_optifine_part.desc": "Import an entity part model for OptiFine",
"data.locator": "Locator",
"mode.start.no_recents": "No recently opened models"
"mode.start.no_recents": "No recently opened models",
"panel.element": "Element",
"panel.element.position": "Position",
"panel.element.size": "Size",
"panel.element.origin": "Pivot Point",
"panel.element.rotation": "Rotation"
}

@ -563,8 +563,6 @@
"panel.display": "Отображение",
"panel.textures": "Текстуры",
"panel.outliner": "Элементы",
"panel.options": "Поворот",
"panel.options.angle": "Угол",
"uv_editor.title": "Редактор UV",
"uv_editor.all_faces": "Все",
"uv_editor.no_faces": "Нет",
@ -862,7 +860,6 @@
"action.edit_session.desc": "Присоединиться к сеансу редактирования для коллаборации с другими пользователями",
"action.reset_keyframe": "Сбросить кадр",
"action.reset_keyframe.desc": "Сбросить все значения выбранных кадров",
"panel.options.origin": "Центр поворота",
"dialog.edit_session.title": "Сеанс Редактирования",
"edit_session.username": "Имя пользователя",
"edit_session.token": "Ключ",
@ -962,5 +959,10 @@
"action.import_optifine_part": "Импортировать часть OptiFine",
"action.import_optifine_part.desc": "Импортировать часть модели сущности OptiFine",
"data.locator": "Locator",
"mode.start.no_recents": "No recently opened models"
"mode.start.no_recents": "No recently opened models",
"panel.element": "Element",
"panel.element.position": "Position",
"panel.element.size": "Size",
"panel.element.origin": "Pivot Point",
"panel.element.rotation": "Rotation"
}

@ -563,8 +563,6 @@
"panel.display": "Visa",
"panel.textures": "Texturer",
"panel.outliner": "Konturen",
"panel.options": "Rotation",
"panel.options.angle": "Vinkel",
"uv_editor.title": "UV redigerare",
"uv_editor.all_faces": "Alla",
"uv_editor.no_faces": "Ingen",
@ -862,7 +860,6 @@
"action.edit_session.desc": "Anslut till en redigeringssession för att samarbeta med andra användare",
"action.reset_keyframe": "Återställ keyframe",
"action.reset_keyframe.desc": "Återställ alla värden för de valda keyframes",
"panel.options.origin": "Ursprung",
"dialog.edit_session.title": "Redigera session",
"edit_session.username": "Användarnamn",
"edit_session.token": "Token",
@ -958,9 +955,14 @@
"display.reference.crossbow": "Crossbow",
"dialog.settings.search_results": "Search Results",
"settings.animation_snap": "Animation Snap",
"settings.animation_snap.desc": "Snap interval for keyframes in the animation timeline",
"settings.animation_snap.desc": "Snap interval for keyframes in the animation timeline in steps per second",
"action.import_optifine_part": "Import OptiFine Part",
"action.import_optifine_part.desc": "Import an entity part model for OptiFine",
"data.locator": "Locator",
"mode.start.no_recents": "No recently opened models"
"mode.start.no_recents": "No recently opened models",
"panel.element": "Element",
"panel.element.position": "Position",
"panel.element.size": "Size",
"panel.element.origin": "Pivot Point",
"panel.element.rotation": "Rotation"
}

@ -1,24 +1,24 @@
{
"dialog.ok": "确定",
"dialog.cancel": "取消",
"dialog.confirm": "确认",
"dialog.close": "关闭",
"dialog.import": "导入",
"dialog.save": "保存",
"dialog.discard": "弃置",
"dialog.dontshowagain": "不再显示此提示",
"data.cube": "立方体",
"data.group": "",
"data.texture": "贴图",
"data.plugin": "插件",
"data.preview": "预览",
"data.toolbar": "工具栏",
"data.image": "图像",
"keys.ctrl": "Ctrl",
"dialog.ok": "OK",
"dialog.cancel": "Cancel",
"dialog.confirm": "Confirm",
"dialog.close": "Close",
"dialog.import": "Import",
"dialog.save": "Save",
"dialog.discard": "Discard",
"dialog.dontshowagain": "Don't Show Again",
"data.cube": "Cube",
"data.group": "Group",
"data.texture": "Texture",
"data.plugin": "Plugin",
"data.preview": "Preview",
"data.toolbar": "Toolbar",
"data.image": "Image",
"keys.ctrl": "Control",
"keys.shift": "Shift",
"keys.alt": "Alt",
"keys.meta": "CMD命令行",
"keys.delete": "删除",
"keys.meta": "Cmd",
"keys.delete": "Delete",
"keys.space": "空格",
"keys.leftclick": "鼠标左键",
"keys.middleclick": "鼠标滚轮",
@ -563,8 +563,6 @@
"panel.display": "显示",
"panel.textures": "贴图",
"panel.outliner": "大纲",
"panel.options": "旋转",
"panel.options.angle": "角度",
"uv_editor.title": "UV 编辑器",
"uv_editor.all_faces": "全部",
"uv_editor.no_faces": "无",
@ -862,7 +860,6 @@
"action.edit_session.desc": "连接到编辑会话来与其他用户协作",
"action.reset_keyframe": "重置关键帧",
"action.reset_keyframe.desc": "重置所选关键帧的所有值",
"panel.options.origin": "旋转原点",
"dialog.edit_session.title": "编辑会话",
"edit_session.username": "用户名",
"edit_session.token": "密码",
@ -913,7 +910,7 @@
"message.cleared_blank_faces.message": "Blockbench 发现 %0 立方体没有任何材质,你想要移除这些元素么?",
"message.wireframe.enabled": "线框视图已启用",
"message.wireframe.disabled": "线框视图已禁用",
"dialog.project.box_uv": "Box UV",
"dialog.project.box_uv": "盒子UV",
"dialog.convert_project.title": "转换工程",
"dialog.convert_project.format": "格式",
"dialog.convert_project.text": "你确定想要转换此工程么?此步骤无法撤销。",
@ -961,6 +958,11 @@
"settings.animation_snap.desc": "动画时间轴中关键帧的捕捉间隔",
"action.import_optifine_part": "导入 OptiFine 部件",
"action.import_optifine_part.desc": "为 OptiFine 导入一个实体部件模型",
"data.locator": "Locator",
"mode.start.no_recents": "No recently opened models"
"data.locator": "定位器",
"mode.start.no_recents": "最近未打开过模型文件",
"panel.element": "Element",
"panel.element.position": "Position",
"panel.element.size": "Size",
"panel.element.origin": "Pivot Point",
"panel.element.rotation": "Rotation"
}

@ -61,11 +61,8 @@ function createWindow(second_instance) {
win.setMenu(null);
}
win.show()
win.maximize()
win.webContents.on('dom-ready', () => {
//win.maximize()
})
win.show()
win.loadURL(url.format({
pathname: index_path,

@ -1,7 +1,7 @@
{
"name": "Blockbench",
"description": "Minecraft Block Model Editor",
"version": "3.0.1",
"description": "Model editing and animation software",
"version": "3.0.2",
"license": "MIT",
"author": {
"name": "JannisX11",
@ -80,6 +80,6 @@
"devDependencies": {
"async": "^2.4.1",
"electron": "5.0.6",
"electron-builder": "^20.44.4"
"electron-builder": "^21.1.1"
}
}