mirror of
https://github.com/JannisX11/blockbench.git
synced 2025-04-12 17:41:57 +08:00
v2.0.0
This commit is contained in:
parent
d337c4dce9
commit
6e59b0e9b5
@ -175,6 +175,7 @@
|
||||
font-size: 16pt;
|
||||
height: 30px;
|
||||
width: 24px;
|
||||
text-align: center;
|
||||
}
|
||||
.dialog .message_box_icon {
|
||||
font-size: 40pt;
|
||||
@ -565,18 +566,6 @@
|
||||
"left_bar preview right_bar"
|
||||
"left_bar status_bar right_bar";
|
||||
}
|
||||
body.display_mode {
|
||||
display: grid;
|
||||
grid-template-columns: 328px auto;
|
||||
grid-template-rows: 32px auto 26px;
|
||||
grid-template-areas:
|
||||
"header header"
|
||||
"left_bar preview"
|
||||
"left_bar status_bar";
|
||||
}
|
||||
body.display_mode #right_bar {
|
||||
display: none;
|
||||
}
|
||||
header {
|
||||
background-color: var(--color-ui);;
|
||||
grid-area: header;
|
||||
@ -655,6 +644,7 @@
|
||||
.single_canvas_wrapper {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
position: relative;
|
||||
}
|
||||
.quad_canvas_wrapper {
|
||||
height: 50%;
|
||||
@ -762,7 +752,7 @@
|
||||
height: 10px;
|
||||
float: left;
|
||||
}
|
||||
.toolbar_seperator {
|
||||
.toolbar_separator {
|
||||
width: 2px;
|
||||
height: 24px;
|
||||
float: left;
|
||||
@ -833,7 +823,7 @@
|
||||
overflow-y: scroll;
|
||||
flex-grow: 1;
|
||||
}
|
||||
body.display_mode #cubes_list {
|
||||
body.animation_mode #cubes_list {
|
||||
height: calc(100% - 50px);
|
||||
}
|
||||
body.animation_mode #cubes_list .outliner_object.cube {
|
||||
@ -1031,6 +1021,9 @@
|
||||
height: 35px;
|
||||
padding: 4px;
|
||||
padding-left: 34px;
|
||||
padding-right: 8px;
|
||||
}
|
||||
.contextMenu li.parent {
|
||||
padding-right: 20px;
|
||||
}
|
||||
.contextMenu li.parent::before {
|
||||
@ -1070,7 +1063,7 @@
|
||||
.contextMenu li.opened > .contextMenu.sub {
|
||||
display: block;
|
||||
}
|
||||
li.menu_seperator {
|
||||
li.menu_separator {
|
||||
height: 2px;
|
||||
width: 100%;
|
||||
padding: 0;
|
||||
@ -1275,6 +1268,7 @@
|
||||
}
|
||||
#timeline_head > .channel_head .text_button {
|
||||
width: 26px;
|
||||
height: 25px;
|
||||
font-size: 16pt;
|
||||
float: right;
|
||||
}
|
||||
@ -1499,6 +1493,9 @@
|
||||
.dialog_bar.narrow {
|
||||
min-height: 30px;
|
||||
}
|
||||
.dialog_bar.button_bar {
|
||||
text-align: right;
|
||||
}
|
||||
.dialog .tab {
|
||||
float: left;
|
||||
width: calc(25% - 2px);
|
||||
@ -1754,7 +1751,10 @@
|
||||
}
|
||||
.tool.disp_range {
|
||||
width: calc(100% - 67px);
|
||||
background-color: var(--color-back);
|
||||
float: none;
|
||||
}
|
||||
.tool.disp_range.scaleRange {
|
||||
width: calc(100% - 109px);
|
||||
float: none;
|
||||
}
|
||||
.tool.disp_text {
|
||||
@ -1802,30 +1802,27 @@
|
||||
#display_settings p {
|
||||
padding-left: 6px;
|
||||
}
|
||||
div#display_crosshair:after {
|
||||
content: "";
|
||||
width: 20px;
|
||||
height: 2px;
|
||||
background-color: var(--color-grid);
|
||||
position: absolute;
|
||||
margin-left: -9px;
|
||||
margin-top: 9px;
|
||||
}
|
||||
div#display_crosshair {
|
||||
width: 2px;
|
||||
height: 20px;
|
||||
background-color: var(--color-grid);
|
||||
position: absolute;
|
||||
top: calc(50% - 10px);
|
||||
margin-left: 50%;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
/*Web*/
|
||||
#web_import_btn {
|
||||
margin-left: 0;
|
||||
}
|
||||
#file_upload_label {
|
||||
height: 40px;
|
||||
width: 200px;
|
||||
border: 1px solid var(--color-border);
|
||||
background: var(--color-button);
|
||||
display: inline-block;
|
||||
cursor: default;
|
||||
padding-top: 6px;
|
||||
}
|
||||
#file_upload_label:hover {
|
||||
background: var(--color-accent);
|
||||
color: var(--color-text_acc);
|
||||
}
|
||||
#file_upload_label i {
|
||||
float: left;
|
||||
margin-left: 30px;
|
||||
margin-right: 5px;
|
||||
margin-top: 2px;
|
||||
}
|
||||
|
||||
/*Scale*/
|
||||
#model_scale_range {
|
||||
width: calc(100% - 50px);
|
||||
float: left;
|
||||
@ -2171,7 +2168,7 @@
|
||||
#bar_items_current li {
|
||||
min-width: 20px;
|
||||
}
|
||||
#bar_items_current li .toolbar_seperator {
|
||||
#bar_items_current li .toolbar_separator {
|
||||
width: 12px;
|
||||
background-color: var(--color-button);
|
||||
border: 1px solid var(--color-border);
|
||||
|
122
index.html
122
index.html
@ -25,6 +25,7 @@
|
||||
<script src="lib/jquery-ui.min.js"></script>
|
||||
<script src="lib/targa.js"></script>
|
||||
<script src="lib/jimp.min.js"></script>
|
||||
<script src="lib/gif.js"></script>
|
||||
<script src="lib/spectrum.js"></script>
|
||||
<script src="lib/three.js"></script>
|
||||
<script src="js/OrbitControls.js"></script>
|
||||
@ -38,18 +39,13 @@
|
||||
<script src="js/blockbench.js"></script>
|
||||
<script src="js/undo.js"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
if (isApp === false) {
|
||||
document.write("<script type='application/x-suppress'>");
|
||||
}
|
||||
</script>
|
||||
<script type="text/javascript" src="js/app.js"></script>
|
||||
<script type="text/javascript">
|
||||
if (isApp === true) {
|
||||
document.write("<script type='application/x-suppress'>");
|
||||
document.write("<script src='js/app.js'><\/script>");
|
||||
} else {
|
||||
document.write("<script src='js/web.js'><\/script>");
|
||||
}
|
||||
</script>
|
||||
<script type="text/javascript" src="js/web.js"></script>
|
||||
|
||||
<script src="js/api.js"></script>
|
||||
<script src="js/actions.js"></script>
|
||||
@ -146,10 +142,10 @@
|
||||
|
||||
<ul class="bar" id="bar_items_current" v-sortable="{onChoose: choose, onUpdate: sort, onEnd: drop, animation: 160 }">
|
||||
<li v-for="item in currentBar" v-bind:title="item.name" :key="item.id||item">
|
||||
<div v-if="typeof item === 'string'" class="toolbar_seperator"></div>
|
||||
<div v-if="typeof item === 'string'" class="toolbar_separator"></div>
|
||||
<div v-else class="tool">
|
||||
<span class="icon_wrapper" v-html="Blockbench.getIconNode(item.icon).outerHTML"></span>
|
||||
<div class="tooltip">{{item.name}}</div>
|
||||
<span class="icon_wrapper" v-bind:style="{opacity: BARS.condition(item.condition) ? 1 : 0.4}" v-html="Blockbench.getIconNode(item.icon).outerHTML"></span>
|
||||
<div class="tooltip">{{item.name + (BARS.condition(item.condition) ? '' : ' (' + tl('dialog.toolbar_edit.hidden') + ')' )}}</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
@ -220,10 +216,6 @@
|
||||
|
||||
<canvas height="256" width="256" id="extrusion_canvas"></canvas>
|
||||
|
||||
<div class="progress_bar" id="extrusion_bar">
|
||||
<div class="progress_bar_inner"></div>
|
||||
</div>
|
||||
|
||||
<div class="dialog_bar">
|
||||
<button type="button" class="large tl confirm_btn" onclick="Extruder.startConversion()">Scan and Import</button>
|
||||
</div>
|
||||
@ -355,7 +347,7 @@
|
||||
</div>
|
||||
|
||||
<div class="dialog_bar">
|
||||
<button type="button" class="large tl confirm_btn" onclick="createPreset()">dialog.display_preset.create</button>
|
||||
<button type="button" class="large tl confirm_btn" onclick="DisplayMode.createPreset()">dialog.display_preset.create</button>
|
||||
<button type="button" class="large tl cancel_btn" onclick="hideDialog()">dialog.cancel</button>
|
||||
</div>
|
||||
<div id="dialog_close_button" onclick="$('.dialog#'+open_dialog).find('.cancel_btn:not([disabled])').click()"><i class="material-icons">clear</i></div>
|
||||
@ -591,7 +583,7 @@
|
||||
</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>
|
||||
<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>
|
||||
@ -638,15 +630,16 @@
|
||||
<p class="tl">about.vertex_snap</p>
|
||||
<p><b class="tl">about.icons</b> <a href="https://material.io/icons/" class="open-in-browser">material.io/icons</a> & <a href="http://fontawesome.io/icons/" class="open-in-browser">fontawesome</a></p>
|
||||
<p><b class="tl">about.libraries</b>
|
||||
<a href="https://jquery.com" class="open-in-browser">jQuery</a>,
|
||||
<a href="https://jqueryui.com" class="open-in-browser">jQuery UI</a>,
|
||||
<a href="http://touchpunch.furf.com" class="open-in-browser">jQuery UI Touch Punch</a>,
|
||||
<a href="https://vuejs.org" class="open-in-browser">VueJS</a>,
|
||||
<a href="https://github.com/weibangtuo/vue-tree" class="open-in-browser">Vue Tree</a>,
|
||||
<a href="https://github.com/sagalbot/vue-sortable" class="open-in-browser">Vue Sortable</a>,
|
||||
<a href="https://threejs.org" class="open-in-browser">ThreeJS</a>,
|
||||
<a href="https://github.com/oliver-moran/jimp" class="open-in-browser">Jimp</a>,
|
||||
<a href="https://bgrins.github.io/spectrum" class="open-in-browser">Spectrum</a>
|
||||
<a class="open-in-browser" href="https://jquery.com">jQuery</a>,
|
||||
<a class="open-in-browser" href="https://jqueryui.com">jQuery UI</a>,
|
||||
<a class="open-in-browser" href="http://touchpunch.furf.com">jQuery UI Touch Punch</a>,
|
||||
<a class="open-in-browser" href="https://vuejs.org">VueJS</a>,
|
||||
<a class="open-in-browser" href="https://github.com/weibangtuo/vue-tree">Vue Tree</a>,
|
||||
<a class="open-in-browser" href="https://github.com/sagalbot/vue-sortable">Vue Sortable</a>,
|
||||
<a class="open-in-browser" href="https://threejs.org">ThreeJS</a>,
|
||||
<a class="open-in-browser" href="https://github.com/oliver-moran/jimp">Jimp</a>,
|
||||
<a class="open-in-browser" href="https://bgrins.github.io/spectrum">Spectrum</a>,
|
||||
<a class="open-in-browser" href="https://github.com/jnordberg/gif.js">gif.js</a>
|
||||
</p>
|
||||
</div>
|
||||
<div class="dialog_bar">
|
||||
@ -736,71 +729,80 @@
|
||||
<p class="tl">display.slot</p>
|
||||
<div id="display_bar" class="bar tabs_small">
|
||||
<input class="hidden" type="radio" name="display" id="thirdperson_righthand" checked>
|
||||
<label class="tool" for="thirdperson_righthand" onclick="loadDispThirdRight()"><i class="material-icons">accessibility</i><div class="tooltip tl">display.slot.third_right</div></label>
|
||||
<label class="tool" for="thirdperson_righthand" onclick="DisplayMode.loadThirdRight()"><i class="material-icons">accessibility</i><div class="tooltip tl">display.slot.third_right</div></label>
|
||||
<input class="hidden" type="radio" name="display" id="thirdperson_lefthand">
|
||||
<label class="tool" for="thirdperson_lefthand" onclick="loadDispThirdLeft()"><i class="material-icons">accessibility</i><div class="tooltip tl">display.slot.third_left</div></label>
|
||||
<label class="tool" for="thirdperson_lefthand" onclick="DisplayMode.loadThirdLeft()"><i class="material-icons">accessibility</i><div class="tooltip tl">display.slot.third_left</div></label>
|
||||
|
||||
<input class="hidden" type="radio" name="display" id="firstperson_righthand">
|
||||
<label class="tool" for="firstperson_righthand" onclick="loadDispFirstRight()"><i class="material-icons">person</i><div class="tooltip tl">display.slot.first_right</div></label>
|
||||
<label class="tool" for="firstperson_righthand" onclick="DisplayMode.loadFirstRight()"><i class="material-icons">person</i><div class="tooltip tl">display.slot.first_right</div></label>
|
||||
<input class="hidden" type="radio" name="display" id="firstperson_lefthand">
|
||||
<label class="tool" for="firstperson_lefthand" onclick="loadDispFirstLeft()"><i class="material-icons">person</i><div class="tooltip tl">display.slot.first_left</div></label>
|
||||
<label class="tool" for="firstperson_lefthand" onclick="DisplayMode.loadFirstLeft()"><i class="material-icons">person</i><div class="tooltip tl">display.slot.first_left</div></label>
|
||||
|
||||
<input class="hidden" type="radio" name="display" id="head">
|
||||
<label class="tool" for="head" onclick="loadDispHead()"><i class="material-icons">sentiment_satisfied</i><div class="tooltip tl">display.slot.head</div></label>
|
||||
<label class="tool" for="head" onclick="DisplayMode.loadHead()"><i class="material-icons">sentiment_satisfied</i><div class="tooltip tl">display.slot.head</div></label>
|
||||
|
||||
<input class="hidden" type="radio" name="display" id="ground">
|
||||
<label class="tool" for="ground" onclick="loadDispGround()"><i class="icon-ground"></i><div class="tooltip tl">display.slot.ground</div></label>
|
||||
<label class="tool" for="ground" onclick="DisplayMode.loadGround()"><i class="icon-ground"></i><div class="tooltip tl">display.slot.ground</div></label>
|
||||
|
||||
<input class="hidden" type="radio" name="display" id="fixed">
|
||||
<label class="tool" for="fixed" onclick="loadDispFixed()"><i class="material-icons">filter_frames</i><div class="tooltip tl">display.slot.frame</div></label>
|
||||
<label class="tool" for="fixed" onclick="DisplayMode.loadFixed()"><i class="material-icons">filter_frames</i><div class="tooltip tl">display.slot.frame</div></label>
|
||||
|
||||
<input class="hidden" type="radio" name="display" id="gui">
|
||||
<label class="tool" for="gui" onclick="loadDispGUI()"><i class="material-icons">border_style</i><div class="tooltip tl">display.slot.gui</div></label>
|
||||
<label class="tool" for="gui" onclick="DisplayMode.loadGUI()"><i class="material-icons">border_style</i><div class="tooltip tl">display.slot.gui</div></label>
|
||||
</div>
|
||||
<p class="reference_model_bar tl">display.reference</p>
|
||||
<div id="display_ref_bar" class="bar tabs_small reference_model_bar">
|
||||
</div>
|
||||
|
||||
<p class="tl">display.rotation</p><div class="tool head_right" onclick="resetDisplaySettings('rotation')"><i class="material-icons">replay</i></div>
|
||||
<p class="tl">display.rotation</p><div class="tool head_right" onclick="DisplayMode.resetDisplaySettings('rotation')"><i class="material-icons">replay</i></div>
|
||||
<div class="bar">
|
||||
<input type="range" class="tool disp_range" id="rotation_x" name="" min="-180" max="180" step="1" value="0" oninput="syncDispInput(this, 'rotation', 'x')">
|
||||
<input type="number" class="tool disp_text" id="rotation_x" oninput="syncDispInput(this, 'rotation', 'x')" min="-180" max="180" step="0.5" value="0">
|
||||
<input type="range" class="tool disp_range" id="rotation_x" name="" min="-180" max="180" step="1" value="0" oninput="DisplayMode.syncDispInput(this, 'rotation', 'x')">
|
||||
<input type="number" class="tool disp_text" id="rotation_x" oninput="DisplayMode.syncDispInput(this, 'rotation', 'x')" min="-180" max="180" step="0.5" value="0">
|
||||
</div>
|
||||
<div class="bar">
|
||||
<input type="range" class="tool disp_range" id="rotation_y" name="" min="-180" max="180" step="1" value="0" oninput="syncDispInput(this, 'rotation', 'y')">
|
||||
<input type="number" class="tool disp_text" id="rotation_y" oninput="syncDispInput(this, 'rotation', 'y')" min="-180" max="180" step="0.5" value="0">
|
||||
<input type="range" class="tool disp_range" id="rotation_y" name="" min="-180" max="180" step="1" value="0" oninput="DisplayMode.syncDispInput(this, 'rotation', 'y')">
|
||||
<input type="number" class="tool disp_text" id="rotation_y" oninput="DisplayMode.syncDispInput(this, 'rotation', 'y')" min="-180" max="180" step="0.5" value="0">
|
||||
</div>
|
||||
<div class="bar">
|
||||
<input type="range" class="tool disp_range" id="rotation_z" name="" min="-180" max="180" step="1" value="0" oninput="syncDispInput(this, 'rotation', 'z')">
|
||||
<input type="number" class="tool disp_text" id="rotation_z" oninput="syncDispInput(this, 'rotation', 'z')" min="-180" max="180" step="0.5" value="0">
|
||||
<input type="range" class="tool disp_range" id="rotation_z" name="" min="-180" max="180" step="1" value="0" oninput="DisplayMode.syncDispInput(this, 'rotation', 'z')">
|
||||
<input type="number" class="tool disp_text" id="rotation_z" oninput="DisplayMode.syncDispInput(this, 'rotation', 'z')" min="-180" max="180" step="0.5" value="0">
|
||||
</div>
|
||||
|
||||
<p class="tl">display.translation</p><div class="tool head_right" onclick="resetDisplaySettings('translation')"><i class="material-icons">replay</i></div>
|
||||
<p class="tl">display.translation</p><div class="tool head_right" onclick="DisplayMode.resetDisplaySettings('translation')"><i class="material-icons">replay</i></div>
|
||||
<div class="bar">
|
||||
<input type="range" class="tool disp_range" id="translation_x" name="" min="-32" max="32" step="0.5" value="0" oninput="syncDispInput(this, 'translation', 'x')">
|
||||
<input type="number" class="tool disp_text" id="translation_x" oninput="syncDispInput(this, 'translation', 'x')" min="-80" max="80" step="0.5" value="0">
|
||||
<input type="range" class="tool disp_range" id="translation_x" name="" min="-32" max="32" step="0.5" value="0" oninput="DisplayMode.syncDispInput(this, 'translation', 'x')">
|
||||
<input type="number" class="tool disp_text" id="translation_x" oninput="DisplayMode.syncDispInput(this, 'translation', 'x')" min="-80" max="80" step="0.5" value="0">
|
||||
</div>
|
||||
<div class="bar">
|
||||
<input type="range" class="tool disp_range" id="translation_y" name="" min="-32" max="32" step="0.5" value="0" oninput="syncDispInput(this, 'translation', 'y')">
|
||||
<input type="number" class="tool disp_text" id="translation_y" oninput="syncDispInput(this, 'translation', 'y')" min="-80" max="80" step="0.5" value="0">
|
||||
<input type="range" class="tool disp_range" id="translation_y" name="" min="-32" max="32" step="0.5" value="0" oninput="DisplayMode.syncDispInput(this, 'translation', 'y')">
|
||||
<input type="number" class="tool disp_text" id="translation_y" oninput="DisplayMode.syncDispInput(this, 'translation', 'y')" min="-80" max="80" step="0.5" value="0">
|
||||
</div>
|
||||
<div class="bar">
|
||||
<input type="range" class="tool disp_range" id="translation_z" name="" min="-32" max="32" step="0.5" value="0" oninput="syncDispInput(this, 'translation', 'z')">
|
||||
<input type="number" class="tool disp_text" id="translation_z" oninput="syncDispInput(this, 'translation', 'z')" min="-80" max="80" step="0.5" value="0">
|
||||
<input type="range" class="tool disp_range" id="translation_z" name="" min="-32" max="32" step="0.5" value="0" oninput="DisplayMode.syncDispInput(this, 'translation', 'z')">
|
||||
<input type="number" class="tool disp_text" id="translation_z" oninput="DisplayMode.syncDispInput(this, 'translation', 'z')" min="-80" max="80" step="0.5" value="0">
|
||||
</div>
|
||||
|
||||
<p class="tl">display.scale</p><div class="tool head_right" onclick="resetDisplaySettings('scale')"><i class="material-icons">replay</i></div>
|
||||
<p class="tl">display.scale</p><div class="tool head_right" onclick="DisplayMode.resetDisplaySettings('scale')"><i class="material-icons">replay</i></div>
|
||||
<div class="bar">
|
||||
<input type="range" class="tool disp_range scaleRange" id="scale_x" name="" min="-4" max="4" step="0.1" value="0" oninput="syncDispInput(this, 'scaleRange', 'x', event)">
|
||||
<input type="number" class="tool disp_text scale" id="scale_x" oninput="syncDispInput(this, 'scale', 'x')" step="0.1" min="-4" max="4">
|
||||
<div class="tool display_scale_invert" id="display_scale_invert_x" onclick="DisplayMode.syncDispMirror(this, 'x')">
|
||||
<i class="material-icons">check_box_outline_blank</i><div class="tooltip tl">display.mirror</div>
|
||||
</div>
|
||||
<input type="range" class="tool disp_range scaleRange" id="scale_x" name="" min="-4" max="4" step="0.1" value="0" oninput="DisplayMode.syncDispInput(this, 'scaleRange', 'x', event)">
|
||||
<input type="number" class="tool disp_text scale" id="scale_x" oninput="DisplayMode.syncDispInput(this, 'scale', 'x')" step="0.1" min="-4" max="4">
|
||||
</div>
|
||||
<div class="bar">
|
||||
<input type="range" class="tool disp_range scaleRange" id="scale_y" name="" min="-4" max="4" step="0.1" value="0" oninput="syncDispInput(this, 'scaleRange', 'y', event)">
|
||||
<input type="number" class="tool disp_text scale" id="scale_y" oninput="syncDispInput(this, 'scale', 'y')" step="0.1" min="-4" max="4">
|
||||
<div class="tool display_scale_invert" id="display_scale_invert_y" onclick="DisplayMode.syncDispMirror(this, 'x')">
|
||||
<i class="material-icons">check_box_outline_blank</i><div class="tooltip tl">display.mirror</div>
|
||||
</div>
|
||||
<input type="range" class="tool disp_range scaleRange" id="scale_y" name="" min="-4" max="4" step="0.1" value="0" oninput="DisplayMode.syncDispInput(this, 'scaleRange', 'y', event)">
|
||||
<input type="number" class="tool disp_text scale" id="scale_y" oninput="DisplayMode.syncDispInput(this, 'scale', 'y')" step="0.1" min="-4" max="4">
|
||||
</div>
|
||||
<div class="bar">
|
||||
<input type="range" class="tool disp_range scaleRange" id="scale_z" name="" min="-4" max="4" step="0.1" value="0" oninput="syncDispInput(this, 'scaleRange', 'z', event)">
|
||||
<input type="number" class="tool disp_text scale" id="scale_z" oninput="syncDispInput(this, 'scale', 'z')" step="0.1" min="-4" max="4">
|
||||
<div class="tool display_scale_invert" id="display_scale_invert_z" onclick="DisplayMode.syncDispMirror(this, 'x')">
|
||||
<i class="material-icons">check_box_outline_blank</i><div class="tooltip tl">display.mirror</div>
|
||||
</div>
|
||||
<input type="range" class="tool disp_range scaleRange" id="scale_z" name="" min="-4" max="4" step="0.1" value="0" oninput="DisplayMode.syncDispInput(this, 'scaleRange', 'z', event)">
|
||||
<input type="number" class="tool disp_text scale" id="scale_z" oninput="DisplayMode.syncDispInput(this, 'scale', 'z')" step="0.1" min="-4" max="4">
|
||||
</div>
|
||||
</div>
|
||||
<div id="animations" class="panel">
|
||||
@ -810,7 +812,7 @@
|
||||
<li
|
||||
v-for="animation in animations"
|
||||
v-bind:class="{ selected: animation.selected }"
|
||||
v-bind:texid="animation.uuid"
|
||||
v-bind:anim_id="animation.uuid"
|
||||
class="animation"
|
||||
v-on:click.stop="animation.select()"
|
||||
@contextmenu.prevent.stop="animation.showContextMenu($event)"
|
||||
@ -825,19 +827,19 @@
|
||||
<p class="tl" id="keyframe_type_label"></p>
|
||||
<div class="bar" id="keyframe_bar_x">
|
||||
<label>X</label>
|
||||
<input type="text" id="keyframe_x" class="dark_bordered code" axis="x" oninput="updateKeyframeValue(this)">
|
||||
<input type="text" id="keyframe_x" class="dark_bordered code keyframe_input" axis="x" oninput="updateKeyframeValue(this)">
|
||||
</div>
|
||||
<div class="bar" id="keyframe_bar_y">
|
||||
<label>Y</label>
|
||||
<input type="text" id="keyframe_y" class="dark_bordered code" axis="y" oninput="updateKeyframeValue(this)">
|
||||
<input type="text" id="keyframe_y" class="dark_bordered code keyframe_input" axis="y" oninput="updateKeyframeValue(this)">
|
||||
</div>
|
||||
<div class="bar" id="keyframe_bar_z">
|
||||
<label>Z</label>
|
||||
<input type="text" id="keyframe_z" class="dark_bordered code" axis="z" oninput="updateKeyframeValue(this)">
|
||||
<input type="text" id="keyframe_z" class="dark_bordered code keyframe_input" axis="z" oninput="updateKeyframeValue(this)">
|
||||
</div>
|
||||
<div class="bar" id="keyframe_bar_w">
|
||||
<label>W</label>
|
||||
<input type="text" id="keyframe_w" class="dark_bordered code" axis="w" oninput="updateKeyframeValue(this)">
|
||||
<input type="text" id="keyframe_w" class="dark_bordered code keyframe_input" axis="w" oninput="updateKeyframeValue(this)">
|
||||
</div>
|
||||
</div>
|
||||
<div id="variable_placeholders" class="panel grow">
|
||||
|
@ -119,7 +119,7 @@ THREE.OBJExporter.prototype = {
|
||||
for (var key in element.faces) {
|
||||
if (element.faces.hasOwnProperty(key)) {
|
||||
var id = element.faces[key].texture
|
||||
if (id !== undefined && id !== '$transparent') {
|
||||
if (id !== undefined && id !== null) {
|
||||
id = id.replace('#', '')
|
||||
if (materials[id] === undefined) {
|
||||
materials[id] = getTextureById(id)
|
||||
@ -206,7 +206,7 @@ function getMtlFace(obj, index) {
|
||||
|
||||
var id = obj.faces[key].texture
|
||||
|
||||
if (id === '$transparent') {
|
||||
if (id === null) {
|
||||
return false
|
||||
} else if (id === undefined) {
|
||||
return 'usemtl none\n'
|
||||
|
194
js/actions.js
194
js/actions.js
@ -1,8 +1,8 @@
|
||||
var Toolbars, BarItems, MenuBar, open_menu, Toolbox;
|
||||
//Bars
|
||||
class MenuSeperator {
|
||||
class MenuSeparator {
|
||||
constructor() {
|
||||
this.menu_node = $('<li class="menu_seperator"></li>')
|
||||
this.menu_node = $('<li class="menu_separator"></li>')
|
||||
}
|
||||
}
|
||||
class BarItem {
|
||||
@ -18,6 +18,7 @@ class BarItem {
|
||||
this.node;
|
||||
this.condition = data.condition;
|
||||
this.nodes = []
|
||||
this.toolbars = []
|
||||
}
|
||||
conditionMet() {
|
||||
if (this.condition === undefined) {
|
||||
@ -77,12 +78,21 @@ class BarItem {
|
||||
var clone = $(scope.node).clone(true, true).get(0);
|
||||
scope.nodes.push(clone);
|
||||
return clone;
|
||||
|
||||
}
|
||||
toElement(destination) {
|
||||
$(destination).append(this.node)
|
||||
$(destination).first().append(this.getNode())
|
||||
return this;
|
||||
}
|
||||
pushToolbar(bar) {
|
||||
var scope = this;
|
||||
if (scope.uniqueNode && scope.toolbars.length) {
|
||||
for (var i = scope.toolbars.length-1; i >= 0; i--) {
|
||||
scope.toolbars[i].remove(scope)
|
||||
}
|
||||
}
|
||||
bar.children.push(this)
|
||||
this.toolbars.safePush(bar)
|
||||
}
|
||||
}
|
||||
class KeybindItem {
|
||||
constructor(data) {
|
||||
@ -241,8 +251,9 @@ class Tool extends Action {
|
||||
}
|
||||
class Widget extends BarItem {
|
||||
constructor(data) {
|
||||
super(data)
|
||||
this.type = 'widget'
|
||||
super(data);
|
||||
this.type = 'widget';
|
||||
this.uniqueNode = true;
|
||||
}
|
||||
}
|
||||
class NumSlider extends Widget {
|
||||
@ -641,13 +652,13 @@ class Toolbar {
|
||||
content.children().detach()
|
||||
items.forEach(function(id) {
|
||||
if (typeof id === 'string' && id.substr(0, 1) === '_') {
|
||||
content.append('<div class="toolbar_seperator"></div>')
|
||||
content.append('<div class="toolbar_separator"></div>')
|
||||
scope.children.push('_'+guid().substr(0,8))
|
||||
return;
|
||||
}
|
||||
var item = BarItems[id]
|
||||
if (item) {
|
||||
scope.children.push(item)
|
||||
item.pushToolbar(scope)
|
||||
if (BARS.condition(item.condition)) {
|
||||
content.append(item.getNode())
|
||||
}
|
||||
@ -661,6 +672,11 @@ class Toolbar {
|
||||
return this;
|
||||
}
|
||||
contextmenu(event) {
|
||||
var offset = $(this.node).find('.toolbar_menu').offset()
|
||||
if (offset) {
|
||||
event.clientX = offset.left+7
|
||||
event.clientY = offset.top+28
|
||||
}
|
||||
this.menu.open(event, this)
|
||||
}
|
||||
editMenu() {
|
||||
@ -670,13 +686,20 @@ class Toolbar {
|
||||
})
|
||||
BARS.list.currentBar = this.children;
|
||||
showDialog('toolbar_edit');
|
||||
|
||||
|
||||
return this;
|
||||
}
|
||||
add(action, position) {
|
||||
if (position === undefined) position = this.children.length
|
||||
if (typeof action === 'object' && action.uniqueNode && action.toolbars.length) {
|
||||
for (var i = action.toolbars.length-1; i >= 0; i--) {
|
||||
action.toolbars[i].remove(action)
|
||||
}
|
||||
}
|
||||
//Adding
|
||||
this.children.splice(position, 0, action)
|
||||
if (typeof action === 'object') {
|
||||
action.toolbars.safePush(this)
|
||||
}
|
||||
this.update()
|
||||
return this;
|
||||
}
|
||||
@ -685,6 +708,7 @@ class Toolbar {
|
||||
while (i >= 0) {
|
||||
var item = this.children[i]
|
||||
if (item === action || item.id === action) {
|
||||
item.toolbars.remove(this)
|
||||
this.children.splice(i, 1)
|
||||
this.update()
|
||||
return this;
|
||||
@ -697,29 +721,33 @@ class Toolbar {
|
||||
var scope = this;
|
||||
var content = $(this.node).find('.content')
|
||||
content.find('> .tool').detach()
|
||||
var seperators = content.find('> .toolbar_seperator').detach()
|
||||
var separators = content.find('> .toolbar_separator').detach()
|
||||
var sep_nr = 0;
|
||||
|
||||
this.children.forEach(function(item, i) {
|
||||
if (typeof item === 'string') {
|
||||
var last = content.find('> :last-child')
|
||||
if (last.length === 0 || last.hasClass('toolbar_seperator') || i == scope.children.length-1) {
|
||||
if (last.length === 0 || last.hasClass('toolbar_separator') || i == scope.children.length-1) {
|
||||
return
|
||||
}
|
||||
var sep = seperators[sep_nr]
|
||||
var sep = separators[sep_nr]
|
||||
if (sep) {
|
||||
content.append(sep)
|
||||
sep_nr++;
|
||||
} else {
|
||||
content.append('<div class="toolbar_seperator"></div>')
|
||||
content.append('<div class="toolbar_separator"></div>')
|
||||
}
|
||||
} else if (typeof item === 'object') {
|
||||
if (BARS.condition( item.condition )) {
|
||||
content.append(item.getNode())
|
||||
item.toolbars.safePush(scope)
|
||||
} else {
|
||||
item.toolbars.remove(scope)
|
||||
}
|
||||
} else if (!BARS.condition( item.condition )) {
|
||||
} else {
|
||||
content.append(item.getNode())
|
||||
}
|
||||
})
|
||||
var last = content.find('> :last-child')
|
||||
if (last.length && last.hasClass('toolbar_seperator')) {
|
||||
if (last.length && last.hasClass('toolbar_separator')) {
|
||||
last.remove()
|
||||
}
|
||||
this.save()
|
||||
@ -820,29 +848,6 @@ var BARS = {
|
||||
toolbar: 'transform',
|
||||
keybind: new Keybind({key: 83})
|
||||
})
|
||||
new Tool({
|
||||
id: 'brush_tool',
|
||||
icon: 'fa-paint-brush',
|
||||
category: 'tools',
|
||||
toolbar: 'brush',
|
||||
selectFace: true,
|
||||
transformerMode: 'hidden',
|
||||
paintTool: true,
|
||||
allowWireframe: false,
|
||||
keybind: new Keybind({key: 66}),
|
||||
onCanvasClick: function(data) {
|
||||
Painter.startBrushCanvas(data, data.event)
|
||||
},
|
||||
onSelect: function() {
|
||||
BarItems.slider_brush_size.update()
|
||||
BarItems.slider_brush_softness.update()
|
||||
BarItems.slider_brush_opacity.update()
|
||||
$('.UVEditor').find('#uv_size').hide()
|
||||
},
|
||||
onUnselect: function() {
|
||||
$('.UVEditor').find('#uv_size').show()
|
||||
}
|
||||
})
|
||||
new Tool({
|
||||
id: 'vertex_snap_tool',
|
||||
icon: 'icon-vertexsnap',
|
||||
@ -971,7 +976,7 @@ var BARS = {
|
||||
id: 'undo',
|
||||
icon: 'undo',
|
||||
category: 'edit',
|
||||
condition: () => (!display_mode && !Animator.open),
|
||||
condition: () => (!display_mode),
|
||||
keybind: new Keybind({key: 90, ctrl: true}),
|
||||
click: function () {Undo.undo()}
|
||||
})
|
||||
@ -979,7 +984,7 @@ var BARS = {
|
||||
id: 'redo',
|
||||
icon: 'redo',
|
||||
category: 'edit',
|
||||
condition: () => (!display_mode && !Animator.open),
|
||||
condition: () => (!display_mode),
|
||||
keybind: new Keybind({key: 89, ctrl: true}),
|
||||
click: function () {Undo.redo()}
|
||||
})
|
||||
@ -1416,8 +1421,8 @@ var BARS = {
|
||||
var name = $('#action_search_bar').val().toUpperCase()
|
||||
var list = [{
|
||||
icon: 'bookmark',
|
||||
name: tl('data.seperator'),
|
||||
type: 'seperator'
|
||||
name: tl('data.separator'),
|
||||
type: 'separator'
|
||||
}]
|
||||
if (this.showAll == false) {
|
||||
return list
|
||||
@ -1451,7 +1456,8 @@ var BARS = {
|
||||
$('#bar_items_current .tooltip').css('display', '')
|
||||
setTimeout(() => {
|
||||
if ($('#bar_items_current:hover').length === 0) {
|
||||
var item = this.currentBar.splice(event.oldIndex, 1)[0]
|
||||
var item = scope.currentBar.splice(event.oldIndex, 1)[0]
|
||||
item.toolbars.remove(BARS.editing_bar)
|
||||
scope.update()
|
||||
}
|
||||
}, 30)
|
||||
@ -1463,11 +1469,11 @@ var BARS = {
|
||||
BARS.editing_bar.update()
|
||||
},
|
||||
addItem: function(item) {
|
||||
if (item.type === 'seperator') {
|
||||
if (item.type === 'separator') {
|
||||
item = '_'
|
||||
}
|
||||
this.currentBar.push(item)
|
||||
this.update()
|
||||
BARS.editing_bar.add(item)
|
||||
BARS.editing_bar.update()
|
||||
}
|
||||
}
|
||||
})
|
||||
@ -1500,8 +1506,8 @@ class Menu {
|
||||
}
|
||||
hover(node, event) {
|
||||
if (event) event.stopPropagation()
|
||||
$(this.node).find('li.focused').removeClass('focused')
|
||||
$(this.node).find('li.opened').removeClass('opened')
|
||||
$(open_menu.node).find('li.focused').removeClass('focused')
|
||||
$(open_menu.node).find('li.opened').removeClass('opened')
|
||||
var obj = $(node)
|
||||
obj.addClass('focused')
|
||||
obj.parents('li.parent').addClass('opened')
|
||||
@ -1531,6 +1537,58 @@ class Menu {
|
||||
}
|
||||
}
|
||||
}
|
||||
keyNavigate(e) {
|
||||
var scope = this;
|
||||
var used;
|
||||
var obj = $(this.node)
|
||||
if (e.which >= 37 && e.which <= 40) {
|
||||
|
||||
if (obj.find('li.focused').length) {
|
||||
var old = obj.find('li.focused'), next;
|
||||
switch (e.which) {
|
||||
case 37: next = old.parent('ul').parent('li'); break;//<
|
||||
case 38: next = old.prevAll('li:not(.menu_separator)').first(); break;//UP
|
||||
case 39: next = old.find('ul li:first-child'); break;//>
|
||||
case 40: next = old.nextAll('li:not(.menu_separator)').first(); break;//DOWN
|
||||
}
|
||||
|
||||
if (!next.length && e.which%2 == 0) {
|
||||
var siblings = old.siblings('li:not(.menu_separator)')
|
||||
if (e.which === 38) {
|
||||
next = siblings.last()
|
||||
} else {
|
||||
next = siblings.first()
|
||||
}
|
||||
}
|
||||
if (next && next.length) {
|
||||
old.removeClass('focused')
|
||||
scope.hover(next.get(0))
|
||||
} else if (scope.type === 'bar_menu' && e.which%2) {
|
||||
var index = MenuBar.keys.indexOf(scope.id)
|
||||
index += (e.which == 39 ? 1 : -1)
|
||||
if (index < 0) {
|
||||
index = MenuBar.keys.length-1
|
||||
} else if (index >= MenuBar.keys.length) {
|
||||
index = 0;
|
||||
}
|
||||
MenuBar.menues[MenuBar.keys[index]].open()
|
||||
}
|
||||
} else {
|
||||
obj.find('> li:first-child').addClass('focused')
|
||||
}
|
||||
used = true;
|
||||
} else if (Keybinds.extra.confirm.keybind.isTriggered(e)) {
|
||||
obj.find('li.focused').click()
|
||||
if (scope) {
|
||||
scope.hide()
|
||||
}
|
||||
used = true;
|
||||
} else if (Keybinds.extra.cancel.keybind.isTriggered(e)) {
|
||||
scope.hide()
|
||||
used = true;
|
||||
}
|
||||
return used;
|
||||
}
|
||||
open(position, context) {
|
||||
|
||||
var scope = this;
|
||||
@ -1546,9 +1604,9 @@ class Menu {
|
||||
|
||||
var entry;
|
||||
if (s === '_') {
|
||||
entry = new MenuSeperator().menu_node
|
||||
entry = new MenuSeparator().menu_node
|
||||
var last = parent.children().last()
|
||||
if (last.length && !last.hasClass('menu_seperator')) {
|
||||
if (last.length && !last.hasClass('menu_separator')) {
|
||||
parent.append(entry)
|
||||
}
|
||||
} else if (typeof s === 'string' || s instanceof Action) {
|
||||
@ -1598,7 +1656,7 @@ class Menu {
|
||||
getEntry(s2, childlist)
|
||||
})
|
||||
var last = childlist.children().last()
|
||||
if (last.length && last.hasClass('menu_seperator')) {
|
||||
if (last.length && last.hasClass('menu_separator')) {
|
||||
last.remove()
|
||||
}
|
||||
}
|
||||
@ -1611,11 +1669,11 @@ class Menu {
|
||||
}
|
||||
}
|
||||
|
||||
this.structure.forEach(function(s, i) {
|
||||
scope.structure.forEach(function(s, i) {
|
||||
getEntry(s, ctxmenu)
|
||||
})
|
||||
var last = ctxmenu.children().last()
|
||||
if (last.length && last.hasClass('menu_seperator')) {
|
||||
if (last.length && last.hasClass('menu_separator')) {
|
||||
last.remove()
|
||||
}
|
||||
|
||||
@ -1643,7 +1701,7 @@ class Menu {
|
||||
ctxmenu.css('left', offset_left+'px')
|
||||
ctxmenu.css('top', offset_top +'px')
|
||||
|
||||
$(this.node).filter(':not(.tx)').addClass('tx').click(function(ev) {
|
||||
$(scope.node).filter(':not(.tx)').addClass('tx').click(function(ev) {
|
||||
if (
|
||||
ev.target.className.includes('parent') ||
|
||||
(ev.target.parentNode && ev.target.parentNode.className.includes('parent'))
|
||||
@ -1653,13 +1711,12 @@ class Menu {
|
||||
|
||||
})
|
||||
|
||||
if (this.type === 'bar_menu') {
|
||||
MenuBar.open = this
|
||||
$(this.label).addClass('opened')
|
||||
if (scope.type === 'bar_menu') {
|
||||
MenuBar.open = scope
|
||||
$(scope.label).addClass('opened')
|
||||
}
|
||||
open_menu = this;
|
||||
return this;
|
||||
|
||||
open_menu = scope;
|
||||
return scope;
|
||||
}
|
||||
show(position) {
|
||||
return this.open(position);
|
||||
@ -1796,6 +1853,7 @@ var MenuBar = {
|
||||
{name: 'menu.file.export', id: 'export', icon: 'insert_drive_file', children: [
|
||||
'export_blockmodel',
|
||||
'export_entity',
|
||||
'export_class_entity',
|
||||
'export_optifine_part',
|
||||
'export_optifine_full',
|
||||
'export_obj'
|
||||
@ -1885,7 +1943,7 @@ var MenuBar = {
|
||||
icon: icon,
|
||||
name: p.id ? tl('display.preset.'+p.id) : p.name,
|
||||
click: function() {
|
||||
applyDisplayPreset(p)
|
||||
DisplayMode.applyPreset(p)
|
||||
}
|
||||
})
|
||||
})
|
||||
@ -1907,7 +1965,7 @@ var MenuBar = {
|
||||
icon: icon,
|
||||
name: p.id ? tl('display.preset.'+p.id) : p.name,
|
||||
click: function() {
|
||||
applyDisplayPreset(p, true)
|
||||
DisplayMode.applyPreset(p, true)
|
||||
}
|
||||
})
|
||||
})
|
||||
@ -1945,14 +2003,16 @@ var MenuBar = {
|
||||
'fullscreen',
|
||||
{name: 'menu.view.zoom', id: 'zoom', condition: isApp, icon: 'search', children: [
|
||||
'zoom_in',
|
||||
'zoom_out'
|
||||
'zoom_out',
|
||||
'zoom_reset'
|
||||
]},
|
||||
'_',
|
||||
'toggle_wireframe',
|
||||
'toggle_quad_view',
|
||||
{name: 'menu.view.screenshot', id: 'screenshot', condition: isApp, icon: 'camera_alt', children: [
|
||||
'screenshot_model',
|
||||
'screenshot_app'
|
||||
'screenshot_app',
|
||||
'record_model_gif',
|
||||
]},
|
||||
])
|
||||
MenuBar.update()
|
||||
|
156
js/animations.js
156
js/animations.js
@ -22,8 +22,34 @@ class Animation {
|
||||
Merge.number(this, data, 'length')
|
||||
return this;
|
||||
}
|
||||
undoCopy() {
|
||||
var scope = this;
|
||||
var copy = {
|
||||
uuid: this.uuid,
|
||||
name: this.name,
|
||||
loop: this.loop,
|
||||
override: this.override,
|
||||
anim_time_update: this.anim_time_update,
|
||||
length: this.length,
|
||||
selected: this.selected,
|
||||
}
|
||||
if (this.bones.length) {
|
||||
copy.bones = {}
|
||||
for (var uuid in this.bones) {
|
||||
var kfs = this.bones[uuid].keyframes
|
||||
if (kfs && kfs.length) {
|
||||
var kfs_copy = copy.bones[uuid] = []
|
||||
kfs.forEach(kf => {
|
||||
kfs_copy.push(kf.undoCopy())
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
return copy;
|
||||
}
|
||||
select() {
|
||||
var scope = this;
|
||||
var selected_bone = selected_group
|
||||
Animator.animations.forEach(function(a) {
|
||||
a.selected = false;
|
||||
})
|
||||
@ -44,6 +70,10 @@ class Animation {
|
||||
})
|
||||
}
|
||||
iterate(TreeElements)
|
||||
|
||||
if (selected_bone) {
|
||||
selected_bone.select()
|
||||
}
|
||||
Animator.preview()
|
||||
return this;
|
||||
}
|
||||
@ -212,7 +242,7 @@ class BoneAnimator {
|
||||
|
||||
if (!arr) {
|
||||
} else if (arr.length === 4) {
|
||||
var added_rotation = new THREE.Euler().setFromQuaternion(new THREE.Quaternion().fromArray(arr))
|
||||
var added_rotation = new THREE.Euler().setFromQuaternion(new THREE.Quaternion().fromArray(arr), 'ZYX')
|
||||
bone.rotation.x -= added_rotation.x
|
||||
bone.rotation.y -= added_rotation.y
|
||||
bone.rotation.z += added_rotation.z
|
||||
@ -441,6 +471,47 @@ class Keyframe {
|
||||
Animator.preview()
|
||||
return this;
|
||||
}
|
||||
findNearest(distance, channel, direction) {
|
||||
if (!this.parent) return [];
|
||||
//channel: all, others, this, 0, 1, 2
|
||||
//direction: true>, false<, undefined<>
|
||||
var scope = this
|
||||
function getDelta(kf, abs) {
|
||||
if (abs) {
|
||||
return Math.abs(kf.time - scope.time)
|
||||
} else {
|
||||
return kf.time - scope.time
|
||||
}
|
||||
}
|
||||
var matches = []
|
||||
var i = 0;
|
||||
while (i < scope.parent.keyframes.length) {
|
||||
var kf = scope.parent.keyframes[i]
|
||||
let delta = getDelta(kf)
|
||||
|
||||
let delta_match = Math.abs(delta) <= distance &&
|
||||
(delta>0 == direction || direction === undefined)
|
||||
|
||||
let channel_match = (
|
||||
(channel === 'all') ||
|
||||
(channel === 'others' && kf.channel !== scope.channel) ||
|
||||
(channel === 'this' && kf.channel === scope.channel) ||
|
||||
(channel === kf.channel_index) ||
|
||||
(channel === kf.channel)
|
||||
)
|
||||
|
||||
if (channel_match && delta_match) {
|
||||
matches.push(kf)
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
matches.sort((a, b) => {
|
||||
return getDelta(a, true) - getDelta(b, true)
|
||||
})
|
||||
|
||||
return matches
|
||||
}
|
||||
showContextMenu(event) {
|
||||
if (!this.selected) {
|
||||
this.select();
|
||||
@ -448,7 +519,7 @@ class Keyframe {
|
||||
this.menu.open(event, this);
|
||||
return this;
|
||||
}
|
||||
remove(selected) {
|
||||
remove() {
|
||||
if (this.parent) {
|
||||
this.parent.keyframes.remove(this)
|
||||
}
|
||||
@ -468,6 +539,22 @@ class Keyframe {
|
||||
this.channel_index = this.channel === 'rotation' ? 0 : (this.channel === 'position' ? 1 : 2)
|
||||
return this;
|
||||
}
|
||||
undoCopy() {
|
||||
var copy = {
|
||||
channel: this.channel_index,
|
||||
time: this.time,
|
||||
x: this.x,
|
||||
//uuid: this.uuid
|
||||
}
|
||||
if (this.channel_index !== 2) {//Not Scale
|
||||
copy.y = this.y
|
||||
copy.z = this.z
|
||||
}
|
||||
if (this.channel_index === 0 && this.isQuaternion) {
|
||||
copy.w = this.w
|
||||
}
|
||||
return copy;
|
||||
}
|
||||
}
|
||||
Keyframe.prototype.menu = new Menu([
|
||||
{name: 'menu.keyframe.quaternion',
|
||||
@ -549,6 +636,7 @@ function selectAllKeyframes() {
|
||||
updateKeyframeSelection()
|
||||
}
|
||||
function removeSelectedKeyframes() {
|
||||
Undo.initEdit({keyframes: Timeline.selected})
|
||||
var i = Timeline.keyframes.length;
|
||||
while (i > 0) {
|
||||
i--;
|
||||
@ -557,6 +645,7 @@ function removeSelectedKeyframes() {
|
||||
kf.remove()
|
||||
}
|
||||
}
|
||||
Undo.finishEdit('remove keyframes')
|
||||
}
|
||||
|
||||
|
||||
@ -567,7 +656,6 @@ const Animator = {
|
||||
animations: [],
|
||||
frame: 0,
|
||||
interval: false,
|
||||
playing: false,
|
||||
join: function() {
|
||||
|
||||
Animator.open = true;
|
||||
@ -715,8 +803,10 @@ const Animator = {
|
||||
|
||||
}
|
||||
const Timeline = {
|
||||
keyframes: [],//frames
|
||||
selected: [],//frames
|
||||
second: 0,
|
||||
playing: false,
|
||||
setTime: function(seconds) {
|
||||
seconds = limitNumber(seconds, 0, 1000)
|
||||
Timeline.vue._data.marker = seconds
|
||||
@ -753,23 +843,33 @@ const Timeline = {
|
||||
Timeline.setTime(Timeline.second)
|
||||
}
|
||||
})*/
|
||||
$('#timeline_inner #timeline_time').mousedown((e) => {
|
||||
$('#timeline_inner #timeline_time').mousedown(e => {
|
||||
Timeline.dragging_marker = true;
|
||||
let time = e.offsetX / Timeline.vue._data.size
|
||||
Timeline.setTime(time)
|
||||
if (Animator.selected) {
|
||||
Animator.preview()
|
||||
}
|
||||
})
|
||||
.mousemove((e) => {
|
||||
.mousemove(e => {
|
||||
if (Timeline.dragging_marker) {
|
||||
let time = (e.offsetX-8) / Timeline.vue._data.size
|
||||
let time = e.offsetX / Timeline.vue._data.size
|
||||
Timeline.setTime(time)
|
||||
if (Animator.selected) {
|
||||
Animator.preview()
|
||||
}
|
||||
}
|
||||
})
|
||||
$(document).mouseup((e) => {
|
||||
$(document).mouseup(e => {
|
||||
if (Timeline.dragging_marker) {
|
||||
delete Timeline.dragging_marker
|
||||
}
|
||||
})
|
||||
$('.keyframe_input').click(e => {
|
||||
Undo.initEdit({keyframes: Timeline.selected})
|
||||
}).focusout(e => {
|
||||
Undo.finishEdit('edit keyframe')
|
||||
})
|
||||
Timeline.is_setup = true
|
||||
},
|
||||
update: function() {
|
||||
@ -778,6 +878,7 @@ const Timeline = {
|
||||
axis: 'x',
|
||||
distance: 10,
|
||||
start: function(event, ui) {
|
||||
Undo.initEdit({keyframes: Timeline.keyframes})
|
||||
var id = $(ui.helper).attr('id')
|
||||
var i = 0;
|
||||
while (i < Timeline.vue._data.keyframes.length) {
|
||||
@ -791,12 +892,32 @@ const Timeline = {
|
||||
drag: function(event, ui) {
|
||||
var difference = (ui.position.left - ui.originalPosition.left - 8) / Timeline.vue._data.size;
|
||||
var id = $(ui.helper).attr('id')
|
||||
var snap_value = false
|
||||
var nearest
|
||||
var i = 0;
|
||||
while (i < Timeline.vue._data.keyframes.length) {
|
||||
var kf = Timeline.vue._data.keyframes[i]
|
||||
if (kf.uuid === id) {
|
||||
i = Infinity
|
||||
kf.time = limitNumber(kf.time_before + difference, 0, 256)
|
||||
nearest = kf.findNearest(8 / Timeline.vue._data.size, 'others')
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if (nearest && nearest.length) {
|
||||
snap_value = nearest[0].time
|
||||
difference = snap_value - kf.time_before;
|
||||
}
|
||||
|
||||
var i = 0;
|
||||
while (i < Timeline.vue._data.keyframes.length) {
|
||||
var kf = Timeline.vue._data.keyframes[i]
|
||||
if (kf.uuid === id || kf.selected) {
|
||||
kf.time = limitNumber(kf.time_before + difference, 0, 256)
|
||||
//i = Infinity
|
||||
var t = limitNumber(kf.time_before + difference, 0, 256)
|
||||
if (kf.uuid === id) {
|
||||
ui.position.left = t * Timeline.vue._data.size + 8
|
||||
}
|
||||
kf.time = t
|
||||
}
|
||||
i++;
|
||||
}
|
||||
@ -813,6 +934,7 @@ const Timeline = {
|
||||
}
|
||||
i++;
|
||||
}
|
||||
Undo.finishEdit('drag keyframes')
|
||||
}
|
||||
})
|
||||
},
|
||||
@ -860,7 +982,7 @@ const Timeline = {
|
||||
if (!Animator.selected) return;
|
||||
Animator.selected.getMaxLength()
|
||||
Timeline.pause()
|
||||
Animator.playing = true
|
||||
Timeline.playing = true
|
||||
BarItems.play_animation.setIcon('pause')
|
||||
Timeline.loop()
|
||||
},
|
||||
@ -881,7 +1003,7 @@ const Timeline = {
|
||||
}
|
||||
},
|
||||
pause: function() {
|
||||
Animator.playing = false;
|
||||
Timeline.playing = false;
|
||||
BarItems.play_animation.setIcon('play_arrow')
|
||||
if (Animator.interval) {
|
||||
clearInterval(Animator.interval)
|
||||
@ -898,8 +1020,10 @@ const Timeline = {
|
||||
Blockbench.showQuickMessage('message.no_bone_selected')
|
||||
return
|
||||
}
|
||||
Undo.initEdit({keyframes: bone.keyframes})
|
||||
var kf = bone.addKeyframe(false, Timeline.second, channel?channel:'rotation')
|
||||
kf.select()
|
||||
Undo.finishEdit('add_keyframe')
|
||||
Vue.nextTick(Timeline.update)
|
||||
},
|
||||
showMenu: function(event) {
|
||||
@ -917,9 +1041,11 @@ const Timeline = {
|
||||
}
|
||||
var bone = Animator.selected.getBoneAnimator()
|
||||
if (bone) {
|
||||
Undo.initEdit({keyframes: bone.keyframes})
|
||||
var kf = bone.addKeyframe(false, Math.round(time*30)/30, row === 2 ? 'scale' : (row === 1 ? 'position' : 'rotation'))
|
||||
kf.select().callMarker()
|
||||
Vue.nextTick(Timeline.update)
|
||||
Undo.finishEdit('add_keyframe')
|
||||
} else {
|
||||
Blockbench.showQuickMessage('message.no_bone_selected')
|
||||
}
|
||||
@ -996,7 +1122,7 @@ BARS.defineActions(function() {
|
||||
condition: () => Animator.open,
|
||||
click: function () {
|
||||
|
||||
if (Animator.playing) {
|
||||
if (Timeline.playing) {
|
||||
Timeline.pause()
|
||||
} else {
|
||||
Timeline.start()
|
||||
@ -1032,6 +1158,12 @@ BARS.defineActions(function() {
|
||||
kf.time = limitNumber(value, 0, 1e4)
|
||||
})
|
||||
Animator.preview()
|
||||
},
|
||||
onBefore: function() {
|
||||
Undo.initEdit({keyframes: Timeline.selected})
|
||||
},
|
||||
onAfter: function() {
|
||||
Undo.finishEdit('edit keyframe')
|
||||
}
|
||||
})
|
||||
new Action({
|
||||
|
25
js/api.js
25
js/api.js
@ -85,19 +85,6 @@ class API {
|
||||
setTimeout(function() {
|
||||
Blockbench.setStatusBarText()
|
||||
}, time ? time : 600)
|
||||
/*
|
||||
var status_message = $('#status_message')
|
||||
var status_name = $('#status_name')
|
||||
|
||||
status_message.text(tl(message))
|
||||
|
||||
status_name.hide(100)
|
||||
status_message.show(100)
|
||||
|
||||
setTimeout(function() {
|
||||
status_message.hide(100)
|
||||
status_name.show(100)
|
||||
}, time ? time : 600)*/
|
||||
}
|
||||
setStatusBarText(text) {
|
||||
if (text) {
|
||||
@ -153,7 +140,7 @@ class API {
|
||||
}
|
||||
buttons[options.confirm].addClass('confirm_btn')
|
||||
buttons[options.cancel].addClass('cancel_btn')
|
||||
jq_dialog.append($('<div class="dialog_bar"></div>').append(buttons))
|
||||
jq_dialog.append($('<div class="dialog_bar button_bar"></div>').append(buttons))
|
||||
|
||||
|
||||
jq_dialog.addClass('draggable')
|
||||
@ -432,17 +419,13 @@ class API {
|
||||
}
|
||||
//Flags
|
||||
addFlag(flag) {
|
||||
if (!this.hasFlag(flag)) {
|
||||
this.flags.push(flag)
|
||||
}
|
||||
this.flags[flag] = true
|
||||
}
|
||||
removeFlag(flag) {
|
||||
|
||||
this.flags.remove(flag)
|
||||
delete this.flags[flag]
|
||||
}
|
||||
hasFlag(flag) {
|
||||
|
||||
return this.flags.includes(flag)
|
||||
return this.flags[flag]
|
||||
}
|
||||
//Events
|
||||
dispatchEvent(event_name, event) {
|
||||
|
@ -336,6 +336,8 @@ function findEntityTexture(mob, return_path) {
|
||||
|
||||
if (return_path === true) {
|
||||
return texture_path+'.png';
|
||||
} else if (return_path === 'raw') {
|
||||
return ['entity', ...path.split('/')].join(osfs)
|
||||
} else {
|
||||
if (fs.existsSync(texture_path + '.png')) {
|
||||
var texture = new Texture({keep_size: true}).fromPath(texture_path + '.png').add()
|
||||
|
@ -1,4 +1,4 @@
|
||||
const appVersion = '2.1.0'
|
||||
const appVersion = '2.2.0'
|
||||
var osfs = '/'
|
||||
var File, i;
|
||||
const elements = [];
|
||||
@ -106,30 +106,13 @@ function initializeApp() {
|
||||
}
|
||||
})
|
||||
$('#cubes_list').contextmenu(function(event) {
|
||||
new Menu([
|
||||
'add_cube',
|
||||
'add_group',
|
||||
'sort_outliner',
|
||||
'select_all',
|
||||
'collapse_groups',
|
||||
'outliner_toggle'
|
||||
]).show(event)
|
||||
Interface.Panels.outliner.menu.show(event)
|
||||
})
|
||||
$('#texture_list').contextmenu(function(event) {
|
||||
new Menu([
|
||||
'import_texture',
|
||||
'create_texture',
|
||||
'reload_textures',
|
||||
'change_textures_folder',
|
||||
'save_textures'
|
||||
]).show(event)
|
||||
Interface.Panels.textures.menu.show(event)
|
||||
})
|
||||
$('#status_bar').contextmenu(function(event) {
|
||||
new Menu([
|
||||
'project_window',
|
||||
'open_model_folder',
|
||||
'save'
|
||||
]).show(event)
|
||||
Interface.status_bar.menu.show(event)
|
||||
})
|
||||
$(window).on( "unload", saveLocalStorages)
|
||||
|
||||
@ -310,7 +293,7 @@ function updateSelection() {
|
||||
}
|
||||
if (obj.visibility) {
|
||||
var mesh = obj.getMesh()
|
||||
if (mesh) {
|
||||
if (mesh && mesh.outline) {
|
||||
mesh.outline.visible = obj.selected
|
||||
}
|
||||
}
|
||||
@ -332,7 +315,7 @@ function updateSelection() {
|
||||
if (Blockbench.entity_mode) {
|
||||
if (selected_group) {
|
||||
$('.selection_only#options').css('visibility', 'visible')
|
||||
if (settings.origin_size.value > 0) {
|
||||
if (settings.origin_size.value > 0 && selected_group.visibility) {
|
||||
selected_group.getMesh().add(rot_origin)
|
||||
}
|
||||
} else {
|
||||
@ -347,7 +330,10 @@ function updateSelection() {
|
||||
} else {
|
||||
//Origin Helper
|
||||
if (selected.length === 1 && selected[0].visibility) {
|
||||
selected[0].getMesh().add(rot_origin)
|
||||
let mesh = selected[0].getMesh()
|
||||
if (mesh) {
|
||||
mesh.add(rot_origin)
|
||||
}
|
||||
} else if (selected.length > 0) {
|
||||
var origin = null;
|
||||
var first_visible = null;
|
||||
@ -368,7 +354,10 @@ function updateSelection() {
|
||||
i++;
|
||||
}
|
||||
if (first_visible && typeof origin === 'object') {
|
||||
first_visible.getMesh().add(rot_origin)
|
||||
let mesh = first_visible.getMesh()
|
||||
if (mesh) {
|
||||
mesh.add(rot_origin)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -469,20 +458,27 @@ var Screencam = {
|
||||
} else if (isApp) {
|
||||
var screenshot = nativeImage.createFromDataURL(dataUrl)
|
||||
var img = new Image()
|
||||
var is_gif = dataUrl.substr(5, 9) == 'image/gif'
|
||||
img.src = dataUrl
|
||||
|
||||
var btns = [tl('dialog.save')]
|
||||
if (!is_gif) {
|
||||
btns.push(tl('message.screenshot.clipboard'))
|
||||
}
|
||||
Blockbench.showMessageBox({
|
||||
translateKey: 'screenshot',
|
||||
icon: img,
|
||||
buttons: [tl('dialog.save'), tl('message.screenshot.clipboard')],
|
||||
buttons: btns,
|
||||
confirm: 0,
|
||||
cancel: 1
|
||||
cancel: btns.length-1
|
||||
}, function(result) {
|
||||
if (result === 0) {
|
||||
app.dialog.showSaveDialog(currentwindow, {filters: [ {name: tl('data.image'), extensions: ['png']} ]}, function (fileName) {
|
||||
app.dialog.showSaveDialog(currentwindow, {filters: [ {name: tl('data.image'), extensions: [is_gif ? 'gif' : 'png']} ]}, function (fileName) {
|
||||
if (fileName === undefined) {
|
||||
return;
|
||||
}
|
||||
fs.writeFile(fileName, screenshot.toPNG(), function (err) {})
|
||||
//fs.writeFile(fileName, screenshot.toPNG(), function (err) {})
|
||||
fs.writeFile(fileName, Buffer(dataUrl.split(',')[1],'base64'), err => {})
|
||||
})
|
||||
} else if (result === 1) {
|
||||
clipboard.writeImage(screenshot)
|
||||
@ -500,6 +496,36 @@ var Screencam = {
|
||||
},
|
||||
cleanCanvas: function(options, cb) {
|
||||
quad_previews.current.screenshot(options, cb)
|
||||
},
|
||||
createGif: function(options, cb) {
|
||||
if (typeof options !== 'object') {
|
||||
options = {}
|
||||
}
|
||||
var interval = options.fps ? (1000/options.fps) : 100
|
||||
var gif = new GIF({
|
||||
repeat: options.repeat,
|
||||
quality: options.quality,
|
||||
transparent: 0x000000,
|
||||
})
|
||||
gif.on('finished', blob => {
|
||||
var reader = new FileReader()
|
||||
reader.onload = () => {
|
||||
Screencam.returnScreenshot(reader.result, cb)
|
||||
}
|
||||
reader.readAsDataURL(blob)
|
||||
})
|
||||
gif.addFrame(quad_previews.current.canvas)
|
||||
var loop = setInterval(() => {
|
||||
gif.addFrame(quad_previews.current.canvas, {delay: interval})
|
||||
}, interval)
|
||||
|
||||
setTimeout(() => {
|
||||
clearInterval(loop)
|
||||
gif.render()
|
||||
if (Animator.open && Timeline.playing) {
|
||||
Timeline.pause()
|
||||
}
|
||||
}, options.length || 1000)
|
||||
}
|
||||
}
|
||||
var Clipbench = {
|
||||
|
150
js/display.js
150
js/display.js
@ -1,3 +1,4 @@
|
||||
|
||||
var display = {}
|
||||
Blockbench.display_settings = display
|
||||
var ground_animation = false;
|
||||
@ -5,6 +6,13 @@ var ground_timer = 0
|
||||
var display_slot;
|
||||
var display_preview;
|
||||
var display_clipboard;
|
||||
var enterDisplaySettings, exitDisplaySettings;
|
||||
const DisplayMode = {};
|
||||
|
||||
|
||||
|
||||
(function() {
|
||||
|
||||
|
||||
class refModel {
|
||||
constructor(id) {
|
||||
@ -232,7 +240,7 @@ class refModel {
|
||||
},
|
||||
{
|
||||
//Body Layer
|
||||
"size": [9, 13, 5],
|
||||
"size": [8.5, 12.5, 4.5],
|
||||
"pos": [0, 18, 0],
|
||||
"north": {"uv": [6.968, 9.032, 5.032, 11.968]},
|
||||
"east": {"uv": [7.968, 9.032, 7.032, 11.968]},
|
||||
@ -256,7 +264,7 @@ class refModel {
|
||||
},
|
||||
{
|
||||
//R Leg Layer
|
||||
"size": [5, 13, 5],
|
||||
"size": [4.5, 12.5, 4.5],
|
||||
"pos": [1.95, 6, 0],
|
||||
"origin": [0, 12, 0],
|
||||
"rotation": [-1, 0, 0],
|
||||
@ -282,7 +290,7 @@ class refModel {
|
||||
},
|
||||
{
|
||||
//L Leg Layer
|
||||
"size": [5, 13, 5],
|
||||
"size": [4.5, 12.5, 4.5],
|
||||
"pos": [-1.95, 6, 0],
|
||||
"origin": [0, 12, 0],
|
||||
"rotation": [1, 0, 0],
|
||||
@ -310,7 +318,7 @@ class refModel {
|
||||
},
|
||||
{
|
||||
//R Arm Layer
|
||||
"size": [5, 13, 5],
|
||||
"size": [4.5, 12.5, 4.5],
|
||||
"pos": [6, 18, 0],
|
||||
"origin": [4, 22, 0],
|
||||
"rotation": [22.5, 0, 0],
|
||||
@ -338,7 +346,7 @@ class refModel {
|
||||
},
|
||||
{
|
||||
//L Arm Layer
|
||||
"size": [5, 13, 5],
|
||||
"size": [4.5, 12.5, 4.5],
|
||||
"pos": [-6, 18, 0],
|
||||
"origin": [-4, 22, 0],
|
||||
"rotation": [22.5, 0, 0],
|
||||
@ -367,7 +375,7 @@ class refModel {
|
||||
},
|
||||
{
|
||||
//R Arm Layer
|
||||
"size": [4, 13, 5],
|
||||
"size": [3.5, 12.5, 4.5],
|
||||
"pos": [5.5, 18, 0],
|
||||
"origin": [0, 22, 0],
|
||||
"rotation": [22.5, 0, 0],
|
||||
@ -395,7 +403,7 @@ class refModel {
|
||||
},
|
||||
{
|
||||
//L Arm Layer
|
||||
"size": [4, 13, 5],
|
||||
"size": [3.5, 12.5, 4.5],
|
||||
"pos": [-5.5, 18, 0],
|
||||
"origin": [0, 22, 0],
|
||||
"rotation": [22.5, 0, 0],
|
||||
@ -1136,7 +1144,7 @@ class refModel {
|
||||
], 'assets/item_frame.png')
|
||||
}
|
||||
}
|
||||
var displayReferenceObjects = {
|
||||
window.displayReferenceObjects = {
|
||||
refmodels: {
|
||||
player: new refModel('player'),
|
||||
zombie: new refModel('zombie'),
|
||||
@ -1199,7 +1207,7 @@ var displayReferenceObjects = {
|
||||
]
|
||||
}
|
||||
|
||||
function enterDisplaySettings() { //Enterung Display Setting Mode, changes the scene etc
|
||||
enterDisplaySettings = function() { //Enterung Display Setting Mode, changes the scene etc
|
||||
display_mode = true;
|
||||
|
||||
selected = []
|
||||
@ -1224,7 +1232,7 @@ function enterDisplaySettings() { //Enterung Display Setting Mode, changes the
|
||||
updateInterface()
|
||||
//return;
|
||||
|
||||
loadDispThirdRight()
|
||||
DisplayMode.loadThirdRight()
|
||||
buildGrid()
|
||||
setShading()
|
||||
Canvas.updateRenderSides()
|
||||
@ -1234,7 +1242,7 @@ function enterDisplaySettings() { //Enterung Display Setting Mode, changes the
|
||||
Canvas.updateAllPositions()
|
||||
}
|
||||
}
|
||||
function exitDisplaySettings() { //Enterung Display Setting Mode, changes the scene etc
|
||||
exitDisplaySettings = function() { //Enterung Display Setting Mode, changes the scene etc
|
||||
resetDisplayBase()
|
||||
setDisplayArea(0,0,0, 0,0,0, 1,1,1)
|
||||
|
||||
@ -1286,29 +1294,27 @@ function resetDisplayBase() {
|
||||
}
|
||||
|
||||
|
||||
function syncDispInput(obj, sender, axis, event) {//Syncs Range and Input, calls the change functions
|
||||
DisplayMode.syncDispInput = function(obj, sender, axis, event) {//Syncs Range and Input, calls the change functions
|
||||
var val = $(obj).val()
|
||||
var raw_val;
|
||||
var range_val;
|
||||
if (typeof val === 'string' || val instanceof String) {
|
||||
val = parseFloat(val.replace(/[^-.0-9]/g, ""))
|
||||
}
|
||||
if (isNaN(val)) val = 0
|
||||
|
||||
if (sender === 'rotation') {
|
||||
if (val > 180) val = 180
|
||||
if (val < -180) val = -180
|
||||
val = limitNumber(val, -180, 180)
|
||||
$(obj).siblings('input').val(val)
|
||||
dispRotate(val, axis)
|
||||
return;
|
||||
} else if (sender === 'translation') {
|
||||
if (val > 80) val = 80
|
||||
if (val < -80) val = -80
|
||||
val = limitNumber(val, -80, 80)
|
||||
$(obj).siblings('input').val(val);
|
||||
dispTranslate(val, axis)
|
||||
return;
|
||||
} else if (sender === 'scaleRange') {
|
||||
//From Range to Real
|
||||
raw_val = val
|
||||
range_val = val
|
||||
if (val >= 0) {
|
||||
val = (val*(3/4))+1
|
||||
if (val >=4) val = 4
|
||||
@ -1316,15 +1322,16 @@ function syncDispInput(obj, sender, axis, event) {//Syncs Range and Input, calls
|
||||
val = (val+4)/4
|
||||
}
|
||||
$(obj).parent().find('input.scale').val(val)
|
||||
|
||||
} else if (sender === 'scale') {
|
||||
//From Input(Real) to Range
|
||||
if (display[display_slot].scale == undefined) {
|
||||
display[display_slot].scale = [1,1,1]
|
||||
}
|
||||
if (val >= 1) {
|
||||
raw_val = (val-1)*(4/3)
|
||||
range_val = (Math.abs(val)-1)*(4/3)
|
||||
} else {
|
||||
raw_val =(val*4)-4
|
||||
range_val =(Math.abs(val)*4)-4
|
||||
}
|
||||
}
|
||||
|
||||
@ -1332,13 +1339,21 @@ function syncDispInput(obj, sender, axis, event) {//Syncs Range and Input, calls
|
||||
dispScale(val, 'x')
|
||||
dispScale(val, 'y')
|
||||
dispScale(val, 'z')
|
||||
$('#display_settings input.scale').val(val)
|
||||
$('#display_settings input.scaleRange').val(raw_val)
|
||||
$('.panel#display input.scale').val(Math.abs(val))
|
||||
$('.panel#display input.scaleRange').val(range_val)
|
||||
} else {
|
||||
dispScale(val, axis)
|
||||
$(obj).parent().find('input.scaleRange').val(raw_val)
|
||||
$(obj).parent().find('input.scaleRange').val(range_val)
|
||||
}
|
||||
}
|
||||
DisplayMode.syncDispMirror = function(node, axis) {
|
||||
if (!display[display_slot].scale) {
|
||||
return;
|
||||
}
|
||||
var axis = (node.id||'x').substr(-1)
|
||||
display_base.scale[axis] = display[display_slot].scale[axisIndex(axis)] *= -1
|
||||
loadDisp(display_slot)
|
||||
}
|
||||
function dispRotate(val, axis) { //Change the actual thing
|
||||
if (display[display_slot].rotation == undefined) {
|
||||
display[display_slot].rotation = [0,0,0]
|
||||
@ -1361,15 +1376,18 @@ function dispTranslate(val, axis) { //Change the actual thing
|
||||
}
|
||||
function dispScale(val, axis) { //Change the actual thing
|
||||
if (display[display_slot].scale == undefined) {
|
||||
display[display_slot].scale = [0,0,0]
|
||||
display[display_slot].scale = [1,1,1]
|
||||
}
|
||||
var scale_tag = display[display_slot].scale
|
||||
var is_inverse = scale_tag[axisIndex(axis)] < 0
|
||||
|
||||
val = limitNumber(val, 0.001, 4)
|
||||
display[display_slot].scale[axisIndex(axis)] = val
|
||||
scale_tag[axisIndex(axis)] = val * (is_inverse ? -1 : 1)
|
||||
if (val == 0) val = 0.001
|
||||
display_base.scale[axis] = val
|
||||
display_base.scale[axis] = val * (is_inverse ? -1 : 1)
|
||||
}
|
||||
|
||||
function resetDisplaySettings(key) {
|
||||
DisplayMode.resetDisplaySettings = function(key) {
|
||||
delete display[display_slot][key]
|
||||
$('input#'+key+'_x').val(0)
|
||||
$('input#'+key+'_y').val(0)
|
||||
@ -1392,7 +1410,7 @@ function resetDisplaySettings(key) {
|
||||
}
|
||||
}
|
||||
|
||||
function applyDisplayPreset(preset, all) {
|
||||
DisplayMode.applyPreset = function(preset, all) {
|
||||
if (preset == undefined) return;
|
||||
var slots = [display_slot]
|
||||
if (all) {
|
||||
@ -1406,9 +1424,9 @@ function applyDisplayPreset(preset, all) {
|
||||
if (typeof display[sl] !== 'object') display[sl] = {}
|
||||
$.extend(true, display[sl], preset.areas[sl])
|
||||
})
|
||||
loadSlot(display_slot)
|
||||
DisplayMode.load(display_slot)
|
||||
}
|
||||
function createPreset() {
|
||||
DisplayMode.createPreset = function() {
|
||||
var name = $('input#preset_name').val()
|
||||
if (name == '') {
|
||||
$('input#preset_name').val(tl('display.preset.blank_name'))
|
||||
@ -1442,7 +1460,7 @@ function setDisplayArea(x, y, z, rx, ry, rz, sx, sy, sz) {//Sets the Work Area t
|
||||
display_area.scale['y'] = sy;
|
||||
display_area.scale['z'] = sz;
|
||||
}
|
||||
function groundAnimation() {
|
||||
DisplayMode.groundAnimation = function() {
|
||||
display_area.rotation.y += 0.015
|
||||
ground_timer += 1
|
||||
display_area.position.y = 13.5 + Math.sin(Math.PI * (ground_timer / 100)) * Math.PI/2
|
||||
@ -1470,7 +1488,7 @@ function getDisplayNumber(key, mode, axis) {
|
||||
return def;
|
||||
}
|
||||
}
|
||||
function loadDisp(key, skin) { //Loads The Menu and slider values, common for all Radio Buttons
|
||||
function loadDisp(key) { //Loads The Menu and slider values, common for all Radio Buttons
|
||||
display_slot = key
|
||||
//enterScene(key)
|
||||
resetDisplayBase()
|
||||
@ -1480,7 +1498,7 @@ function loadDisp(key, skin) { //Loads The Menu and slider values, common for al
|
||||
display_preview.controls.enabled = true;
|
||||
ground_animation = false;
|
||||
$('input#translation_z').prop('disabled', false)
|
||||
$('#donation_hint').hide()
|
||||
$('#display_crosshair').detach()
|
||||
display_preview.camPers.setFocalLength(45)
|
||||
|
||||
if (display[key] == undefined) {
|
||||
@ -1494,12 +1512,15 @@ function loadDisp(key, skin) { //Loads The Menu and slider values, common for al
|
||||
$('input#translation_y').val(getDisplayNumber(key, 'translation', 1))
|
||||
$('input#translation_z').val(getDisplayNumber(key, 'translation', 2))
|
||||
|
||||
$('input#scale_x').val(getDisplayNumber(key, 'scale', 0))
|
||||
$('input#scale_y').val(getDisplayNumber(key, 'scale', 1))
|
||||
$('input#scale_z').val(getDisplayNumber(key, 'scale', 2))
|
||||
syncDispInput($('input#scale_x'), 'scale')
|
||||
syncDispInput($('input#scale_y'), 'scale')
|
||||
syncDispInput($('input#scale_z'), 'scale')
|
||||
$('input#scale_x').val(Math.abs(getDisplayNumber(key, 'scale', 0)))
|
||||
$('input#scale_y').val(Math.abs(getDisplayNumber(key, 'scale', 1)))
|
||||
$('input#scale_z').val(Math.abs(getDisplayNumber(key, 'scale', 2)))
|
||||
DisplayMode.syncDispInput($('input#scale_x'), 'scale')
|
||||
DisplayMode.syncDispInput($('input#scale_y'), 'scale')
|
||||
DisplayMode.syncDispInput($('input#scale_z'), 'scale')
|
||||
$('#display_scale_invert_x i').text(getDisplayNumber(key, 'scale', 0) > 0 ? 'check_box_outline_blank' : 'check_box')
|
||||
$('#display_scale_invert_y i').text(getDisplayNumber(key, 'scale', 1) > 0 ? 'check_box_outline_blank' : 'check_box')
|
||||
$('#display_scale_invert_z i').text(getDisplayNumber(key, 'scale', 2) > 0 ? 'check_box_outline_blank' : 'check_box')
|
||||
|
||||
display_base.rotation['x'] = Math.PI / (180 / getDisplayNumber(key, 'rotation', 0));
|
||||
display_base.rotation['y'] = Math.PI / (180 / getDisplayNumber(key, 'rotation', 1));
|
||||
@ -1512,19 +1533,20 @@ function loadDisp(key, skin) { //Loads The Menu and slider values, common for al
|
||||
display_base.scale['x'] = getDisplayNumber(key, 'scale', 0);
|
||||
display_base.scale['y'] = getDisplayNumber(key, 'scale', 1);
|
||||
display_base.scale['z'] = getDisplayNumber(key, 'scale', 2);
|
||||
|
||||
}
|
||||
function loadDispThirdRight() { //Loader
|
||||
loadDisp('thirdperson_righthand', true)
|
||||
DisplayMode.loadThirdRight = function() { //Loader
|
||||
loadDisp('thirdperson_righthand')
|
||||
displayReferenceObjects.bar(['player', 'zombie', 'baby_zombie', 'armor_stand', 'armor_stand_small'])
|
||||
}
|
||||
function loadDispThirdLeft() { //Loader
|
||||
loadDisp('thirdperson_lefthand', true)
|
||||
DisplayMode.loadThirdLeft = function() { //Loader
|
||||
loadDisp('thirdperson_lefthand')
|
||||
display_base.position['x'] = -getDisplayNumber('thirdperson_lefthand', 'translation', 0)
|
||||
display_base.rotation['y'] = Math.PI / (180 / -getDisplayNumber('thirdperson_lefthand', 'rotation', 1))
|
||||
display_base.rotation['z'] = Math.PI / (180 / -getDisplayNumber('thirdperson_lefthand', 'rotation', 2))
|
||||
displayReferenceObjects.bar(['player', 'zombie', 'baby_zombie', 'armor_stand', 'armor_stand_small'])
|
||||
}
|
||||
function loadDispFirstRight() { //Loader
|
||||
DisplayMode.loadFirstRight = function() { //Loader
|
||||
loadDisp('firstperson_righthand')
|
||||
setDisplayArea(-20.8, -8.4, 9, 0, 270, 0, 1,1,1)
|
||||
display_preview.camPers.setFocalLength(12)
|
||||
@ -1532,8 +1554,9 @@ function loadDispFirstRight() { //Loader
|
||||
display_preview.controls.target.set(0,0,0)
|
||||
display_preview.controls.enabled = false
|
||||
displayReferenceObjects.bar(['monitor', 'bow'])
|
||||
$('.single_canvas_wrapper').append('<div id="display_crosshair"></div>')
|
||||
}
|
||||
function loadDispFirstLeft() { //Loader
|
||||
DisplayMode.loadFirstLeft = function() { //Loader
|
||||
loadDisp('firstperson_lefthand')
|
||||
display_base.position['x'] = -getDisplayNumber('firstperson_lefthand', 'translation', 0)
|
||||
display_base.rotation['y'] = Math.PI / (180 / -getDisplayNumber('firstperson_lefthand', 'rotation', 1))
|
||||
@ -1544,12 +1567,13 @@ function loadDispFirstLeft() { //Loader
|
||||
display_preview.controls.target.set(0,0,0)
|
||||
display_preview.controls.enabled = false
|
||||
displayReferenceObjects.bar(['monitor', 'bow'])
|
||||
$('.single_canvas_wrapper').append('<div id="display_crosshair"></div>')
|
||||
}
|
||||
function loadDispHead() { //Loader
|
||||
loadDisp('head', true)
|
||||
DisplayMode.loadHead = function() { //Loader
|
||||
loadDisp('head')
|
||||
displayReferenceObjects.bar(['player', 'zombie', 'baby_zombie', 'armor_stand', 'armor_stand_small'])
|
||||
}
|
||||
function loadDispGUI() { //Loader
|
||||
DisplayMode.loadGUI = function() { //Loader
|
||||
loadDisp('gui')
|
||||
setDisplayArea(0, 0, 0, 0, 0, 0, 0.4, 0.4, 0.4)
|
||||
display_preview.camOrtho.zoom = 1
|
||||
@ -1559,43 +1583,43 @@ function loadDispGUI() { //Loader
|
||||
display_preview.camOrtho.position.set(0,0,32)
|
||||
displayReferenceObjects.bar(['inventory_nine', 'inventory_full', 'hud'])
|
||||
}
|
||||
function loadDispGround() { //Loader
|
||||
DisplayMode.loadGround = function() { //Loader
|
||||
loadDisp('ground')
|
||||
setDisplayArea(0, 12, 0, 0, 0, 0, 1, 1, 1)
|
||||
ground_animation = true;
|
||||
ground_timer = 0
|
||||
displayReferenceObjects.bar(['block'])
|
||||
}
|
||||
function loadDispFixed() { //Loader
|
||||
DisplayMode.loadFixed = function() { //Loader
|
||||
loadDisp('fixed')
|
||||
setDisplayArea(0, 0, -8.5, 0, 0, 0, 0.5, 0.5, 0.5)
|
||||
displayReferenceObjects.bar(['frame'])
|
||||
}
|
||||
function loadSlot(slot) {
|
||||
switch (slot) {
|
||||
DisplayMode.load = function(slot) {
|
||||
switch (slot) {
|
||||
case 'thirdperson_righthand':
|
||||
loadDispThirdRight()
|
||||
DisplayMode.loadThirdRight()
|
||||
break;
|
||||
case 'thirdperson_lefthand':
|
||||
loadDispThirdLeft()
|
||||
DisplayMode.loadThirdLeft()
|
||||
break;
|
||||
case 'firstperson_righthand':
|
||||
loadDispFirstRight()
|
||||
DisplayMode.loadFirstRight()
|
||||
break;
|
||||
case 'firstperson_lefthand':
|
||||
loadDispFirstLeft()
|
||||
DisplayMode.loadFirstLeft()
|
||||
break;
|
||||
case 'head':
|
||||
loadDispHead()
|
||||
DisplayMode.loadHead()
|
||||
break;
|
||||
case 'gui':
|
||||
loadDispGUI()
|
||||
DisplayMode.loadGUI()
|
||||
break;
|
||||
case 'ground':
|
||||
loadDispGround()
|
||||
DisplayMode.loadGround()
|
||||
break;
|
||||
case 'fixed':
|
||||
loadDispFixed()
|
||||
DisplayMode.loadFixed()
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -1630,10 +1654,10 @@ function pasteDisplaySlot() {
|
||||
$.extend(true, clear_content, display_clipboard)
|
||||
$.extend(true, display[slot], clear_content)
|
||||
*/
|
||||
loadSlot(display_slot)
|
||||
DisplayMode.load(display_slot)
|
||||
}
|
||||
|
||||
function changeDisplaySkin() {
|
||||
window.changeDisplaySkin = function() {
|
||||
var buttons = [
|
||||
tl('message.display_skin.upload'),
|
||||
tl('message.display_skin.reset')
|
||||
@ -1758,3 +1782,5 @@ BARS.defineActions(function() {
|
||||
click: function () {showDialog('create_preset')}
|
||||
})
|
||||
})
|
||||
|
||||
})()
|
@ -300,7 +300,7 @@ class Cube extends OutlinerElement {
|
||||
if (!this.parent || (this.parent === 'root' && TreeElements.indexOf(this) === -1)) {
|
||||
this.addTo()
|
||||
}
|
||||
if (!this.getMesh() || !scene.children.includes(this.getMesh())) {
|
||||
if (this.visibility && (!this.getMesh() || !scene.children.includes(this.getMesh()))) {
|
||||
Canvas.addCube(this)
|
||||
}
|
||||
if (update !== false) {
|
||||
@ -496,11 +496,13 @@ class Cube extends OutlinerElement {
|
||||
TreeElements.clearObjectRecursive(this)
|
||||
if (this.visibility) {
|
||||
var mesh = this.getMesh()
|
||||
if (mesh.parent) {
|
||||
mesh.parent.remove(mesh)
|
||||
if (mesh) {
|
||||
if (mesh.parent) {
|
||||
mesh.parent.remove(mesh)
|
||||
}
|
||||
delete Canvas.meshes[this.uuid]
|
||||
mesh.geometry.dispose()
|
||||
}
|
||||
delete Canvas.meshes[this.uuid]
|
||||
mesh.geometry.dispose()
|
||||
}
|
||||
delete Canvas.meshes[this.uuid]
|
||||
if (selected.includes(this)) {
|
||||
@ -743,7 +745,7 @@ class Cube extends OutlinerElement {
|
||||
} else {
|
||||
var sides = faces
|
||||
}
|
||||
var id = '$transparent'
|
||||
var id = null
|
||||
if (texture && texture.id !== undefined) {
|
||||
id = '#'+texture.id
|
||||
} else if (texture === 'blank') {
|
||||
@ -752,7 +754,7 @@ class Cube extends OutlinerElement {
|
||||
sides.forEach(function(side) {
|
||||
scope.faces[side].texture = id
|
||||
})
|
||||
if (this.selected) {
|
||||
if (selected.indexOf(this) === 0) {
|
||||
main_uv.loadData()
|
||||
}
|
||||
if (!Prop.wireframe && scope.visibility == true) {
|
||||
@ -1118,7 +1120,6 @@ class Group extends OutlinerElement {
|
||||
this.children[i].remove(false)
|
||||
i--;
|
||||
}
|
||||
Canvas.updateIndexes()
|
||||
if (typeof this.parent === 'object') {
|
||||
this.parent.children.remove(this)
|
||||
} else {
|
||||
@ -1817,12 +1818,10 @@ function toggleCubeProperty(key) {
|
||||
Undo.initEdit({cubes: selected})
|
||||
selected.forEach(cube => {
|
||||
cube[key] = state;
|
||||
if (key === 'visibility') {
|
||||
Canvas.updateVisibility()
|
||||
} else if (key === 'autouv') {
|
||||
|
||||
}
|
||||
})
|
||||
if (key === 'visibility') {
|
||||
Canvas.updateVisibility()
|
||||
}
|
||||
Undo.finishEdit('toggle_prop')
|
||||
}
|
||||
|
||||
|
@ -6,6 +6,7 @@ class Panel {
|
||||
var scope = this;
|
||||
this.type = 'panel'
|
||||
this.id = data.id || 'new_panel'
|
||||
this.menu = data.menu
|
||||
this.title = data.title || tl('panel.'+this.id)
|
||||
this.condition = data.condition
|
||||
this.onResize = data.onResize
|
||||
@ -231,6 +232,7 @@ var Interface = {
|
||||
})}
|
||||
})
|
||||
},
|
||||
status_bar: {},
|
||||
Panels: {}
|
||||
}
|
||||
|
||||
@ -274,7 +276,14 @@ function setupInterface() {
|
||||
condition: function() {return !display_mode && !Animator.open},
|
||||
toolbars: {
|
||||
head: Toolbars.textures
|
||||
}
|
||||
},
|
||||
menu: new Menu([
|
||||
'import_texture',
|
||||
'create_texture',
|
||||
'reload_textures',
|
||||
'change_textures_folder',
|
||||
'save_textures'
|
||||
])
|
||||
})
|
||||
Interface.Panels.options = new Panel({
|
||||
id: 'options',
|
||||
@ -288,7 +297,15 @@ function setupInterface() {
|
||||
condition: function() {return !display_mode},
|
||||
toolbars: {
|
||||
head: Toolbars.outliner
|
||||
}
|
||||
},
|
||||
menu: new Menu([
|
||||
'add_cube',
|
||||
'add_group',
|
||||
'sort_outliner',
|
||||
'select_all',
|
||||
'collapse_groups',
|
||||
'outliner_toggle'
|
||||
])
|
||||
})
|
||||
Interface.Panels.animations = new Panel({
|
||||
id: 'animations',
|
||||
@ -329,6 +346,13 @@ function setupInterface() {
|
||||
})
|
||||
|
||||
|
||||
Interface.status_bar.menu = new Menu([
|
||||
'project_window',
|
||||
'open_model_folder',
|
||||
'save'
|
||||
])
|
||||
|
||||
|
||||
//Tooltip Fix
|
||||
$('.tool').on('mouseenter', function() {
|
||||
|
||||
@ -623,15 +647,7 @@ function updateUIColor() {
|
||||
|
||||
//BBLayout
|
||||
function applyBBStyle(data) {
|
||||
if (typeof data === 'string') {
|
||||
try {
|
||||
data = JSON.parse(data)
|
||||
|
||||
} catch(err) {
|
||||
console.log(err)
|
||||
return;
|
||||
}
|
||||
}
|
||||
data = autoParseJSON(data)
|
||||
if (typeof data !== 'object') return;
|
||||
$.extend(app_colors, data)
|
||||
if (data.css) {
|
||||
@ -644,6 +660,9 @@ function applyBBStyle(data) {
|
||||
//UI Edit
|
||||
function setProgressBar(id, val, time) {
|
||||
$('#'+id+' > .progress_bar_inner').animate({width: val*488}, time-1)
|
||||
if (isApp) {
|
||||
currentwindow.setProgressBar(val)
|
||||
}
|
||||
}
|
||||
|
||||
//Tooltip
|
||||
|
397
js/io.js
397
js/io.js
@ -9,7 +9,7 @@ function newProject(entity_mode) {
|
||||
textures.length = 0;
|
||||
selected.length = 0;
|
||||
selected_group = undefined;
|
||||
display = {};
|
||||
Blockbench.display_settings = display = {};
|
||||
Project.name = Project.parent = Project.description = '';
|
||||
Project.texture_width = Project.texture_height = 16;
|
||||
Project.ambientocclusion = true;
|
||||
@ -74,7 +74,7 @@ function setupDragHandlers() {
|
||||
}
|
||||
} else {
|
||||
files.forEach(function(f) {
|
||||
new Texture().fromFile(files[0]).add().fillParticle()
|
||||
new Texture().fromFile(f).add().fillParticle()
|
||||
})
|
||||
}
|
||||
}
|
||||
@ -146,7 +146,7 @@ function loadBlockModel(model, filepath, add) {
|
||||
var uv_stated = false;
|
||||
for (var face in base_cube.faces) {
|
||||
if (obj.faces[face] === undefined) {
|
||||
base_cube.faces[face].texture = '$transparent'
|
||||
base_cube.faces[face].texture = null
|
||||
base_cube.faces[face].uv = [0,0,0,0]
|
||||
} else if (typeof obj.faces[face].uv === 'object') {
|
||||
uv_stated = true
|
||||
@ -192,10 +192,10 @@ function loadBlockModel(model, filepath, add) {
|
||||
faces: {
|
||||
north: {uv: [16,0,0,16], texture: 'layer0'},
|
||||
south: {uv: [16,0,16,0], texture: 'layer0'},
|
||||
east: {uv: [0,0,0,0], texture: '$transparent'},
|
||||
west: {uv: [0,0,0,0], texture: '$transparent'},
|
||||
up: {uv: [0,0,0,0], texture: '$transparent'},
|
||||
down: {uv: [0,0,0,0], texture: '$transparent'},
|
||||
east: {uv: [0,0,0,0], texture: null},
|
||||
west: {uv: [0,0,0,0], texture: null},
|
||||
up: {uv: [0,0,0,0], texture: null},
|
||||
down: {uv: [0,0,0,0], texture: null},
|
||||
},
|
||||
autouv: 0,
|
||||
export: false
|
||||
@ -321,7 +321,7 @@ function loadJEMModel(model) {
|
||||
//Bone
|
||||
var group = new Group({
|
||||
name: b.part,
|
||||
origin: b.origin,
|
||||
origin: b.translate,
|
||||
rotation: b.rotate,
|
||||
shade: !(b.mirrorTexture && b.mirrorTexture.includes('u'))
|
||||
})
|
||||
@ -694,9 +694,6 @@ var Extruder = {
|
||||
|
||||
var jimage = Jimp.read(Extruder.ext_img.src).then(function(image) {
|
||||
var pixel_opacity_tolerance = $('#scan_tolerance').val()
|
||||
function isOpaquePixel(px_x, px_y) {
|
||||
return parseInt(image.getPixelColor(px_x, px_y).toString(16).substr(6,2), 16) >= pixel_opacity_tolerance;
|
||||
}
|
||||
|
||||
//var ext_x, ext_y;
|
||||
var finished_pixels = {}
|
||||
@ -709,6 +706,12 @@ var Extruder = {
|
||||
Extruder.width = Extruder.height;
|
||||
}
|
||||
scale_i = 16 / Extruder.width;
|
||||
|
||||
function isOpaquePixel(px_x, px_y) {
|
||||
return Math.isBetween(px_x, 0, Extruder.width-1)
|
||||
&& Math.isBetween(px_y, 0, Extruder.height-1)
|
||||
&& parseInt(image.getPixelColor(px_x, px_y).toString(16).substr(6,2), 16) >= pixel_opacity_tolerance;
|
||||
}
|
||||
function finishPixel(x, y) {
|
||||
if (finished_pixels[x] === undefined) {
|
||||
finished_pixels[x] = {}
|
||||
@ -721,131 +724,112 @@ var Extruder = {
|
||||
|
||||
//Scanning
|
||||
let ext_y = 0;
|
||||
asyncLoop({
|
||||
length : Extruder.height,
|
||||
functionToLoop : function(async_loop, i){
|
||||
setTimeout(function(){
|
||||
while (ext_y < Extruder.height) {
|
||||
|
||||
let ext_x = 0;
|
||||
while (ext_x < Extruder.width) {
|
||||
if (isPixelFinished(ext_x, ext_y) === false && isOpaquePixel(ext_x, ext_y) === true) {
|
||||
let ext_x = 0;
|
||||
while (ext_x < Extruder.width) {
|
||||
if (isPixelFinished(ext_x, ext_y) === false && isOpaquePixel(ext_x, ext_y) === true) {
|
||||
|
||||
//Search From New Pixel
|
||||
var loop = true;
|
||||
var rect = {x: ext_x, y: ext_y, x2: ext_x, y2: ext_y}
|
||||
var safety_limit = 5000
|
||||
//Search From New Pixel
|
||||
var loop = true;
|
||||
var rect = {x: ext_x, y: ext_y, x2: ext_x, y2: ext_y}
|
||||
var safety_limit = 5000
|
||||
|
||||
//Expanding Loop
|
||||
while (loop === true && safety_limit) {
|
||||
var y_check, x_check, canExpandX, canExpandY;
|
||||
//Expand X
|
||||
if (scan_mode === 'areas' || scan_mode === 'lines') {
|
||||
y_check = rect.y
|
||||
x_check = rect.x2 + scale_i
|
||||
canExpandX = true
|
||||
while (y_check <= rect.y2) {
|
||||
//Check If Row is Free
|
||||
if (isOpaquePixel(x_check, y_check) === false || isPixelFinished(x_check, y_check) === true) {
|
||||
canExpandX = false;
|
||||
}
|
||||
y_check += scale_i
|
||||
}
|
||||
if (canExpandX === true) {
|
||||
rect.x2 += scale_i
|
||||
}
|
||||
} else {
|
||||
//Expanding Loop
|
||||
while (loop === true && safety_limit) {
|
||||
var y_check, x_check, canExpandX, canExpandY;
|
||||
//Expand X
|
||||
if (scan_mode === 'areas' || scan_mode === 'lines') {
|
||||
y_check = rect.y
|
||||
x_check = rect.x2 + 1
|
||||
canExpandX = true
|
||||
while (y_check <= rect.y2) {
|
||||
//Check If Row is Free
|
||||
if (isOpaquePixel(x_check, y_check) === false || isPixelFinished(x_check, y_check) === true) {
|
||||
canExpandX = false;
|
||||
}
|
||||
//Expand Y
|
||||
if (scan_mode === 'areas' || scan_mode === 'columns') {
|
||||
x_check = rect.x
|
||||
y_check = rect.y2 + scale_i
|
||||
canExpandY = true
|
||||
while (x_check <= rect.x2) {
|
||||
//Check If Row is Free
|
||||
if (isOpaquePixel(x_check, y_check) === false || isPixelFinished(x_check, y_check) === true) {
|
||||
canExpandY = false
|
||||
}
|
||||
x_check += scale_i
|
||||
}
|
||||
if (canExpandY === true) {
|
||||
rect.y2 += scale_i
|
||||
}
|
||||
} else {
|
||||
canExpandY = false;
|
||||
}
|
||||
//Conclusion
|
||||
if (canExpandX === false && canExpandY === false) {
|
||||
loop = false;
|
||||
}
|
||||
safety_limit--;
|
||||
y_check += 1
|
||||
}
|
||||
if (scan_mode === 'areas' || scan_mode === 'columns') {
|
||||
rect.x2 += scale_i-1;
|
||||
if (canExpandX === true) {
|
||||
rect.x2 += 1
|
||||
}
|
||||
if (scan_mode === 'areas' || scan_mode === 'columns') {
|
||||
rect.y2 += scale_i-1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//Draw Rectangle
|
||||
var draw_x = rect.x
|
||||
var draw_y = rect.y
|
||||
while (draw_y <= rect.y2) {
|
||||
draw_x = rect.x
|
||||
while (draw_x <= rect.x2) {
|
||||
finishPixel(draw_x, draw_y)
|
||||
draw_x++;
|
||||
}
|
||||
draw_y++;
|
||||
}
|
||||
var current_cube = new Cube({name: cube_name+'_'+cube_nr, autouv: 0})
|
||||
|
||||
current_cube.from = [rect.x*scale_i, 0, rect.y*scale_i]
|
||||
current_cube.to = [(rect.x2+1)*scale_i, scale_i, (rect.y2+1)*scale_i]
|
||||
|
||||
//Sides
|
||||
current_cube.faces.up = {uv:[rect.x*scale_i, rect.y*scale_i, (rect.x2+1)*scale_i, (rect.y2+1)*scale_i], texture: texture_index}
|
||||
current_cube.faces.down = {uv:[rect.x*scale_i, (rect.y2+1)*scale_i, (rect.x2+1)*scale_i, rect.y*scale_i], texture: texture_index}
|
||||
|
||||
current_cube.faces.north = {uv:[(rect.x2+1)*scale_i, rect.y*scale_i, rect.x*scale_i, (rect.y+1)*scale_i], texture: texture_index}
|
||||
current_cube.faces.south = {uv:[rect.x*scale_i, rect.y2*scale_i, (rect.x2+1)*scale_i, (rect.y2+1)*scale_i], texture: texture_index}
|
||||
|
||||
current_cube.faces.east = {uv:[rect.x2*scale_i, rect.y*scale_i, (rect.x2+1)*scale_i, (rect.y2+1)*scale_i], texture: texture_index, rotation: 90}
|
||||
current_cube.faces.west = {uv:[rect.x*scale_i, rect.y*scale_i, (rect.x+1)*scale_i, (rect.y2+1)*scale_i], texture: texture_index, rotation: 270}
|
||||
|
||||
elements.push(current_cube)
|
||||
selected.push(elements[elements.length-1])
|
||||
cube_nr++;
|
||||
} else {
|
||||
canExpandX = false;
|
||||
}
|
||||
|
||||
|
||||
ext_x++;
|
||||
//Expand Y
|
||||
if (scan_mode === 'areas' || scan_mode === 'columns') {
|
||||
x_check = rect.x
|
||||
y_check = rect.y2 + 1
|
||||
canExpandY = true
|
||||
while (x_check <= rect.x2) {
|
||||
//Check If Row is Free
|
||||
if (isOpaquePixel(x_check, y_check) === false || isPixelFinished(x_check, y_check) === true) {
|
||||
canExpandY = false
|
||||
}
|
||||
x_check += 1
|
||||
}
|
||||
if (canExpandY === true) {
|
||||
rect.y2 += 1
|
||||
}
|
||||
} else {
|
||||
canExpandY = false;
|
||||
}
|
||||
//Conclusion
|
||||
if (canExpandX === false && canExpandY === false) {
|
||||
loop = false;
|
||||
}
|
||||
safety_limit--;
|
||||
}
|
||||
setProgressBar('extrusion_bar', ext_y/Extruder.height, Extruder.width)
|
||||
ext_y++;
|
||||
async_loop()
|
||||
|
||||
},Extruder.width);
|
||||
},
|
||||
callback : function(){
|
||||
setProgressBar('extrusion_bar', 1)
|
||||
//Draw Rectangle
|
||||
var draw_x = rect.x
|
||||
var draw_y = rect.y
|
||||
while (draw_y <= rect.y2) {
|
||||
draw_x = rect.x
|
||||
while (draw_x <= rect.x2) {
|
||||
finishPixel(draw_x, draw_y)
|
||||
draw_x++;
|
||||
}
|
||||
draw_y++;
|
||||
}
|
||||
var current_cube = new Cube({name: cube_name+'_'+cube_nr, autouv: 0})
|
||||
|
||||
current_cube.from = [rect.x*scale_i, 0, rect.y*scale_i]
|
||||
current_cube.to = [(rect.x2+1)*scale_i, scale_i, (rect.y2+1)*scale_i]
|
||||
|
||||
var group = new Group(cube_name).addTo()
|
||||
selected.forEach(function(s) {
|
||||
s.addTo(group, false)
|
||||
})
|
||||
if (Blockbench.hasFlag('new_project') || isNewProject) {
|
||||
setProjectTitle(cube_name)
|
||||
Prop.project_saved = false;
|
||||
//Sides
|
||||
current_cube.faces.up = {uv:[rect.x*scale_i, rect.y*scale_i, (rect.x2+1)*scale_i, (rect.y2+1)*scale_i], texture: texture_index}
|
||||
current_cube.faces.down = {uv:[rect.x*scale_i, (rect.y2+1)*scale_i, (rect.x2+1)*scale_i, rect.y*scale_i], texture: texture_index}
|
||||
|
||||
current_cube.faces.north = {uv:[(rect.x2+1)*scale_i, rect.y*scale_i, rect.x*scale_i, (rect.y+1)*scale_i], texture: texture_index}
|
||||
current_cube.faces.south = {uv:[rect.x*scale_i, rect.y2*scale_i, (rect.x2+1)*scale_i, (rect.y2+1)*scale_i], texture: texture_index}
|
||||
|
||||
current_cube.faces.east = {uv:[rect.x2*scale_i, rect.y*scale_i, (rect.x2+1)*scale_i, (rect.y2+1)*scale_i], texture: texture_index, rotation: 90}
|
||||
current_cube.faces.west = {uv:[rect.x*scale_i, rect.y*scale_i, (rect.x+1)*scale_i, (rect.y2+1)*scale_i], texture: texture_index, rotation: 270}
|
||||
|
||||
elements.push(current_cube)
|
||||
selected.push(elements[elements.length-1])
|
||||
cube_nr++;
|
||||
}
|
||||
Blockbench.removeFlag('new_project')
|
||||
loadOutlinerDraggable()
|
||||
Canvas.updateAll()
|
||||
hideDialog()
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
ext_x++;
|
||||
}
|
||||
ext_y++;
|
||||
}
|
||||
|
||||
var group = new Group(cube_name).addTo()
|
||||
selected.forEach(function(s) {
|
||||
s.addTo(group, false)
|
||||
})
|
||||
if (Blockbench.hasFlag('new_project') || isNewProject) {
|
||||
setProjectTitle(cube_name)
|
||||
Prop.project_saved = false;
|
||||
}
|
||||
Blockbench.removeFlag('new_project')
|
||||
loadOutlinerDraggable()
|
||||
Canvas.updateAll()
|
||||
hideDialog()
|
||||
})
|
||||
}
|
||||
}
|
||||
@ -911,7 +895,7 @@ function buildBlockModel(options) {
|
||||
var e_faces = {}
|
||||
for (var face in s.faces) {
|
||||
if (s.faces.hasOwnProperty(face)) {
|
||||
if (s.faces[face].texture !== '$transparent') {
|
||||
if (s.faces[face].texture !== null) {
|
||||
var tag = new oneLiner()
|
||||
if (s.faces[face].enabled !== false) {
|
||||
tag.uv = s.faces[face].uv
|
||||
@ -1197,7 +1181,7 @@ function buildJPMModel(options) {
|
||||
box.coordinates = [s.from[0], s.from[1], s.from[2], s.size(0), s.size(1), s.size(2)]
|
||||
for (var face in s.faces) {
|
||||
if (s.faces.hasOwnProperty(face)) {
|
||||
if (s.faces[face].texture !== undefined && s.faces[face].texture !== '$transparent') {
|
||||
if (s.faces[face].texture !== undefined && s.faces[face].texture !== null) {
|
||||
box['uv'+capitalizeFirstLetter(face)] = [
|
||||
s.faces[face].uv[0] / 16 * Project.texture_width,
|
||||
s.faces[face].uv[1] / 16 * Project.texture_height,
|
||||
@ -1318,6 +1302,123 @@ function buildJEMModel(options) {
|
||||
return autoStringify(entitymodel)
|
||||
}
|
||||
}
|
||||
function buildClassModel(options) {
|
||||
function F(num) {
|
||||
var s = trimFloatNumber(num) + ''
|
||||
if (!s.includes('.')) {
|
||||
s += '.0'
|
||||
}
|
||||
return s+'F';
|
||||
}
|
||||
|
||||
var bones = []
|
||||
var bone_nr = 1
|
||||
var model_id = Project.parent.replace('geometry.', '')
|
||||
var all_groups = getAllOutlinerGroups()
|
||||
|
||||
all_groups.forEach((g) => {
|
||||
//model += `\nthis.bone${bone_nr} = new ModelRenderer`
|
||||
var id = g.name
|
||||
bone_nr++;
|
||||
if (g.export === false) return;
|
||||
|
||||
var bone = {
|
||||
id: id,
|
||||
rootBone: g.parent.type !== 'group',
|
||||
lines: [
|
||||
`${id} = new ModelRenderer(this);`,//Texture Offset
|
||||
`${id}.setRotationPoint(${F(-g.origin[0])}, ${F(24-g.origin[1])}, ${F(g.origin[2])});`,
|
||||
]
|
||||
}
|
||||
//Rotation
|
||||
if (!g.rotation.allEqual(0)) {
|
||||
bone.lines.push(
|
||||
`setRotationAngle(${id}, ${
|
||||
F(Math.degToRad(-g.rotation[0])) }, ${
|
||||
F(Math.degToRad(-g.rotation[1])) }, ${
|
||||
F(Math.degToRad(-g.rotation[2])) });`
|
||||
)
|
||||
}
|
||||
//Parent
|
||||
if (!bone.rootBone) {
|
||||
let parent_index = all_groups.indexOf(g.parent)
|
||||
if (parent_index >= 0) {
|
||||
bone.lines.push(
|
||||
`${ g.parent.name }.addChild(${id});`
|
||||
)
|
||||
}
|
||||
}
|
||||
//Boxes
|
||||
g.children.forEach((obj) => {
|
||||
if (obj.export === false || obj.type !== 'cube') return;
|
||||
var values = [
|
||||
''+id,
|
||||
Math.floor(obj.uv_offset[0]),
|
||||
Math.floor(obj.uv_offset[1]),
|
||||
F(g.origin[0] - obj.to[0]),
|
||||
F(-obj.from[1] - obj.size(1, true) + g.origin[1]),
|
||||
F(obj.from[2] - g.origin[2]),
|
||||
obj.size(0, true),
|
||||
obj.size(1, true),
|
||||
obj.size(2, true),
|
||||
F(obj.inflate),
|
||||
!obj.shade
|
||||
]
|
||||
bone.lines.push(
|
||||
`${id}.cubeList.add(new ModelBox(${ values.join(', ') }));`
|
||||
)
|
||||
})
|
||||
|
||||
bones.push(bone)
|
||||
|
||||
})
|
||||
|
||||
|
||||
var model = (settings.credit.value
|
||||
? '//'+settings.credit.value+'\n'
|
||||
: '')+
|
||||
'//Paste this code into your mod. Don\'t forget to add your imports\n' +
|
||||
'\nimport org.lwjgl.opengl.GL11;'+
|
||||
'\nimport net.minecraft.client.model.ModelBase;'+
|
||||
'\nimport net.minecraft.client.model.ModelBox;'+
|
||||
'\nimport net.minecraft.client.model.ModelRenderer;'+
|
||||
'\nimport net.minecraft.client.renderer.GlStateManager;'+
|
||||
'\nimport net.minecraft.entity.Entity;\n'+
|
||||
'\npublic class '+model_id+' extends ModelBase {'
|
||||
|
||||
bones.forEach((bone) => {
|
||||
model += `\n public ModelRenderer ${bone.id};`;
|
||||
})
|
||||
|
||||
model += '\n'+
|
||||
'\n public '+model_id+'() {'+
|
||||
'\n textureWidth = '+ (Project.texture_width || 32) +';'+
|
||||
'\n textureHeight = '+ (Project.texture_height|| 32) +';\n';
|
||||
|
||||
bones.forEach((bone) => {
|
||||
model += `\n ${bone.lines.join('\n ')}\n`;
|
||||
})
|
||||
|
||||
model +=
|
||||
' }\n'+
|
||||
'\n @Override'+
|
||||
'\n public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { '
|
||||
|
||||
bones.forEach((bone) => {
|
||||
if (bone.rootBone) {
|
||||
model += `\n ${bone.id}.render(f5);`;
|
||||
}
|
||||
})
|
||||
model +=
|
||||
'\n }'+
|
||||
'\n public void setRotationAngle(ModelRenderer modelRenderer, float x, float y, float z) {'+
|
||||
'\n modelRenderer.rotateAngleX = x;'+
|
||||
'\n modelRenderer.rotateAngleY = y;'+
|
||||
'\n modelRenderer.rotateAngleZ = z;'+
|
||||
'\n }'+
|
||||
'\n}';
|
||||
return model;
|
||||
}
|
||||
function buildOBJModel(name) {
|
||||
scene.position.set(0,0,0)
|
||||
var exporter = new THREE.OBJExporter();
|
||||
@ -1403,15 +1504,26 @@ function autoParseJSON(data, feedback) {
|
||||
data = JSON.parse(data)
|
||||
} catch (err) {
|
||||
if (feedback === false) return;
|
||||
function logErrantPart(whole, start, length) {
|
||||
var line = whole.substr(0, start).match(/\n/gm)
|
||||
line = line ? line.length+1 : 1
|
||||
var result = '';
|
||||
var lines = whole.substr(start, length).split(/\n/gm)
|
||||
lines.forEach((s, i) => {
|
||||
result += `#${line+i} ${s}\n`
|
||||
})
|
||||
console.log(result.substr(0, result.length-1) + ' <-- HERE')
|
||||
}
|
||||
console.error(err)
|
||||
var length = err.toString().split('at position ')[1]
|
||||
if (length) {
|
||||
length = parseInt(length)
|
||||
var start = limitNumber(length-20, 0, Infinity)
|
||||
console.log(data.substr(start, 1+length-start) + ' <-- HERE')
|
||||
//console.log(data.substr(0, length+1) + ' <-- HERE')
|
||||
|
||||
logErrantPart(data, start, 1+length-start)
|
||||
} else if (err.toString().includes('Unexpected end of JSON input')) {
|
||||
console.log(data.substr(data.length-10, 10) + ' <-- HERE')
|
||||
|
||||
logErrantPart(data, data.length-10, 10)
|
||||
}
|
||||
Blockbench.showMessageBox({
|
||||
translateKey: 'invalid_file',
|
||||
@ -1437,7 +1549,10 @@ BARS.defineActions(function() {
|
||||
icon: 'pets',
|
||||
category: 'file',
|
||||
keybind: new Keybind({key: 78, ctrl: true, shift: true}),
|
||||
click: function () {newProject(true)}
|
||||
click: function () {
|
||||
newProject(true);
|
||||
showDialog('project_settings');
|
||||
}
|
||||
})
|
||||
new Action({
|
||||
id: 'open_model',
|
||||
@ -1484,11 +1599,11 @@ BARS.defineActions(function() {
|
||||
}, function(files) {
|
||||
if (files.length) {
|
||||
if (isApp) {
|
||||
new Texture().fromPath(files[0].path).add().fillParticle()
|
||||
new Texture().fromPath(files[0].path).add().fillParticle()
|
||||
} else {
|
||||
new Texture().fromDataURL(files[0].content).add().fillParticle()
|
||||
new Texture().fromDataURL(files[0].content).add().fillParticle()
|
||||
}
|
||||
showDialog('image_extruder')
|
||||
showDialog('image_extruder')
|
||||
Extruder.drawImage(isApp ? files[0].path : files[0].content)
|
||||
}
|
||||
})
|
||||
@ -1529,6 +1644,22 @@ BARS.defineActions(function() {
|
||||
})
|
||||
}
|
||||
})
|
||||
new Action({
|
||||
id: 'export_class_entity',
|
||||
icon: 'free_breakfast',
|
||||
category: 'file',
|
||||
condition: function() {return Blockbench.entity_mode},
|
||||
click: function () {
|
||||
var content = buildClassModel();
|
||||
Blockbench.export({
|
||||
type: 'Java Class',
|
||||
extensions: ['java'],
|
||||
name: Project.name,
|
||||
startpath: Prop.file_path,
|
||||
content: content
|
||||
})
|
||||
}
|
||||
})
|
||||
new Action({
|
||||
id: 'export_optifine_part',
|
||||
icon: 'icon-optifine_file',
|
||||
|
@ -271,53 +271,8 @@ $(document).keydown(function(e) {
|
||||
}
|
||||
} else if (open_menu) {
|
||||
|
||||
var obj = $(open_menu.node)
|
||||
if (e.which >= 37 && e.which <= 40) {
|
||||
used = open_menu.keyNavigate(e)||used
|
||||
|
||||
if (obj.find('li.focused').length) {
|
||||
var old = obj.find('li.focused'), next;
|
||||
switch (e.which) {
|
||||
case 37: next = old.parent('ul').parent('li'); break;//<
|
||||
case 38: next = old.prevAll('li:not(.menu_seperator)').first(); break;//UP
|
||||
case 39: next = old.find('ul li:first-child'); break;//>
|
||||
case 40: next = old.nextAll('li:not(.menu_seperator)').first(); break;//DOWN
|
||||
}
|
||||
|
||||
if (!next.length && e.which%2 == 0) {
|
||||
var siblings = old.siblings('li:not(.menu_seperator)')
|
||||
if (e.which === 38) {
|
||||
next = siblings.last()
|
||||
} else {
|
||||
next = siblings.first()
|
||||
}
|
||||
}
|
||||
if (next && next.length) {
|
||||
old.removeClass('focused')
|
||||
open_menu.hover(next)
|
||||
} else if (open_menu.type === 'bar_menu' && e.which%2) {
|
||||
var index = MenuBar.keys.indexOf(open_menu.id)
|
||||
index += (e.which == 39 ? 1 : -1)
|
||||
if (index < 0) {
|
||||
index = MenuBar.keys.length-1
|
||||
} else if (index >= MenuBar.keys.length) {
|
||||
index = 0;
|
||||
}
|
||||
MenuBar.menues[MenuBar.keys[index]].open()
|
||||
}
|
||||
} else {
|
||||
obj.find('> li:first-child').addClass('focused')
|
||||
}
|
||||
used = true;
|
||||
} else if (Keybinds.extra.confirm.keybind.isTriggered(e)) {
|
||||
obj.find('li.focused').click()
|
||||
if (open_menu) {
|
||||
open_menu.hide()
|
||||
}
|
||||
used = true;
|
||||
} else if (Keybinds.extra.cancel.keybind.isTriggered(e)) {
|
||||
open_menu.hide()
|
||||
used = true;
|
||||
}
|
||||
} else if (open_interface && typeof open_interface == 'object' && open_interface.hide) {
|
||||
if (Keybinds.extra.confirm.keybind.isTriggered(e)) {
|
||||
open_interface.confirm()
|
||||
|
@ -242,7 +242,7 @@ function previewVariableValue(name, time) {
|
||||
var i = 0;
|
||||
while (i < inputs.length) {
|
||||
let key, val;
|
||||
[key, val] = inputs[i].split('=')
|
||||
[key, val] = inputs[i].replace(/[\s;]/g, '').split('=')
|
||||
if (key === name) {
|
||||
return parseMolang(val)
|
||||
}
|
||||
|
@ -18,18 +18,9 @@ class BBPainter {
|
||||
texture === Painter.current.texture &&
|
||||
typeof Painter.current.image === 'object'
|
||||
) {
|
||||
cb(Painter.current.image)
|
||||
Painter.current.image = cb(Painter.current.image) || Painter.current.image
|
||||
Painter.current.image.getBase64(Jimp.MIME_PNG, function(a, dataUrl){
|
||||
texture.source = dataUrl
|
||||
texture.updateMaterial()
|
||||
main_uv.loadData()
|
||||
if (open_dialog === 'uv_dialog') {
|
||||
for (var editor in uv_dialog.editors) {
|
||||
if (uv_dialog.editors.hasOwnProperty(editor)) {
|
||||
uv_dialog.editors[editor].loadData()
|
||||
}
|
||||
}
|
||||
}
|
||||
texture.updateSource(dataUrl)
|
||||
if (!options.noUndo) {
|
||||
Undo.finishEdit('edit_texture')
|
||||
}
|
||||
@ -37,12 +28,10 @@ class BBPainter {
|
||||
} else {
|
||||
Painter.current.texture = texture
|
||||
Jimp.read(Buffer.from(texture.source.replace('data:image/png;base64,', ''), 'base64')).then(function(image) {
|
||||
cb(image)
|
||||
image = cb(image) || image
|
||||
Painter.current.image = image
|
||||
image.getBase64(Jimp.MIME_PNG, function(a, dataUrl){
|
||||
texture.source = dataUrl
|
||||
texture.updateMaterial()
|
||||
main_uv.loadData()
|
||||
texture.updateSource(dataUrl)
|
||||
if (!options.noUndo) {
|
||||
Undo.finishEdit('edit_texture')
|
||||
}
|
||||
@ -264,6 +253,7 @@ class BBPainter {
|
||||
r = Math.round(r)
|
||||
|
||||
image.scan(x-r-1, y-r-1, 2*r+3, 2*r+3, function (px, py, idx) {
|
||||
|
||||
if (px >= this.bitmap.width ||
|
||||
px < 0 ||
|
||||
py >= this.bitmap.height ||
|
||||
@ -276,10 +266,10 @@ class BBPainter {
|
||||
Painter.editing_area &&
|
||||
typeof Painter.editing_area === 'object' &&
|
||||
(
|
||||
px+0.2 < Painter.editing_area[0] ||
|
||||
py+0.2 < Painter.editing_area[1] ||
|
||||
px+0.2 >= Painter.editing_area[2] ||
|
||||
py+0.2 >= Painter.editing_area[3]
|
||||
px+0.02 < Math.floor(Painter.editing_area[0]) ||
|
||||
py+0.02 < Math.floor(Painter.editing_area[1]) ||
|
||||
px+0.02 >= Painter.editing_area[2] ||
|
||||
py+0.02 >= Painter.editing_area[3]
|
||||
)
|
||||
) {
|
||||
return;
|
||||
@ -388,7 +378,7 @@ class BBPainter {
|
||||
var color = Painter.background_color.get()
|
||||
|
||||
Painter.addBitmap({
|
||||
res: limitNumber(parseInt($('.dialog#add_bitmap input#bitmap_resolution').val()), 1, 2048),
|
||||
res: limitNumber(parseInt($('.dialog#add_bitmap input#bitmap_resolution').val()), 16, 2048),
|
||||
color: color,
|
||||
name: $('.dialog#add_bitmap input#bitmap_name').val(),
|
||||
folder: $('.dialog#add_bitmap input#bitmap_folder').val(),
|
||||
@ -443,9 +433,10 @@ class BBPainter {
|
||||
}
|
||||
generateTemplate(res, background_color, cb) {
|
||||
function cubeTempl(obj) {
|
||||
this.x = obj.size(0, true)
|
||||
this.y = obj.size(1, true)
|
||||
this.z = obj.size(2, true)
|
||||
var min = Blockbench.entity_mode ? 0 : 1
|
||||
this.x = obj.size(0, true) || min
|
||||
this.y = obj.size(1, true) || min
|
||||
this.z = obj.size(2, true) || min
|
||||
this.obj = obj
|
||||
|
||||
this.height = this.z + this.y
|
||||
@ -453,7 +444,7 @@ class BBPainter {
|
||||
return this;
|
||||
}
|
||||
|
||||
var res_multiple = (res ? res : 16) / 16
|
||||
var res_multiple = res / 16
|
||||
var bone_temps = []
|
||||
var max_x_pos = 0
|
||||
var line_y_pos = 0;
|
||||
@ -636,6 +627,35 @@ class BBPainter {
|
||||
var Painter = new BBPainter()
|
||||
|
||||
BARS.defineActions(function() {
|
||||
|
||||
new Tool({
|
||||
id: 'brush_tool',
|
||||
icon: 'fa-paint-brush',
|
||||
category: 'tools',
|
||||
toolbar: 'brush',
|
||||
selectFace: true,
|
||||
transformerMode: 'hidden',
|
||||
paintTool: true,
|
||||
allowWireframe: false,
|
||||
keybind: new Keybind({key: 66}),
|
||||
onCanvasClick: function(data) {
|
||||
Painter.startBrushCanvas(data, data.event)
|
||||
},
|
||||
onSelect: function() {
|
||||
BarItems.slider_brush_size.update()
|
||||
BarItems.slider_brush_softness.update()
|
||||
BarItems.slider_brush_opacity.update()
|
||||
$('.UVEditor').find('#uv_size').hide()
|
||||
},
|
||||
onUnselect: function() {
|
||||
$('.UVEditor').find('#uv_size').show()
|
||||
}
|
||||
})
|
||||
//Noise ? grain
|
||||
//Color Picker colorize
|
||||
//Eraser fa-eraser
|
||||
//Fill format_color_fill
|
||||
|
||||
new BarSelect({
|
||||
id: 'vertex_snap_mode',
|
||||
options: {
|
||||
|
615
js/preview.js
615
js/preview.js
@ -1,7 +1,7 @@
|
||||
var scene, main_preview, previews,
|
||||
Sun, lights,
|
||||
emptyMaterials, transparentMaterial, northMarkMaterial,
|
||||
outlines, setupGrid, wireframeMaterial,
|
||||
emptyMaterials, northMarkMaterial,
|
||||
outlines, wireframeMaterial,
|
||||
Transformer,
|
||||
canvas_scenes,
|
||||
display_scene, display_area, display_base;
|
||||
@ -452,10 +452,6 @@ class Preview {
|
||||
from[uv_axes.v],
|
||||
to[uv_axes.u],
|
||||
to[uv_axes.v]
|
||||
//cube.from[getAxisNumber(uv_axes.u)],
|
||||
//cube.from[getAxisNumber(uv_axes.v)],
|
||||
//cube.to[getAxisNumber(uv_axes.u)],
|
||||
//cube.to[getAxisNumber(uv_axes.v)]
|
||||
)
|
||||
var isSelected = doRectanglesOverlap(plane_rect, cube_rect)
|
||||
}
|
||||
@ -555,18 +551,48 @@ class Preview {
|
||||
this.controls.enabled = this.controls.enabled_before
|
||||
delete this.controls.enabled_before
|
||||
}
|
||||
backgroundPositionDialog() {
|
||||
var scope = this;
|
||||
var dialog = new Dialog({
|
||||
id: 'background_position',
|
||||
title: 'message.set_background_position.title',
|
||||
lines: [
|
||||
`<div class="dialog_bar">
|
||||
<input type="number" class="dark_bordered" value="${scope.background.x}" id="background_pos_x">
|
||||
<input type="number" class="dark_bordered" value="${scope.background.y}" id="background_pos_y">
|
||||
<input type="number" class="dark_bordered" value="${scope.background.size}" id="background_size">
|
||||
</div>`
|
||||
],
|
||||
onConfirm: function() {
|
||||
var coords = [
|
||||
parseFloat( $(dialog.object).find('#background_pos_x').val() ),
|
||||
parseFloat( $(dialog.object).find('#background_pos_y').val() ),
|
||||
parseFloat( $(dialog.object).find('#background_size').val() )
|
||||
]
|
||||
dialog.hide()
|
||||
if (!scope.background) return;
|
||||
|
||||
if (!isNaN(coords[0])) { scope.background.x = coords[0] }
|
||||
if (!isNaN(coords[1])) { scope.background.y = coords[1] }
|
||||
if (!isNaN(coords[2])) { scope.background.size = coords[2] }
|
||||
|
||||
scope.updateBackground()
|
||||
}
|
||||
})
|
||||
dialog.show()
|
||||
}
|
||||
//Misc
|
||||
screenshot(options, cb) {
|
||||
var scope = this;
|
||||
function editVis(cb) {
|
||||
cb(three_grid)
|
||||
cb(Transformer)
|
||||
cb(outlines)
|
||||
cb(rot_origin)
|
||||
function editVis(edit) {
|
||||
edit(three_grid)
|
||||
edit(Transformer)
|
||||
edit(outlines)
|
||||
edit(rot_origin)
|
||||
selected.forEach(function(obj) {
|
||||
var m = obj.getMesh()
|
||||
if (m && m.outline) {
|
||||
cb(m.outline)
|
||||
edit(m.outline)
|
||||
}
|
||||
})
|
||||
}
|
||||
@ -645,6 +671,9 @@ class Preview {
|
||||
{icon: 'photo_size_select_large', name: 'menu.preview.background.position', condition: has_background, click: function(preview) {
|
||||
preview.startMovingBackground()
|
||||
}},
|
||||
{icon: 'photo_size_select_large', name: 'menu.preview.background.set_position', condition: has_background, click: function(preview) {
|
||||
preview.backgroundPositionDialog()
|
||||
}},
|
||||
{
|
||||
name: 'menu.preview.background.lock',
|
||||
condition: has_background && preview.background.lock !== null,
|
||||
@ -851,9 +880,6 @@ function initCanvas() {
|
||||
thismaterial.color.set(s.hex)
|
||||
emptyMaterials.push(thismaterial)
|
||||
})
|
||||
|
||||
//transparentMaterial
|
||||
transparentMaterial = new THREE.MeshBasicMaterial({visible:false});
|
||||
|
||||
var img = new Image();
|
||||
img.src = 'assets/north.png';
|
||||
@ -864,8 +890,23 @@ function initCanvas() {
|
||||
img.onload = function() {
|
||||
this.tex.needsUpdate = true;
|
||||
}
|
||||
//northMarkMaterial = new THREE.MeshBasicMaterial({color: new THREE.Color(parseInt(grid_color, 16)), map: tex, transparent: true})
|
||||
northMarkMaterial = new THREE.MeshBasicMaterial({map: tex, transparent: true, side: THREE.DoubleSide})
|
||||
|
||||
//Rotation Pivot
|
||||
var helper1 = new THREE.AxesHelper(2)
|
||||
var helper2 = new THREE.AxesHelper(2)
|
||||
helper1.rotation.x = Math.PI / 1
|
||||
|
||||
helper2.rotation.x = Math.PI / -1
|
||||
helper2.rotation.y = Math.PI / 1
|
||||
helper2.scale.y = -1
|
||||
|
||||
rot_origin.add(helper1)
|
||||
rot_origin.add(helper2)
|
||||
|
||||
rot_origin.rotation.reorder('ZYX')
|
||||
|
||||
setupGrid = true;
|
||||
|
||||
resizeWindow()
|
||||
}
|
||||
@ -876,7 +917,7 @@ function animate() {
|
||||
})
|
||||
framespersecond++;
|
||||
if (display_mode === true && ground_animation === true) {
|
||||
groundAnimation()
|
||||
DisplayMode.groundAnimation()
|
||||
}
|
||||
}
|
||||
function resizeWindow(event) {
|
||||
@ -1077,25 +1118,6 @@ function buildGrid() {
|
||||
three_grid.add(large_box)
|
||||
}
|
||||
scene.add(three_grid)
|
||||
|
||||
//Origin
|
||||
|
||||
if (setupGrid !== true) {
|
||||
var helper1 = new THREE.AxesHelper(2)
|
||||
var helper2 = new THREE.AxesHelper(2)
|
||||
helper1.rotation.x = Math.PI / 1
|
||||
|
||||
helper2.rotation.x = Math.PI / -1
|
||||
helper2.rotation.y = Math.PI / 1
|
||||
helper2.scale.y = -1
|
||||
|
||||
rot_origin.add(helper1)
|
||||
rot_origin.add(helper2)
|
||||
|
||||
rot_origin.rotation.reorder('ZYX')
|
||||
|
||||
setupGrid = true;
|
||||
}
|
||||
}
|
||||
function centerTransformer(offset) {
|
||||
if (selected.length === 0) return;
|
||||
@ -1275,8 +1297,10 @@ class CanvasController {
|
||||
color: 0x00FF00,
|
||||
wireframe: true
|
||||
});
|
||||
this.transparentMaterial = new THREE.MeshBasicMaterial({visible:false});
|
||||
this.face_order = ['east', 'west', 'up', 'down', 'south', 'north']
|
||||
}
|
||||
//Misc
|
||||
raycast(event) {
|
||||
var preview = Canvas.getCurrentPreview()
|
||||
if (preview) {
|
||||
@ -1289,6 +1313,7 @@ class CanvasController {
|
||||
var canvas = $('canvas.preview:hover').get(0)
|
||||
if (canvas) return canvas.preview
|
||||
}
|
||||
//Main updaters
|
||||
clear() {
|
||||
var objects = []
|
||||
scene.traverse(function(s) {
|
||||
@ -1315,144 +1340,6 @@ class CanvasController {
|
||||
})
|
||||
updateSelection()
|
||||
}
|
||||
updateSelected(arr) {
|
||||
if (!arr) {
|
||||
arr = selected
|
||||
}
|
||||
arr.forEach(function(obj) {
|
||||
var mesh = obj.getMesh()
|
||||
if (mesh !== undefined) {
|
||||
mesh.parent.remove(mesh)
|
||||
}
|
||||
if (obj.visibility == true) {
|
||||
Canvas.addCube(obj)
|
||||
}
|
||||
})
|
||||
updateSelection()
|
||||
}
|
||||
addCube(s) {
|
||||
//This does NOT remove old cubes
|
||||
|
||||
var mesh = new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1))
|
||||
Canvas.adaptObjectFaces(s, mesh)
|
||||
|
||||
Canvas.adaptObjectPosition(s, mesh)
|
||||
mesh.name = s.uuid;
|
||||
mesh.type = 'cube';
|
||||
mesh.isElement = true;
|
||||
//scene.add(mesh)
|
||||
Canvas.meshes[s.uuid] = mesh
|
||||
if (Prop.wireframe === false) {
|
||||
Canvas.updateUV(s)
|
||||
}
|
||||
Canvas.buildOutline(s)
|
||||
}
|
||||
adaptObjectPosition(obj, mesh, parent) {
|
||||
if (!mesh) mesh = obj.getMesh()
|
||||
|
||||
function setSize(geo) {
|
||||
if (Blockbench.entity_mode && obj.inflate !== undefined) {
|
||||
var inflate = obj.inflate
|
||||
geo.from([ obj.from[0]-inflate, obj.from[1]-inflate, obj.from[2]-inflate ])
|
||||
geo.to( [ obj.to[0] +inflate, obj.to[1] +inflate, obj.to[2] +inflate ])
|
||||
} else {
|
||||
geo.from(obj.from)
|
||||
geo.to(obj.to)
|
||||
}
|
||||
}
|
||||
|
||||
setSize(mesh.geometry)
|
||||
mesh.geometry.computeBoundingSphere()
|
||||
|
||||
mesh.scale.set(1, 1, 1)
|
||||
mesh.rotation.set(0, 0, 0)
|
||||
|
||||
if (Blockbench.entity_mode) {
|
||||
mesh.position.set(0, 0, 0)
|
||||
mesh.rotation.reorder('YZX')
|
||||
function iterate(itobj) {
|
||||
//Iterate inside (cube) > outside
|
||||
var itmesh = itobj.type === 'cube' ? mesh : itobj.getMesh()
|
||||
if (itobj.type === 'group') {
|
||||
itmesh.rotation.reorder('ZYX')
|
||||
itobj.rotation.forEach(function(n, i) {
|
||||
itmesh.rotation[getAxisLetter(i)] = Math.PI / (180 / n) * (i == 2 ? -1 : 1)
|
||||
})
|
||||
itmesh.updateMatrixWorld()
|
||||
}
|
||||
itmesh.fix_rotation = itmesh.rotation.clone()
|
||||
|
||||
if (itobj.type === 'group') {
|
||||
itmesh.position.fromArray(itobj.origin)
|
||||
itmesh.scale.x = itmesh.scale.y = itmesh.scale.z = 1
|
||||
}
|
||||
|
||||
if (typeof itobj.parent === 'object') {
|
||||
|
||||
itmesh.position.x -= itobj.parent.origin[0]
|
||||
itmesh.position.y -= itobj.parent.origin[1]
|
||||
itmesh.position.z -= itobj.parent.origin[2]
|
||||
}
|
||||
itmesh.fix_position = itmesh.position.clone()
|
||||
|
||||
if (typeof itobj.parent === 'object') {
|
||||
var parent_mesh = iterate(itobj.parent)
|
||||
parent_mesh.add(itmesh)
|
||||
} else {
|
||||
scene.add(itmesh)
|
||||
}
|
||||
return itmesh
|
||||
}
|
||||
iterate(obj)
|
||||
|
||||
} else {
|
||||
if (obj.rotation !== undefined) {
|
||||
|
||||
mesh.rotation.reorder('ZYX')
|
||||
mesh.position.set(obj.origin[0], obj.origin[1], obj.origin[2])
|
||||
mesh.geometry.translate(-obj.origin[0], -obj.origin[1], -obj.origin[2])
|
||||
|
||||
mesh.rotation.x = Math.PI / (180 /obj.rotation[0])
|
||||
mesh.rotation.y = Math.PI / (180 /obj.rotation[1])
|
||||
mesh.rotation.z = Math.PI / (180 /obj.rotation[2])
|
||||
|
||||
if (obj.rescale === true) {
|
||||
var axis = obj.rotationAxis()||'y'
|
||||
|
||||
var rescale = getRescalingFactor(obj.rotation[getAxisNumber(axis)]);
|
||||
mesh.scale.set(rescale, rescale, rescale)
|
||||
mesh.scale[axis] = 1
|
||||
}
|
||||
} else {
|
||||
mesh.position.set(0, 0, 0)
|
||||
}
|
||||
scene.add(mesh)
|
||||
}
|
||||
Canvas.buildOutline(obj)
|
||||
mesh.updateMatrixWorld()
|
||||
}
|
||||
updatePositions(leave_selection) {
|
||||
updateNslideValues()
|
||||
var arr = selected.slice()
|
||||
if (Blockbench.entity_mode && selected_group) {
|
||||
selected_group.children.forEach(function(s) {
|
||||
if (s.type === 'cube') {
|
||||
if (!arr.includes(s)) {
|
||||
arr.push(s)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
arr.forEach(function(obj) {
|
||||
if (obj.visibility == true) {
|
||||
Canvas.adaptObjectPosition(obj)
|
||||
}
|
||||
})
|
||||
if (leave_selection !== true) {
|
||||
updateSelection()
|
||||
updateSelection()
|
||||
}
|
||||
}
|
||||
updateAllPositions(leave_selection) {
|
||||
updateNslideValues()
|
||||
elements.forEach(function(obj) {
|
||||
@ -1484,58 +1371,6 @@ class CanvasController {
|
||||
})
|
||||
updateSelection()
|
||||
}
|
||||
updateRenderSides() {
|
||||
textures.forEach(function(t) {
|
||||
var mat = Canvas.materials[t.uuid]
|
||||
if (mat) {
|
||||
mat.side = display_mode || Blockbench.entity_mode ? 2 : 0
|
||||
}
|
||||
})
|
||||
emptyMaterials.forEach(function(mat) {
|
||||
mat.side = display_mode || Blockbench.entity_mode ? 2 : 0
|
||||
})
|
||||
}
|
||||
adaptObjectFaces(obj, mesh) {
|
||||
if (!mesh) mesh = obj.getMesh()
|
||||
if (!Prop.wireframe) {
|
||||
var materials = []
|
||||
this.face_order.forEach(function(face) {
|
||||
|
||||
if (obj.faces.hasOwnProperty(face)) {
|
||||
|
||||
var tex = getTextureById(obj.faces[face].texture)
|
||||
if (typeof tex !== 'object') {
|
||||
materials.push(emptyMaterials[obj.color])
|
||||
} else {
|
||||
materials.push(Canvas.materials[tex.uuid])
|
||||
}
|
||||
}
|
||||
})
|
||||
mesh.material = materials
|
||||
} else {
|
||||
mesh.material = Canvas.wireframeMaterial
|
||||
}
|
||||
/*
|
||||
if (!mesh.wireframe == Prop.wireframe) {
|
||||
if (Prop.wireframe) {
|
||||
mesh.wireframe = Canvas.getOutlineMesh(mesh);
|
||||
mesh.add(mesh.wireframe);
|
||||
} else {
|
||||
mesh.remove(mesh.wireframe);
|
||||
delete mesh.wireframe;
|
||||
}
|
||||
}*/
|
||||
}
|
||||
updateSelectedFaces() {
|
||||
selected.forEach(function(obj) {
|
||||
if (obj.visibility == true) {
|
||||
Canvas.adaptObjectFaces(obj)
|
||||
if (!Prop.wireframe) {
|
||||
Canvas.updateUV(obj)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
updateAllFaces(texture) {
|
||||
elements.forEach(function(obj) {
|
||||
if (obj.visibility == true) {
|
||||
@ -1557,6 +1392,75 @@ class CanvasController {
|
||||
}
|
||||
})
|
||||
}
|
||||
updateAllUVs() {
|
||||
if (Prop.wireframe === true) return;
|
||||
elements.forEach(function(obj) {
|
||||
if (obj.visibility == true) {
|
||||
Canvas.updateUV(obj)
|
||||
}
|
||||
})
|
||||
}
|
||||
updateRenderSides() {
|
||||
textures.forEach(function(t) {
|
||||
var mat = Canvas.materials[t.uuid]
|
||||
if (mat) {
|
||||
mat.side = (display_mode || Blockbench.entity_mode) ? 2 : 0
|
||||
}
|
||||
})
|
||||
emptyMaterials.forEach(function(mat) {
|
||||
mat.side = (display_mode || Blockbench.entity_mode) ? 2 : 0
|
||||
})
|
||||
}
|
||||
//Selection updaters
|
||||
updateSelected(arr) {
|
||||
if (!arr) {
|
||||
arr = selected
|
||||
}
|
||||
arr.forEach(function(obj) {
|
||||
var mesh = obj.getMesh()
|
||||
if (mesh !== undefined) {
|
||||
mesh.parent.remove(mesh)
|
||||
}
|
||||
if (obj.visibility == true) {
|
||||
Canvas.addCube(obj)
|
||||
}
|
||||
})
|
||||
updateSelection()
|
||||
}
|
||||
updatePositions(leave_selection) {
|
||||
updateNslideValues()
|
||||
var arr = selected.slice()
|
||||
if (Blockbench.entity_mode && selected_group) {
|
||||
selected_group.children.forEach(function(s) {
|
||||
if (s.type === 'cube') {
|
||||
if (!arr.includes(s)) {
|
||||
arr.push(s)
|
||||
}
|
||||
}
|
||||
})
|
||||
if (arr.length === selected.length) {
|
||||
Canvas.ascendElementPosition(selected_group)
|
||||
}
|
||||
}
|
||||
arr.forEach(function(obj) {
|
||||
if (obj.visibility == true) {
|
||||
Canvas.adaptObjectPosition(obj)
|
||||
}
|
||||
})
|
||||
if (leave_selection !== true) {
|
||||
updateSelection()
|
||||
}
|
||||
}
|
||||
updateSelectedFaces() {
|
||||
selected.forEach(function(obj) {
|
||||
if (obj.visibility == true) {
|
||||
Canvas.adaptObjectFaces(obj)
|
||||
if (!Prop.wireframe) {
|
||||
Canvas.updateUV(obj)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
updateUVs() {
|
||||
if (Prop.wireframe === true) return;
|
||||
selected.forEach(function(obj) {
|
||||
@ -1565,14 +1469,169 @@ class CanvasController {
|
||||
}
|
||||
})
|
||||
}
|
||||
updateAllUVs() {
|
||||
if (Prop.wireframe === true) return;
|
||||
elements.forEach(function(obj) {
|
||||
if (obj.visibility == true) {
|
||||
Canvas.updateUV(obj)
|
||||
}
|
||||
outlineObjects(arr) {
|
||||
arr.forEach(function(obj) {
|
||||
if (!obj.visibility) return;
|
||||
var mesh = obj.getMesh()
|
||||
if (mesh === undefined) return;
|
||||
|
||||
var line = Canvas.getOutlineMesh(mesh)
|
||||
|
||||
mesh.getWorldPosition(line.position)
|
||||
line.position.sub(scene.position)
|
||||
line.rotation.setFromQuaternion(mesh.getWorldQuaternion(new THREE.Quaternion()))
|
||||
line.scale.copy(mesh.scale)
|
||||
|
||||
line.name = obj.uuid+'_ghost_outline'
|
||||
outlines.add(line)
|
||||
})
|
||||
}
|
||||
//Object handlers
|
||||
addCube(obj) {
|
||||
//This does NOT remove old cubes
|
||||
var mesh = new THREE.Mesh(new THREE.BoxGeometry(1, 1, 1))
|
||||
Canvas.adaptObjectFaces(obj, mesh)
|
||||
|
||||
Canvas.adaptObjectPosition(obj, mesh)
|
||||
mesh.name = obj.uuid;
|
||||
mesh.type = 'cube';
|
||||
mesh.isElement = true;
|
||||
//scene.add(mesh)
|
||||
Canvas.meshes[obj.uuid] = mesh
|
||||
if (Prop.wireframe === false) {
|
||||
Canvas.updateUV(obj)
|
||||
}
|
||||
Canvas.buildOutline(obj)
|
||||
}
|
||||
adaptObjectPosition(obj, mesh, parent) {
|
||||
if (!mesh) mesh = obj.getMesh()
|
||||
|
||||
function setSize(geo) {
|
||||
if (Blockbench.entity_mode && obj.inflate !== undefined) {
|
||||
var inflate = obj.inflate
|
||||
geo.from([ obj.from[0]-inflate, obj.from[1]-inflate, obj.from[2]-inflate ])
|
||||
geo.to( [ obj.to[0] +inflate, obj.to[1] +inflate, obj.to[2] +inflate ])
|
||||
} else {
|
||||
geo.from(obj.from)
|
||||
geo.to(obj.to)
|
||||
}
|
||||
}
|
||||
|
||||
setSize(mesh.geometry)
|
||||
mesh.geometry.computeBoundingSphere()
|
||||
|
||||
mesh.scale.set(1, 1, 1)
|
||||
mesh.rotation.set(0, 0, 0)
|
||||
|
||||
if (Blockbench.entity_mode) {
|
||||
mesh.position.set(0, 0, 0)
|
||||
mesh.rotation.reorder('YZX')
|
||||
Canvas.ascendElementPosition(obj, mesh)
|
||||
|
||||
} else {
|
||||
if (obj.rotation !== undefined) {
|
||||
|
||||
mesh.rotation.reorder('ZYX')
|
||||
mesh.position.set(obj.origin[0], obj.origin[1], obj.origin[2])
|
||||
mesh.geometry.translate(-obj.origin[0], -obj.origin[1], -obj.origin[2])
|
||||
|
||||
mesh.rotation.x = Math.PI / (180 /obj.rotation[0])
|
||||
mesh.rotation.y = Math.PI / (180 /obj.rotation[1])
|
||||
mesh.rotation.z = Math.PI / (180 /obj.rotation[2])
|
||||
|
||||
if (obj.rescale === true) {
|
||||
var axis = obj.rotationAxis()||'y'
|
||||
|
||||
var rescale = getRescalingFactor(obj.rotation[getAxisNumber(axis)]);
|
||||
mesh.scale.set(rescale, rescale, rescale)
|
||||
mesh.scale[axis] = 1
|
||||
}
|
||||
} else {
|
||||
mesh.position.set(0, 0, 0)
|
||||
}
|
||||
scene.add(mesh)
|
||||
}
|
||||
Canvas.buildOutline(obj)
|
||||
mesh.updateMatrixWorld()
|
||||
}
|
||||
ascendElementPosition(el, elmesh) {
|
||||
function iterate(obj, mesh) {
|
||||
//Iterate inside (cube) > outside
|
||||
if (!mesh) {
|
||||
mesh = obj.getMesh()
|
||||
}
|
||||
if (!mesh) {
|
||||
}
|
||||
if (obj.type === 'group') {
|
||||
mesh.rotation.reorder('ZYX')
|
||||
obj.rotation.forEach(function(n, i) {
|
||||
mesh.rotation[getAxisLetter(i)] = Math.PI / (180 / n) * (i == 2 ? -1 : 1)
|
||||
})
|
||||
mesh.updateMatrixWorld()
|
||||
}
|
||||
mesh.fix_rotation = mesh.rotation.clone()
|
||||
|
||||
if (obj.type === 'group') {
|
||||
mesh.position.fromArray(obj.origin)
|
||||
mesh.scale.x = mesh.scale.y = mesh.scale.z = 1
|
||||
}
|
||||
|
||||
if (typeof obj.parent === 'object') {
|
||||
|
||||
mesh.position.x -= obj.parent.origin[0]
|
||||
mesh.position.y -= obj.parent.origin[1]
|
||||
mesh.position.z -= obj.parent.origin[2]
|
||||
}
|
||||
mesh.fix_position = mesh.position.clone()
|
||||
|
||||
if (typeof obj.parent === 'object') {
|
||||
var parent_mesh = iterate(obj.parent)
|
||||
parent_mesh.add(mesh)
|
||||
} else {
|
||||
scene.add(mesh)
|
||||
}
|
||||
return mesh
|
||||
}
|
||||
iterate(el, elmesh)
|
||||
}
|
||||
getOutlineMesh(mesh) {
|
||||
var vs = mesh.geometry.vertices
|
||||
var geometry = new THREE.Geometry()
|
||||
geometry.vertices = [
|
||||
vs[2], vs[3],
|
||||
vs[6], vs[7],
|
||||
vs[2], vs[0],
|
||||
vs[1], vs[4],
|
||||
vs[5], vs[0],
|
||||
vs[5], vs[7],
|
||||
vs[6], vs[4],
|
||||
vs[1], vs[3]
|
||||
]
|
||||
return new THREE.Line(geometry, Canvas.outlineMaterial)
|
||||
}
|
||||
adaptObjectFaces(obj, mesh) {
|
||||
if (!mesh) mesh = obj.getMesh()
|
||||
if (!Prop.wireframe) {
|
||||
var materials = []
|
||||
this.face_order.forEach(function(face) {
|
||||
|
||||
if (obj.faces[face].texture === null) {
|
||||
materials.push(Canvas.transparentMaterial)
|
||||
|
||||
} else {
|
||||
var tex = getTextureById(obj.faces[face].texture)
|
||||
if (typeof tex === 'object') {
|
||||
materials.push(Canvas.materials[tex.uuid])
|
||||
} else {
|
||||
materials.push(emptyMaterials[obj.color])
|
||||
}
|
||||
}
|
||||
})
|
||||
mesh.material = materials
|
||||
} else {
|
||||
mesh.material = Canvas.wireframeMaterial
|
||||
}
|
||||
}
|
||||
updateUV(obj, animation, force_entity_mode) {
|
||||
if (Prop.wireframe === true) return;
|
||||
var mesh = obj.getMesh()
|
||||
@ -1666,7 +1725,7 @@ class CanvasController {
|
||||
}
|
||||
stretch = 1
|
||||
frame = 0
|
||||
if (obj[face].texture && obj[face].texture !== '$transparent') {
|
||||
if (obj[face].texture && obj[face].texture !== null) {
|
||||
var tex = getTextureById(obj[face].texture)
|
||||
if (typeof tex === 'object' && tex.constructor.name === 'Texture' && tex.frameCount) {
|
||||
stretch = tex.frameCount
|
||||
@ -1693,29 +1752,6 @@ class CanvasController {
|
||||
mesh.geometry.elementsNeedUpdate = true;
|
||||
return mesh.geometry
|
||||
}
|
||||
getOutlineMesh(mesh) {
|
||||
var vs = mesh.geometry.vertices
|
||||
var geometry = new THREE.Geometry()
|
||||
geometry.vertices = [
|
||||
vs[2],
|
||||
vs[3],
|
||||
vs[6],
|
||||
vs[7],
|
||||
vs[2],
|
||||
vs[0],
|
||||
vs[1],
|
||||
vs[4],
|
||||
vs[5],
|
||||
vs[0],//1
|
||||
vs[5],
|
||||
vs[7],//2
|
||||
vs[6],
|
||||
vs[4],//3
|
||||
vs[1],
|
||||
vs[3]
|
||||
]
|
||||
return new THREE.Line(geometry, Canvas.outlineMaterial)
|
||||
}
|
||||
buildOutline(obj) {
|
||||
if (obj.visibility == false) return;
|
||||
var mesh = obj.getMesh()
|
||||
@ -1733,35 +1769,6 @@ class CanvasController {
|
||||
mesh.outline = line
|
||||
mesh.add(line)
|
||||
}
|
||||
outlineObjects(arr) {
|
||||
arr.forEach(function(obj) {
|
||||
if (!obj.visibility) return;
|
||||
var mesh = obj.getMesh()
|
||||
if (mesh === undefined) return;
|
||||
|
||||
var line = Canvas.getOutlineMesh(mesh)
|
||||
|
||||
mesh.getWorldPosition(line.position)
|
||||
line.position.sub(scene.position)
|
||||
line.rotation.setFromQuaternion(mesh.getWorldQuaternion(new THREE.Quaternion()))
|
||||
line.scale.copy(mesh.scale)
|
||||
|
||||
line.name = obj.uuid+'_ghost_outline'
|
||||
outlines.add(line)
|
||||
/*
|
||||
var geo = new THREE.EdgesGeometry(mesh.geometry);
|
||||
var wireframe = new THREE.LineSegments(geo, Canvas.outlineMaterial)
|
||||
|
||||
mesh.getWorldPosition(wireframe.position)
|
||||
wireframe.position.sub(scene.position)
|
||||
wireframe.rotation.setFromQuaternion(mesh.getWorldQuaternion(new THREE.Quaternion()))
|
||||
wireframe.scale.copy(mesh.scale)
|
||||
|
||||
wireframe.name = obj.uuid+'_ghost_outline'
|
||||
outlines.add(wireframe)
|
||||
*/
|
||||
})
|
||||
}
|
||||
}
|
||||
var Canvas = new CanvasController()
|
||||
|
||||
@ -1785,6 +1792,43 @@ BARS.defineActions(function() {
|
||||
keybind: new Keybind({key: 80, ctrl: true}),
|
||||
click: function () {quad_previews.current.screenshot()}
|
||||
})
|
||||
new Action({
|
||||
id: 'record_model_gif',
|
||||
icon: 'local_movies',
|
||||
category: 'view',
|
||||
click: function () {
|
||||
var lines = [
|
||||
{label: 'dialog.create_gif.length', node: '<input class="dark_bordered half" type="number" value="10" id="gif_length">'},
|
||||
{label: 'dialog.create_gif.fps', node: '<input class="dark_bordered half" type="number" value="10" id="gif_fps">'},
|
||||
{label: 'dialog.create_gif.compression', node: '<input class="dark_bordered half" type="number" value="4" id="gif_quality">'},
|
||||
]
|
||||
if (Animator.open) {
|
||||
lines.push({label: 'dialog.create_gif.play', node: '<input type="checkbox" id="gif_play_animation">'})
|
||||
}
|
||||
var dialog = new Dialog({
|
||||
id: 'create_gif',
|
||||
title: tl('dialog.create_gif.title'),
|
||||
draggable: true,
|
||||
lines: lines,
|
||||
onConfirm: function() {
|
||||
var jq = $(dialog.object)
|
||||
var length = parseInt( jq.find('#gif_length').val() )
|
||||
var fps = parseInt( jq.find('#gif_fps').val() )
|
||||
var quality = parseInt( jq.find('#gif_quality').val() )
|
||||
if (jq.find('#gif_play_animation').is(':checked')) {
|
||||
Timeline.start()
|
||||
}
|
||||
Screencam.createGif({
|
||||
length: limitNumber(length, 0.1, 240)*1000,
|
||||
fps: limitNumber(fps, 0.5, 30),
|
||||
quality: limitNumber(fps, 0, 30),
|
||||
}, Screencam.returnScreenshot)
|
||||
dialog.hide()
|
||||
}
|
||||
})
|
||||
dialog.show()
|
||||
}
|
||||
})
|
||||
new Action({
|
||||
id: 'screenshot_app',
|
||||
icon: 'icon-bb_interface',
|
||||
@ -1842,7 +1886,6 @@ BARS.defineActions(function() {
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
new Action({
|
||||
id: 'camera_top',
|
||||
name: 'direction.top',
|
||||
|
257
js/textures.js
257
js/textures.js
@ -61,6 +61,15 @@ class Texture {
|
||||
}
|
||||
return copy
|
||||
}
|
||||
extend(properties) {
|
||||
for (var key in properties) {
|
||||
if (properties.hasOwnProperty(key)) {
|
||||
this[key] = properties[key]
|
||||
}
|
||||
}
|
||||
return this;
|
||||
}
|
||||
//Loading
|
||||
load(isDefault, reloading, cb) {
|
||||
var scope = this;
|
||||
|
||||
@ -77,7 +86,7 @@ class Texture {
|
||||
}
|
||||
function onerror() {
|
||||
if (isApp &&
|
||||
!isDefault &&
|
||||
!(isDefault || scope.isDefault) &&
|
||||
scope.mode !== 'bitmap' &&
|
||||
scope.fromDefaultPack()
|
||||
) {
|
||||
@ -177,7 +186,7 @@ class Texture {
|
||||
return this;
|
||||
}
|
||||
fromJavaLink(link, path_array) {
|
||||
if (typeof link !== 'string' || link.substr(0, 1) === '#') {
|
||||
if (typeof link !== 'string' || (link.substr(0, 1) === '#' && !link.includes('/'))) {
|
||||
this.load()
|
||||
return this;
|
||||
}
|
||||
@ -198,6 +207,25 @@ class Texture {
|
||||
}
|
||||
return this;
|
||||
}
|
||||
fromFile(file) {
|
||||
if (!file) return this;
|
||||
if (file.name) this.name = file.name
|
||||
if (typeof file.content === 'string' && file.content.substr(0, 4) === 'data') {
|
||||
this.fromDataURL(file.content)
|
||||
|
||||
if (!file.path) {
|
||||
} else if (pathToExtension(file.path) === 'png') {
|
||||
this.path = file.path
|
||||
} else if (pathToExtension(file.path) === 'tga') {
|
||||
this.path = ''
|
||||
}
|
||||
|
||||
} else if (isApp) {
|
||||
this.fromPath(file.path)
|
||||
}
|
||||
this.saved = true
|
||||
return this;
|
||||
}
|
||||
fromPath(path) {
|
||||
var scope = this;
|
||||
if (path && pathToExtension(path) === 'tga') {
|
||||
@ -221,6 +249,7 @@ class Texture {
|
||||
this.source = path + '?' + tex_version
|
||||
}
|
||||
this.generateFolder(path)
|
||||
this.startWatcher()
|
||||
|
||||
if (!isApp && Project.dataURLTextures) {
|
||||
if (this.img && this.img.src) {
|
||||
@ -240,39 +269,72 @@ class Texture {
|
||||
this.load()
|
||||
return this;
|
||||
}
|
||||
fromFile(file) {
|
||||
if (!file) return this;
|
||||
if (file.name) this.name = file.name
|
||||
if (typeof file.content === 'string' && file.content.substr(0, 4)) {
|
||||
this.fromDataURL(file.content)
|
||||
|
||||
if (!file.path) {
|
||||
} else if (pathToExtension(file.path) === 'png') {
|
||||
this.path = file.path
|
||||
} else if (pathToExtension(file.path) === 'tga') {
|
||||
this.path = ''
|
||||
}
|
||||
|
||||
} else if (isApp) {
|
||||
this.fromPath(file.path)
|
||||
}
|
||||
this.saved = true
|
||||
return this;
|
||||
}
|
||||
fromDefaultPack() {
|
||||
if (isApp && settings.default_path && settings.default_path.value) {
|
||||
var path = settings.default_path.value + osfs + this.folder + osfs + this.name
|
||||
if (fs.existsSync(path)) {
|
||||
this.mode = 'link'
|
||||
this.path = path
|
||||
this.source = this.path + '?' + tex_version
|
||||
this.load(true)
|
||||
return true;
|
||||
if (Blockbench.entity_mode) {
|
||||
var path = findEntityTexture(Project.parent, 'raw')
|
||||
if (path) {
|
||||
this.isDefault = true
|
||||
path = settings.default_path.value + osfs + path
|
||||
|
||||
if (fs.existsSync(path + '.png')) {
|
||||
this.fromPath(path + '.png')
|
||||
delete this.isDefault
|
||||
return true;
|
||||
|
||||
} else if (fs.existsSync(path + '.tga')) {
|
||||
this.fromPath(path + '.tga')
|
||||
delete this.isDefault
|
||||
return true;
|
||||
}
|
||||
delete this.isDefault
|
||||
}
|
||||
} else {
|
||||
var path = settings.default_path.value + osfs + this.folder + osfs + this.name
|
||||
if (fs.existsSync(path)) {
|
||||
this.fromPath(path)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
updateSource(dataUrl) {
|
||||
this.source = dataUrl
|
||||
this.img.src = dataUrl
|
||||
this.updateMaterial()
|
||||
if (main_uv.texture === this) {
|
||||
main_uv.loadData()
|
||||
}
|
||||
if (open_dialog === 'uv_dialog') {
|
||||
for (var editor in uv_dialog.editors) {
|
||||
if (uv_dialog.editors.hasOwnProperty(editor) && uv_dialog.editors[editor].texture === this) {
|
||||
uv_dialog.editors[editor].loadData()
|
||||
}
|
||||
}
|
||||
}
|
||||
return this;
|
||||
}
|
||||
updateMaterial() {
|
||||
var scope = this;
|
||||
var img = new Image()
|
||||
try {
|
||||
img.src = scope.source
|
||||
} catch(err) {
|
||||
}
|
||||
img.onload = function() {
|
||||
Canvas.materials[scope.uuid].map.dispose()
|
||||
var tex = new THREE.Texture(img)
|
||||
img.tex = tex;
|
||||
img.tex.magFilter = THREE.NearestFilter
|
||||
img.tex.minFilter = THREE.NearestFilter
|
||||
this.tex.needsUpdate = true;
|
||||
Canvas.materials[scope.uuid].map = tex
|
||||
}
|
||||
return this;
|
||||
}
|
||||
reopen(force) {
|
||||
var scope = this;
|
||||
this.stopWatcher()
|
||||
|
||||
function _replace() {
|
||||
Blockbench.import({
|
||||
@ -282,6 +344,7 @@ class Texture {
|
||||
startpath: scope.path
|
||||
}, function(files) {
|
||||
scope.fromFile(files[0])
|
||||
|
||||
})
|
||||
Painter.current = {}
|
||||
Blockbench.dispatchEvent( 'change_texture_path', {texture: scope} )
|
||||
@ -320,68 +383,23 @@ class Texture {
|
||||
reloadTexture() {
|
||||
this.refresh(true)
|
||||
}
|
||||
updateMaterial() {
|
||||
startWatcher() {
|
||||
if (this.mode !== 'link' || !isApp || !fs.existsSync(this.path)) {
|
||||
return;
|
||||
}
|
||||
var scope = this;
|
||||
var img = new Image()
|
||||
try {
|
||||
img.src = scope.source
|
||||
} catch(err) {
|
||||
}
|
||||
img.onload = function() {
|
||||
Canvas.materials[scope.uuid].map.dispose()
|
||||
var tex = new THREE.Texture(img)
|
||||
img.tex = tex;
|
||||
img.tex.magFilter = THREE.NearestFilter
|
||||
img.tex.minFilter = THREE.NearestFilter
|
||||
this.tex.needsUpdate = true;
|
||||
Canvas.materials[scope.uuid].map = tex
|
||||
}
|
||||
return this;
|
||||
}
|
||||
enableParticle() {
|
||||
textures.forEach(function(s) {
|
||||
s.particle = false;
|
||||
})
|
||||
if (!Blockbench.entity_mode) {
|
||||
this.particle = true
|
||||
}
|
||||
return this;
|
||||
}
|
||||
fillParticle() {
|
||||
var particle_tex = false
|
||||
textures.forEach(function(t) {
|
||||
if (t.particle) {
|
||||
particle_tex = t
|
||||
|
||||
fs.watchFile(scope.path, {interval: 50}, function(curr, prev) {
|
||||
if (curr.mtime !== prev.mtime) {
|
||||
scope.reloadTexture()
|
||||
}
|
||||
})
|
||||
if (!particle_tex) {
|
||||
this.enableParticle()
|
||||
}
|
||||
return this;
|
||||
}
|
||||
javaTextureLink(backup) {
|
||||
if (backup) {
|
||||
return this.source;
|
||||
stopWatcher() {
|
||||
if (this.mode !== 'link' || !isApp || !fs.existsSync(this.path)) {
|
||||
return;
|
||||
}
|
||||
|
||||
var link = this.name.replace(/\.png$/, '')
|
||||
|
||||
if (this.folder) {
|
||||
link = this.folder + '/' + link
|
||||
}
|
||||
if (this.namespace && this.namespace !== 'minecraft') {
|
||||
link = this.namespace + ':' + link
|
||||
}
|
||||
return link;
|
||||
}
|
||||
select() {
|
||||
textures.forEach(function(s) {
|
||||
s.selected = false;
|
||||
})
|
||||
Prop.active_panel = 'textures'
|
||||
this.selected = true
|
||||
textures.selected = this
|
||||
return this;
|
||||
fs.unwatchFile(this.path)
|
||||
}
|
||||
generateFolder(path) {
|
||||
var scope = this
|
||||
@ -413,6 +431,16 @@ class Texture {
|
||||
}
|
||||
return this;
|
||||
}
|
||||
//Management
|
||||
select() {
|
||||
textures.forEach(function(s) {
|
||||
s.selected = false;
|
||||
})
|
||||
Prop.active_panel = 'textures'
|
||||
this.selected = true
|
||||
textures.selected = this
|
||||
return this;
|
||||
}
|
||||
add(undo) {
|
||||
if (undo !== false) {
|
||||
Undo.initEdit({textures: []})
|
||||
@ -446,11 +474,34 @@ class Texture {
|
||||
}
|
||||
return this;
|
||||
}
|
||||
extend(properties) {
|
||||
for (var key in properties) {
|
||||
if (properties.hasOwnProperty(key)) {
|
||||
this[key] = properties[key]
|
||||
remove() {
|
||||
this.stopWatcher()
|
||||
textures.splice(textures.indexOf(this), 1)
|
||||
Canvas.updateAllFaces()
|
||||
$('#uv_frame').css('background', 'transparent')
|
||||
TextureAnimator.updateButton()
|
||||
hideDialog()
|
||||
BARS.updateConditions()
|
||||
}
|
||||
//Use
|
||||
enableParticle() {
|
||||
textures.forEach(function(s) {
|
||||
s.particle = false;
|
||||
})
|
||||
if (!Blockbench.entity_mode) {
|
||||
this.particle = true
|
||||
}
|
||||
return this;
|
||||
}
|
||||
fillParticle() {
|
||||
var particle_tex = false
|
||||
textures.forEach(function(t) {
|
||||
if (t.particle) {
|
||||
particle_tex = t
|
||||
}
|
||||
})
|
||||
if (!particle_tex) {
|
||||
this.enableParticle()
|
||||
}
|
||||
return this;
|
||||
}
|
||||
@ -473,6 +524,7 @@ class Texture {
|
||||
Undo.finishEdit('applied_texture')
|
||||
return this;
|
||||
}
|
||||
//Interface
|
||||
openFolder() {
|
||||
if (!isApp || !this.path) return;
|
||||
shell.showItemInFolder(this.path)
|
||||
@ -499,14 +551,6 @@ class Texture {
|
||||
}
|
||||
return this;
|
||||
}
|
||||
remove() {
|
||||
textures.splice(textures.indexOf(this), 1)
|
||||
Canvas.updateAllFaces()
|
||||
$('#uv_frame').css('background', 'transparent')
|
||||
TextureAnimator.updateButton()
|
||||
hideDialog()
|
||||
BARS.updateConditions()
|
||||
}
|
||||
showContextMenu(event) {
|
||||
var scope = this;
|
||||
scope.select()
|
||||
@ -541,6 +585,22 @@ class Texture {
|
||||
$('#texture_edit .tool.bitmap_only').show()
|
||||
}
|
||||
}
|
||||
//Export
|
||||
javaTextureLink(backup) {
|
||||
if (backup) {
|
||||
return this.source;
|
||||
}
|
||||
|
||||
var link = this.name.replace(/\.png$/, '')
|
||||
|
||||
if (this.folder) {
|
||||
link = this.folder + '/' + link
|
||||
}
|
||||
if (this.namespace && this.namespace !== 'minecraft') {
|
||||
link = this.namespace + ':' + link
|
||||
}
|
||||
return link;
|
||||
}
|
||||
save(as) {
|
||||
var scope = this;
|
||||
if (scope.saved && !as) {
|
||||
@ -620,7 +680,6 @@ class Texture {
|
||||
}
|
||||
}
|
||||
Texture.prototype.menu = new Menu([
|
||||
|
||||
{
|
||||
icon: 'crop_original',
|
||||
name: 'menu.texture.face',
|
||||
@ -843,7 +902,7 @@ function changeTexturesFolder() {
|
||||
}
|
||||
function getTextureById(id) {
|
||||
if (id === undefined) return;
|
||||
if (id == '$transparent') {
|
||||
if (id == null) {
|
||||
return {material: transparentMaterial};
|
||||
}
|
||||
id = id.replace('#', '');
|
||||
|
@ -460,6 +460,9 @@ BARS.defineActions(function() {
|
||||
obj.mapAutoUV()
|
||||
})
|
||||
Canvas.updatePositions()
|
||||
if (Blockbench.entity_mode) {
|
||||
Canvas.updateUVs()
|
||||
}
|
||||
}
|
||||
new NumSlider({
|
||||
id: 'slider_size_x',
|
||||
@ -750,8 +753,8 @@ BARS.defineActions(function() {
|
||||
icon: 'settings_overscan',
|
||||
category: 'transform',
|
||||
click: function () {
|
||||
$('#model_scale_range').val(1)
|
||||
$('#model_scale_label').val(1)
|
||||
$('#model_scale_range, #model_scale_label').val(1)
|
||||
$('#scaling_clipping_warning').text('')
|
||||
|
||||
Undo.initEdit({cubes: selected})
|
||||
|
||||
|
102
js/undo.js
102
js/undo.js
@ -70,7 +70,6 @@ var Undo = {
|
||||
},
|
||||
save: function(aspects) {
|
||||
var scope = this;
|
||||
var full = aspects.complete
|
||||
this.aspects = aspects
|
||||
|
||||
if (aspects.selection) {
|
||||
@ -83,7 +82,7 @@ var Undo = {
|
||||
}
|
||||
}
|
||||
|
||||
if ( aspects.cubes) {
|
||||
if (aspects.cubes) {
|
||||
this.cubes = {}
|
||||
aspects.cubes.forEach(function(obj) {
|
||||
if (aspects.uv_only) {
|
||||
@ -100,16 +99,16 @@ var Undo = {
|
||||
})
|
||||
}
|
||||
|
||||
if (full || aspects.outliner) {
|
||||
if (aspects.outliner) {
|
||||
this.outliner = compileGroups(true)
|
||||
}
|
||||
|
||||
if (full || aspects.group) {
|
||||
if (aspects.group) {
|
||||
this.group = aspects.group.getChildlessCopy()
|
||||
this.group.uuid = aspects.group.uuid
|
||||
}
|
||||
|
||||
if (full || aspects.textures) {
|
||||
if (aspects.textures) {
|
||||
this.textures = {}
|
||||
aspects.textures.forEach(function(t) {
|
||||
var tex = t.getUndoCopy(aspects.bitmap)
|
||||
@ -121,12 +120,25 @@ var Undo = {
|
||||
this.settings = aspects.settings
|
||||
}
|
||||
|
||||
if (full || aspects.resolution) {
|
||||
if (aspects.resolution) {
|
||||
this.resolution = {
|
||||
width: Project.texture_width,
|
||||
height: Project.texture_height
|
||||
}
|
||||
}
|
||||
|
||||
if (aspects.animation) {
|
||||
this.animation = aspects.animation ? aspects.animation.undoCopy() : null;
|
||||
}
|
||||
if (aspects.keyframes && Animator.selected && Animator.selected.getBoneAnimator()) {
|
||||
this.keyframes = {
|
||||
animation: Animator.selected.uuid,
|
||||
bone: Animator.selected.getBoneAnimator().uuid
|
||||
}
|
||||
aspects.keyframes.forEach(kf => {
|
||||
scope.keyframes[kf.uuid] = kf.undoCopy()
|
||||
})
|
||||
}
|
||||
},
|
||||
loadSave: function(save, reference) {
|
||||
if (save.cubes) {
|
||||
@ -230,6 +242,84 @@ var Undo = {
|
||||
Project.texture_width = save.resolution.width
|
||||
Project.texture_height = save.resolution.height
|
||||
}
|
||||
|
||||
if (save.animation) {
|
||||
|
||||
var animation = Animator.animations.findInArray('uuid', save.animation)
|
||||
if (!animation) {
|
||||
//new
|
||||
animation = new Animation()
|
||||
}
|
||||
//populate
|
||||
Animation.extend(save.animation)
|
||||
|
||||
} else if (reference.animation) {
|
||||
//remove
|
||||
var animation = Animator.animations.findInArray('uuid', reference.animation.uuid)
|
||||
if (animation.remove) {
|
||||
animation.remove()
|
||||
}
|
||||
}
|
||||
|
||||
if (save.keyframes && Animator.selected) {
|
||||
var animation = false;
|
||||
if (Animator.selected.uuid !== save.keyframes.animation) {
|
||||
animation = Animator.animations.findInArray('uuid', save.keyframes.animation)
|
||||
} else {
|
||||
animation = Animator.selected
|
||||
}
|
||||
|
||||
if (animation.select && animation !== Animator.selected) {
|
||||
animation.select()
|
||||
}
|
||||
var bone = false;
|
||||
if (Animator.selected.uuid !== save.keyframes.animation) {
|
||||
animation = Animator.animations.findInArray('uuid', save.keyframes.animation)
|
||||
} else {
|
||||
animation = Animator.selected
|
||||
}
|
||||
|
||||
if (animation.select && animation !== Animator.selected) {
|
||||
animation.select()
|
||||
}
|
||||
|
||||
|
||||
function getKeyframe(uuid) {
|
||||
var i = 0;
|
||||
while (i < Timeline.keyframes.length) {
|
||||
if (Timeline.keyframes[i].uuid === uuid) {
|
||||
return Timeline.keyframes[i];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
var added = 0;
|
||||
for (var uuid in save.keyframes) {
|
||||
if (uuid.length === 36 && save.keyframes.hasOwnProperty(uuid)) {
|
||||
var data = save.keyframes[uuid]
|
||||
var kf = getKeyframe(uuid)
|
||||
if (kf) {
|
||||
kf.extend(data)
|
||||
} else {
|
||||
kf = new Keyframe(data)
|
||||
Timeline.keyframes.push(kf)
|
||||
added++;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (var uuid in reference.keyframes) {
|
||||
if (uuid.length === 36 && reference.keyframes.hasOwnProperty(uuid) && !save.keyframes.hasOwnProperty(uuid)) {
|
||||
var kf = getKeyframe(uuid)
|
||||
if (kf) {
|
||||
kf.remove()
|
||||
}
|
||||
}
|
||||
}
|
||||
if (added) {
|
||||
Vue.nextTick(Timeline.update)
|
||||
}
|
||||
updateKeyframeSelection()
|
||||
}
|
||||
updateSelection()
|
||||
}
|
||||
}
|
19
js/util.js
19
js/util.js
@ -70,7 +70,7 @@ function guid() {
|
||||
s4() + '-' + s4() + s4() + s4();
|
||||
}
|
||||
Math.radToDeg = function(rad) {
|
||||
return rad * (180*Math.PI)
|
||||
return rad / Math.PI * 180
|
||||
}
|
||||
Math.degToRad = function(deg) {
|
||||
return Math.PI / (180 /deg)
|
||||
@ -107,7 +107,7 @@ function getAxisNumber(letter) {
|
||||
}
|
||||
function limitNumber(number, min, max) {
|
||||
if (number > max) number = max;
|
||||
if (number < min) number = min;
|
||||
if (number < min || isNaN(number)) number = min;
|
||||
return number;
|
||||
}
|
||||
function getRectangle(a, b, c, d) {
|
||||
@ -152,6 +152,11 @@ function doRectanglesOverlap(rect1, rect2) {
|
||||
}
|
||||
|
||||
//Array
|
||||
Array.prototype.safePush = function(item) {
|
||||
if (!this.includes(item)) {
|
||||
this.push(item)
|
||||
}
|
||||
}
|
||||
Array.prototype.equals = function (array) {
|
||||
if (!array)
|
||||
return false;
|
||||
@ -199,6 +204,16 @@ Array.prototype.positiveItems = function() {
|
||||
}
|
||||
return x;
|
||||
}
|
||||
Array.prototype.allEqual = function(s) {
|
||||
var i = 0;
|
||||
while (i < this.length) {
|
||||
if (this[i] !== s) {
|
||||
return false;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
//Object
|
||||
Object.defineProperty(Array.prototype, "equals", {enumerable: false});
|
||||
|
53
js/uv.js
53
js/uv.js
@ -9,11 +9,11 @@ function showUVShiftDialog() {
|
||||
tl('dialog.shift_uv.message')+
|
||||
'</div>',
|
||||
'<div class="dialog_bar">'+
|
||||
'<label class="inline_label" style="width: 120px;">'+tl('.dialog.shift_uv.horizontal')+': </label>'+
|
||||
'<label class="inline_label" style="width: 120px;">'+tl('dialog.shift_uv.horizontal')+': </label>'+
|
||||
'<input type="text" class="dark_bordered" id="shift_uv_horizontal">'+
|
||||
'</div>',
|
||||
'<div class="dialog_bar">'+
|
||||
'<label class="inline_label" style="width: 120px;">'+tl('.dialog.shift_uv.vertical')+': </label>'+
|
||||
'<label class="inline_label" style="width: 120px;">'+tl('dialog.shift_uv.vertical')+': </label>'+
|
||||
'<input type="text" class="dark_bordered" id="shift_uv_vertical">'+
|
||||
'</div>'
|
||||
],
|
||||
@ -82,7 +82,7 @@ class UVEditor {
|
||||
buildDom(toolbar) {
|
||||
var scope = this
|
||||
if (this.jquery.main) {
|
||||
this.jquery.main.remove()
|
||||
this.jquery.main.detach()
|
||||
}
|
||||
this.jquery.main = $('<div class="UVEditor" id="UVEditor_'+scope.id+'"></div>')
|
||||
if (this.headline) {
|
||||
@ -398,8 +398,14 @@ class UVEditor {
|
||||
getPixelSize() {
|
||||
if (Blockbench.entity_mode) {
|
||||
this.grid = Project.texture_width
|
||||
return this.size/this.grid
|
||||
} else {
|
||||
return this.size/ (
|
||||
(typeof this.texture === 'object' && this.texture.res)
|
||||
? this.texture.res
|
||||
: this.grid
|
||||
)
|
||||
}
|
||||
return this.size/this.grid
|
||||
}
|
||||
getFaces(event) {
|
||||
if (event && event.shiftKey) {
|
||||
@ -602,7 +608,7 @@ class UVEditor {
|
||||
Undo.finishEdit('apply_texture')
|
||||
}
|
||||
displayTexture(id) {
|
||||
if (!id || id === '$transparent') {
|
||||
if (!id || id === null) {
|
||||
this.displayEmptyTexture()
|
||||
} else {
|
||||
var tex = getTextureById(id+'')
|
||||
@ -980,9 +986,9 @@ class UVEditor {
|
||||
this.forCubes(function(obj, i) {
|
||||
scope.getFaces(event).forEach(function(side) {
|
||||
obj.faces[side].uv = [0, 0, 0, 0]
|
||||
obj.faces[side].texture = '$transparent';
|
||||
obj.faces[side].texture = null;
|
||||
})
|
||||
Canvas.updateUV(obj)
|
||||
Canvas.adaptObjectFaces(obj)
|
||||
})
|
||||
this.loadData()
|
||||
this.message('uv_editor.transparent')
|
||||
@ -1187,11 +1193,10 @@ class UVEditor {
|
||||
delete obj.faces[side].enabled;
|
||||
delete obj.faces[side].cullface;
|
||||
})
|
||||
Canvas.updateUV(obj)
|
||||
Canvas.adaptObjectFaces(obj)
|
||||
})
|
||||
this.loadData()
|
||||
this.message('uv_editor.reset')
|
||||
Canvas.updateSelectedFaces()
|
||||
}
|
||||
select() {
|
||||
if (uv_dialog.allFaces.includes(this.id) === false) return;
|
||||
@ -1273,16 +1278,28 @@ class UVEditor {
|
||||
}},
|
||||
]}},
|
||||
{
|
||||
//icon: (scope.reference_face.tintindex === 0 ? 'check_box' : 'check_box_outline_blank'),
|
||||
icon: (editor) => (editor.reference_face.tintindex === 0 ? 'check_box' : 'check_box_outline_blank'),
|
||||
name: 'menu.uv.tint', click: function(editor) {
|
||||
Undo.initEdit({cubes: selected, uv_only: true})
|
||||
editor.switchTint(selected[0].faces[editor.face].tintindex !== 0)
|
||||
Undo.finishEdit('face_tint')
|
||||
},icon: 'content_copy'
|
||||
}
|
||||
},
|
||||
{icon: 'collections', name: 'menu.uv.texture', children: function() {
|
||||
var arr = [
|
||||
{icon: 'clear', name: 'menu.uv.texture.transparent', click: function(editor) {editor.clear(event)}},
|
||||
{icon: 'crop_square', name: 'menu.cube.texture.blank', click: function(editor, event) {
|
||||
Undo.initEdit({cubes: selected})
|
||||
selected.forEach((obj) => {
|
||||
editor.getFaces(event).forEach(function(side) {
|
||||
delete obj.faces[side].texture;
|
||||
})
|
||||
Canvas.adaptObjectFaces(obj)
|
||||
})
|
||||
editor.loadData()
|
||||
editor.message('uv_editor.reset')
|
||||
Undo.initEdit('texture blank')
|
||||
}},
|
||||
{icon: 'clear', name: 'menu.cube.texture.transparent', click: function(editor) {editor.clear(event)}},
|
||||
]
|
||||
textures.forEach(function(t) {
|
||||
arr.push({
|
||||
@ -1295,18 +1312,6 @@ class UVEditor {
|
||||
}}
|
||||
])
|
||||
|
||||
/*
|
||||
Maximize
|
||||
Auto UV
|
||||
Relative Auto UV
|
||||
Apply to all
|
||||
Clear
|
||||
Reset
|
||||
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
var uv_dialog = {
|
||||
isSetup: false,
|
||||
|
15
js/web.js
15
js/web.js
@ -55,15 +55,18 @@ function writeFileEntity() {
|
||||
Blockbench.showQuickMessage('Saved as bedrock entity model')
|
||||
}
|
||||
function writeFileObj() {
|
||||
var delay = 40
|
||||
var content = buildOBJModel('model')
|
||||
//OBJECT
|
||||
var blob_obj = new Blob([content.obj], {type: "text/plain;charset=utf-8"});
|
||||
var obj_saver = saveAs(blob_obj, 'model.obj', {autoBOM: true})
|
||||
|
||||
obj_saver.onwriteend = function() {
|
||||
setTimeout(function() {
|
||||
//MATERIAL
|
||||
var blob_mtl = new Blob([content.mtl], {type: "text/plain;charset=utf-8"});
|
||||
saveAs(blob_mtl, 'model.mtl', {autoBOM: true}).onwriteend = function() {
|
||||
saveAs(blob_mtl, 'model.mtl', {autoBOM: true})
|
||||
|
||||
setTimeout(function() {
|
||||
if (settings.obj_textures.value === true) {
|
||||
var tex_i = 0
|
||||
function saveTex() {
|
||||
@ -76,10 +79,10 @@ function writeFileObj() {
|
||||
}
|
||||
var blob = new Blob([arraybuffer], {type: 'application/octet-stream'})
|
||||
var img_saver = saveAs(blob, textures[tex_i].name)
|
||||
img_saver.onwriteend = function() {
|
||||
setTimeout(function() {
|
||||
tex_i++
|
||||
saveTex()
|
||||
}
|
||||
}, delay)
|
||||
} else if (textures[tex_i]) {
|
||||
tex_i++
|
||||
saveTex()
|
||||
@ -91,8 +94,8 @@ function writeFileObj() {
|
||||
} else {
|
||||
Blockbench.showQuickMessage(tl('message.save_obj'))
|
||||
}
|
||||
}
|
||||
}
|
||||
}, delay)
|
||||
}, delay)
|
||||
}
|
||||
|
||||
function saveFile() {
|
||||
|
29
lang/de.json
29
lang/de.json
@ -374,10 +374,10 @@
|
||||
"action.export_blockmodel.desc": "Ein Minecraft Block- oder Itemmodell exportieren",
|
||||
"action.export_entity": "Bedrock Tier exportieren",
|
||||
"action.export_entity.desc": "Das aktuelle Modell als Tier zu einer mobs.json Datei hinzufügen",
|
||||
"action.export_optifine_part": "Optifine JPM exportieren",
|
||||
"action.export_optifine_part.desc": "Einen Tier-Komponenten für Optifine exportieren",
|
||||
"action.export_optifine_full": "Optifine JEM exportieren",
|
||||
"action.export_optifine_full.desc": "Ein vollständiges Tiermodell für Optifine exportieren",
|
||||
"action.export_optifine_part": "OptiFine JPM exportieren",
|
||||
"action.export_optifine_part.desc": "Einen Tier-Komponenten für OptiFine exportieren",
|
||||
"action.export_optifine_full": "OptiFine JEM exportieren",
|
||||
"action.export_optifine_full.desc": "Ein vollständiges Tiermodell für OptiFine exportieren",
|
||||
"action.export_obj": "OBJ Modell exportieren",
|
||||
"action.export_obj.desc": "Ein Wavefront OBJ Modell exportieren zur Weiterverwendung in anderen Programmen oder zum Hochladen auf Sketchfab",
|
||||
"action.save": "Speichern",
|
||||
@ -551,7 +551,7 @@
|
||||
"menu.texture.edit": "Bearbeiten",
|
||||
"menu.texture.export": "Speichern unter",
|
||||
"menu.texture.save": "Speichern",
|
||||
"menu.texture.properties": "Eigenschaften",
|
||||
"menu.texture.properties": "Eigenschaften...",
|
||||
"menu.preview.background": "Hintergrund",
|
||||
"menu.preview.background.load": "Laden",
|
||||
"menu.preview.background.position": "Positionieren",
|
||||
@ -575,7 +575,6 @@
|
||||
"menu.uv.mapping.mirror_y": "Spiegeln Y",
|
||||
"menu.uv.tint": "Einfärben",
|
||||
"menu.uv.texture": "Textur",
|
||||
"menu.uv.texture.transparent": "Transparent",
|
||||
"cube.color.light_blue": "Hellblau",
|
||||
"cube.color.yellow": "Gelb",
|
||||
"cube.color.orange": "Orange",
|
||||
@ -660,7 +659,6 @@
|
||||
"action.change_textures_folder": "Texturspeicherort ändern",
|
||||
"action.change_textures_folder.desc": "Verändert den speicherort aller Texturen",
|
||||
"menu.texture.particle": "Für Partikel verwenden",
|
||||
"data.seperator": "Trenner",
|
||||
"message.update_notification.title": "Ein Update ist verfügbar",
|
||||
"message.update_notification.message": "Die neue Blockbench Version \"%0\" ist verfügbar. Möchtest du diese jetzt installieren?",
|
||||
"message.update_notification.install": "Installieren",
|
||||
@ -796,5 +794,20 @@
|
||||
"action.camera_reset.desc": "Setzt die Kamera der aktuellen Ansicht auf die Standardperspektive zurück",
|
||||
"panel.variable_placeholders": "Variablen-Platzhalter",
|
||||
"panel.variable_placeholders.info": "Gebe die Variablen der Animation an, für die du eine Vorschau brauchst, als Name=Wert",
|
||||
"status_bar.vertex_distance": "Entfernung: %0"
|
||||
"status_bar.vertex_distance": "Entfernung: %0",
|
||||
"dialog.create_gif.title": "GIF aufzeichnen",
|
||||
"dialog.create_gif.length": "Länge (Sekunden)",
|
||||
"dialog.create_gif.fps": "FPS",
|
||||
"dialog.create_gif.compression": "Kompression",
|
||||
"dialog.create_gif.play": "Animation starten",
|
||||
"category.animation": "Animation",
|
||||
"action.record_model_gif": "GIF aufzeichnen",
|
||||
"action.record_model_gif.desc": "Zeichne ein animiertes GIF des Modells aus der aktuellen Perspektive auf",
|
||||
"display.mirror": "Spiegeln",
|
||||
"data.separator": "Trenner",
|
||||
"message.set_background_position.title": "Hintergrundposition",
|
||||
"menu.preview.background.set_position": "Position festlegen",
|
||||
"dialog.toolbar_edit.hidden": "Ausgeblendet",
|
||||
"action.export_class_entity": "Java Entity exportieren",
|
||||
"action.export_class_entity.desc": "Exportiert das Modell als Java Class."
|
||||
}
|
22
lang/en.json
22
lang/en.json
@ -16,7 +16,7 @@
|
||||
"data.plugin": "Plugin",
|
||||
"data.preview": "Preview",
|
||||
"data.toolbar": "Toolbar",
|
||||
"data.seperator": "Seperator",
|
||||
"data.separator": "Separator",
|
||||
"data.image": "Image",
|
||||
|
||||
"generic.delete": "Delete",
|
||||
@ -68,13 +68,14 @@
|
||||
"message.screenshot.clipboard": "Clipboard",
|
||||
"message.screenshot.right_click": "Screenshot - Right Click to copy",
|
||||
"message.invalid_file.title": "Invalid File",
|
||||
"message.invalid_file.message": "Could not open model file: %0",
|
||||
"message.invalid_file.message": "Could not open json file: %0",
|
||||
"message.invalid_model.title": "Invalid Model File",
|
||||
"message.invalid_model.message": "This file does not contain valid model data.",
|
||||
"message.child_model_only.title": "Empty Child Model",
|
||||
"message.child_model_only.message": "This file is a child of %0 and does not contain a model.",
|
||||
"message.drag_background.title": "Position Background",
|
||||
"message.drag_background.message": "Drag the background to move its position. Hold shift and drag up and down to change its size.",
|
||||
"message.set_background_position.title": "Background Position",
|
||||
"message.convert_mode.title": "Convert Model",
|
||||
"message.convert_mode.message": "Are you sure you want to convert this model to %0? You cannot undo this step.",
|
||||
"message.convert_mode.block": "an entity model",
|
||||
@ -207,6 +208,7 @@
|
||||
"dialog.plugins.show_less": "Show Less",
|
||||
|
||||
"dialog.toolbar_edit.title": "Customize Toolbar",
|
||||
"dialog.toolbar_edit.hidden": "Hidden",
|
||||
|
||||
"dialog.entitylist.title": "Open Entity Model",
|
||||
"dialog.entitylist.text": "Select the model you want to import",
|
||||
@ -219,6 +221,12 @@
|
||||
"dialog.create_texture.template": "Template",
|
||||
"dialog.create_texture.resolution": "Resolution",
|
||||
|
||||
"dialog.create_gif.title": "Record GIF",
|
||||
"dialog.create_gif.length": "Length (Seconds)",
|
||||
"dialog.create_gif.fps": "FPS",
|
||||
"dialog.create_gif.compression": "Compression Amount",
|
||||
"dialog.create_gif.play": "Start Animation",
|
||||
|
||||
"dialog.shift_uv.title": "Shift UV",
|
||||
"dialog.shift_uv.message": "Enter the number you want to multiply the UV offset coordinates by. Mathematical expressions are allowed. Prepend a \"+\" if you want to add that number.",
|
||||
"dialog.shift_uv.horizontal": "Horizontal",
|
||||
@ -378,6 +386,7 @@
|
||||
"category.filter": "Filter",
|
||||
"category.view": "View",
|
||||
"category.display": "Display Settings",
|
||||
"category.animation": "Animation",
|
||||
"category.textures": "Textures",
|
||||
"category.uv": "UV",
|
||||
"category.misc": "Miscellaneous",
|
||||
@ -479,6 +488,8 @@
|
||||
"action.export_blockmodel.desc": "Export a Minecraft block or item model",
|
||||
"action.export_entity": "Export Bedrock Entity",
|
||||
"action.export_entity.desc": "Add the current model as an entity to a mobs.json file",
|
||||
"action.export_class_entity": "Export Java Entity",
|
||||
"action.export_class_entity.desc": "Export the entity model as a Java class",
|
||||
"action.export_optifine_part": "Export Optifine JPM",
|
||||
"action.export_optifine_part.desc": "Export an entity part model for Optifine",
|
||||
"action.export_optifine_full": "Export Optifine JEM",
|
||||
@ -620,6 +631,8 @@
|
||||
"action.toggle_wireframe.desc": "Toggle the wireframe display mode.",
|
||||
"action.screenshot_model": "Screenshot Model",
|
||||
"action.screenshot_model.desc": "Take a cropped screenshot of the model from the current angle",
|
||||
"action.record_model_gif": "Record GIF",
|
||||
"action.record_model_gif.desc": "Record an animated GIF of the model from the current angle",
|
||||
"action.screenshot_app": "Screenshot App",
|
||||
"action.screenshot_app.desc": "Take a screenshot of the whole application",
|
||||
"action.toggle_quad_view": "Toggle Quad View",
|
||||
@ -746,11 +759,12 @@
|
||||
"menu.texture.particle": "Use for Particles",
|
||||
"menu.texture.export": "Save As",
|
||||
"menu.texture.save": "Save",
|
||||
"menu.texture.properties": "Properties",
|
||||
"menu.texture.properties": "Properties...",
|
||||
|
||||
"menu.preview.background": "Background",
|
||||
"menu.preview.background.load": "Load",
|
||||
"menu.preview.background.position": "Position",
|
||||
"menu.preview.background.set_position": "Set Position",
|
||||
"menu.preview.background.lock": "Lock To Camera",
|
||||
"menu.preview.background.remove": "Remove",
|
||||
"menu.preview.screenshot": "Screenshot",
|
||||
@ -772,7 +786,6 @@
|
||||
"menu.uv.mapping.mirror_y": "Mirror Y",
|
||||
"menu.uv.tint": "Tint",
|
||||
"menu.uv.texture": "Texture",
|
||||
"menu.uv.texture.transparent": "Transparent",
|
||||
|
||||
"menu.toolbar.edit": "Customize",
|
||||
"menu.toolbar.reset": "Reset",
|
||||
@ -858,6 +871,7 @@
|
||||
"display.rotation": "Rotation",
|
||||
"display.translation": "Translation",
|
||||
"display.scale": "Scale",
|
||||
"display.mirror": "Mirror",
|
||||
"display.slot": "Slot",
|
||||
"display.reference": "Reference Model",
|
||||
"display.presetname": "Name",
|
||||
|
55
lang/es.json
55
lang/es.json
@ -374,10 +374,10 @@
|
||||
"action.export_blockmodel.desc": "Exporta un modelo de bloque o de ítem",
|
||||
"action.export_entity": "Exportar Entidad de Bedrock",
|
||||
"action.export_entity.desc": "Añade el modelo actual como una entidad a un archivo mobs.json",
|
||||
"action.export_optifine_part": "Exportar a Optifine JPM",
|
||||
"action.export_optifine_part.desc": "Exportar un modelo de parte de entidad para Optifine",
|
||||
"action.export_optifine_full": "Exportar a Optifine JEM",
|
||||
"action.export_optifine_full.desc": "Exportar un modelo completo de entidad de Optifine",
|
||||
"action.export_optifine_part": "Exportar a OptiFine JPM",
|
||||
"action.export_optifine_part.desc": "Exportar un modelo de parte de entidad para OptiFine",
|
||||
"action.export_optifine_full": "Exportar a OptiFine JEM",
|
||||
"action.export_optifine_full.desc": "Exportar un modelo completo de entidad de OptiFine",
|
||||
"action.export_obj": "Exportar Modelo OBJ",
|
||||
"action.export_obj.desc": "Crear un modelo WaveFront OBJ para usar en otros programas o para subir a Sketchfab",
|
||||
"action.save": "Guardar",
|
||||
@ -539,9 +539,9 @@
|
||||
"menu.cube.texture": "Textura",
|
||||
"menu.cube.texture.transparent": "Transparente",
|
||||
"menu.cube.texture.blank": "En Blanco",
|
||||
"menu.group.duplicate": "Diplicar",
|
||||
"menu.group.duplicate": "Duplicar",
|
||||
"menu.group.sort": "Ordenar",
|
||||
"menu.group.resolve": "Resolver",
|
||||
"menu.group.resolve": "Disolver",
|
||||
"menu.texture.face": "Aplicar a Cara",
|
||||
"menu.texture.cube": "Aplicar a Cubo",
|
||||
"menu.texture.file": "Archivo",
|
||||
@ -575,7 +575,6 @@
|
||||
"menu.uv.mapping.mirror_y": "Invertir Y",
|
||||
"menu.uv.tint": "Tintar",
|
||||
"menu.uv.texture": "Textura",
|
||||
"menu.uv.texture.transparent": "Transparente",
|
||||
"cube.color.light_blue": "Azul claro",
|
||||
"cube.color.yellow": "Amarillo",
|
||||
"cube.color.orange": "Naranja",
|
||||
@ -660,7 +659,6 @@
|
||||
"action.change_textures_folder": "Cambiar Localización de las Texturas",
|
||||
"action.change_textures_folder.desc": "Cambia la carpeta que en la que se guardan todas las texturas",
|
||||
"menu.texture.particle": "Usar para Partículas",
|
||||
"data.seperator": "Separador",
|
||||
"message.update_notification.title": "Una Actualización Está Disponible",
|
||||
"message.update_notification.message": "La nueva versión de Blockbench \"%0\" está disponible. ¿Quieres instalarla ahora?",
|
||||
"message.update_notification.install": "Instalar",
|
||||
@ -784,17 +782,32 @@
|
||||
"menu.animation.loop": "Repetición",
|
||||
"menu.animation.override": "Sobreescribir",
|
||||
"menu.animation.anim_time_update": "Actualizar Variable",
|
||||
"message.display_skin_model.title": "Skin Model",
|
||||
"message.display_skin_model.message": "Chose the model type of your skin",
|
||||
"message.display_skin_model.classic": "Classic",
|
||||
"message.display_skin_model.slim": "Slim",
|
||||
"message.bone_material": "Change bone material",
|
||||
"action.slider_animation_length": "Animation Length",
|
||||
"action.slider_animation_length.desc": "Change the length of the selected animation",
|
||||
"menu.group.material": "Set Material",
|
||||
"action.camera_reset": "Reset Camera",
|
||||
"action.camera_reset.desc": "Reset the current preview to the default camera angle",
|
||||
"panel.variable_placeholders": "Variable Placeholders",
|
||||
"panel.variable_placeholders.info": "List the variables you want to preview via name=value",
|
||||
"status_bar.vertex_distance": "Distance: %0"
|
||||
"message.display_skin_model.title": "Modelo de Skin",
|
||||
"message.display_skin_model.message": "Escoge el tipo de modelo de tu skin",
|
||||
"message.display_skin_model.classic": "Clásico",
|
||||
"message.display_skin_model.slim": "Delgado",
|
||||
"message.bone_material": "Cambiar el material del hueso",
|
||||
"action.slider_animation_length": "Duración de la Animación",
|
||||
"action.slider_animation_length.desc": "Cambia la duración de la animación seleccionada",
|
||||
"menu.group.material": "Establecer Material",
|
||||
"action.camera_reset": "Resetear Cámara",
|
||||
"action.camera_reset.desc": "Resetea la previsualización actual al ángulo de cámara por defecto",
|
||||
"panel.variable_placeholders": "Variables Temporales",
|
||||
"panel.variable_placeholders.info": "Muestra las variables que quieres visualizar mediante nombre=valor",
|
||||
"status_bar.vertex_distance": "Distancia: %0",
|
||||
"dialog.create_gif.title": "Grabar GIF",
|
||||
"dialog.create_gif.length": "Duración (Segundos)",
|
||||
"dialog.create_gif.fps": "FPS",
|
||||
"dialog.create_gif.compression": "Cantidad de Compresión",
|
||||
"dialog.create_gif.play": "Empezar Animación",
|
||||
"category.animation": "Animación",
|
||||
"action.record_model_gif": "Grabar GIF",
|
||||
"action.record_model_gif.desc": "Graba un GIF animado de este modelo desde este ángulo",
|
||||
"display.mirror": "Invertir",
|
||||
"data.separator": "Separador",
|
||||
"message.set_background_position.title": "Background Position",
|
||||
"menu.preview.background.set_position": "Set Position",
|
||||
"dialog.toolbar_edit.hidden": "Hidden",
|
||||
"action.export_class_entity": "Export Java Entity",
|
||||
"action.export_class_entity.desc": "Export the entity model as a Java class"
|
||||
}
|
113
lang/fr.json
113
lang/fr.json
@ -374,10 +374,10 @@
|
||||
"action.export_blockmodel.desc": "Exporter un bloc ou un objet de Minecraft",
|
||||
"action.export_entity": "Exporter une entité Bedrock",
|
||||
"action.export_entity.desc": "Ajouter le modèle actuel en tant qu'entité à un fichier mobs.json",
|
||||
"action.export_optifine_part": "Exporter Optifine JPM",
|
||||
"action.export_optifine_part.desc": "Exporter un modèle de pièce d'entité pour Optifine",
|
||||
"action.export_optifine_full": "Exporter Optifine JEM",
|
||||
"action.export_optifine_full.desc": "Exporter un modèle complet d'entité Optifine",
|
||||
"action.export_optifine_part": "Exporter OptiFine JPM",
|
||||
"action.export_optifine_part.desc": "Exporter un modèle de pièce d'entité pour OptiFine",
|
||||
"action.export_optifine_full": "Exporter OptiFine JEM",
|
||||
"action.export_optifine_full.desc": "Exporter un modèle complet d'entité OptiFine",
|
||||
"action.export_obj": "Exporter un modèle OBJ",
|
||||
"action.export_obj.desc": "Exporter un modèle OBJ Wavefront pour l'utiliser dans d'autres programmes ou pour le télécharger dans Sketchfab",
|
||||
"action.save": "Sauvegarder",
|
||||
@ -500,7 +500,7 @@
|
||||
"action.import_texture.desc": "Importer une ou plusieurs textures de votre ordinateur",
|
||||
"action.create_texture": "Créer une texture",
|
||||
"action.create_texture.desc": "Créer une texture vierge ou un modèle de texture",
|
||||
"action.reload_textures": "Recharger des textures",
|
||||
"action.reload_textures": "Recharger les textures",
|
||||
"action.reload_textures.desc": "Recharger toutes les textures",
|
||||
"action.save_textures": "Enregistrer les textures",
|
||||
"action.save_textures.desc": "Sauvegarder toutes les textures non sauvegardées",
|
||||
@ -575,7 +575,6 @@
|
||||
"menu.uv.mapping.mirror_y": "Miroir Y",
|
||||
"menu.uv.tint": "Teinte",
|
||||
"menu.uv.texture": "Texture",
|
||||
"menu.uv.texture.transparent": "Transparent",
|
||||
"cube.color.light_blue": "Bleu clair",
|
||||
"cube.color.yellow": "Jaune",
|
||||
"cube.color.orange": "Orange",
|
||||
@ -660,7 +659,6 @@
|
||||
"action.change_textures_folder": "Changer l'emplacement de la texture",
|
||||
"action.change_textures_folder.desc": "Changer le dossier dans lequel toutes les textures sont enregistrées",
|
||||
"menu.texture.particle": "Utiliser pour les particules",
|
||||
"data.seperator": "Séparateur",
|
||||
"message.update_notification.title": "Une mise à jour est disponible",
|
||||
"message.update_notification.message": "La nouvelle version \"%0\" de Blockbench est disponible. Voulez-vous l'installer maintenant ?",
|
||||
"message.update_notification.install": "Installer",
|
||||
@ -745,56 +743,71 @@
|
||||
"action.move_right": "Déplacer vers la droite",
|
||||
"action.move_right.desc": "Déplacer les cubes sélectionnés vers la droite par rapport à l'angle de caméra actuel",
|
||||
"action.move_forth": "Déplacer vers l'avant",
|
||||
"action.move_forth.desc": "Reculer les cubes sélectionnés vers l'avant par rapport à l'angle de la caméra actuel",
|
||||
"action.move_forth.desc": "Reculer les cubes sélectionnés vers l'avant par rapport à l'angle de la caméra actuelle",
|
||||
"action.move_back": "Déplacer vers l'arrière",
|
||||
"action.move_back.desc": "Reculer les cubes sélectionnés vers l'arrière par rapport à l'angle de la caméra actuel",
|
||||
"layout.color.wireframe": "Wireframe",
|
||||
"layout.color.wireframe.desc": "Wireframe view lines",
|
||||
"action.add_animation": "Add Animation",
|
||||
"action.add_animation.desc": "Create a blank animation",
|
||||
"action.load_animation_file": "Import Animations",
|
||||
"action.load_animation_file.desc": "Import an animation file",
|
||||
"action.play_animation": "Play Animations",
|
||||
"action.play_animation.desc": "Preview the selected animation",
|
||||
"action.export_animation_file": "Export Animations",
|
||||
"action.export_animation_file.desc": "Export a json file with the current animations",
|
||||
"action.slider_keyframe_time": "Timecode",
|
||||
"action.slider_keyframe_time.desc": "Change the timecode of the selected keyframes",
|
||||
"timeline.rotation": "Rotation",
|
||||
"layout.color.wireframe": "Maquette",
|
||||
"layout.color.wireframe.desc": "Vue en ligne de la maquette",
|
||||
"action.add_animation": "Ajouter une animation",
|
||||
"action.add_animation.desc": "Créer un animation vide",
|
||||
"action.load_animation_file": "Importer une animation",
|
||||
"action.load_animation_file.desc": "Importer un fichier d'animation",
|
||||
"action.play_animation": "Jouer les animations",
|
||||
"action.play_animation.desc": "Prévisualiser l'animation sélectionnée",
|
||||
"action.export_animation_file": "Exporter l'animation",
|
||||
"action.export_animation_file.desc": "Exporter un fichier json avec les animations en cours",
|
||||
"action.slider_keyframe_time": "Code temporel",
|
||||
"action.slider_keyframe_time.desc": "Modifier le code temporel des images clés sélectionnées",
|
||||
"timeline.rotation": "Tourner",
|
||||
"timeline.position": "Position",
|
||||
"timeline.scale": "Scale",
|
||||
"menu.timeline.add": "Add Keyframe",
|
||||
"timeline.scale": "Échelle",
|
||||
"menu.timeline.add": "Ajouter une image clé",
|
||||
"menu.keyframe.quaternion": "Quaternion",
|
||||
"panel.animations": "Animations",
|
||||
"panel.keyframe": "Keyframe",
|
||||
"panel.keyframe.type": "Keyframe (%0)",
|
||||
"generic.delete": "Delete",
|
||||
"generic.rename": "Rename",
|
||||
"message.rename_animation": "Rename Animation",
|
||||
"panel.keyframe": "Image clé",
|
||||
"panel.keyframe.type": "Image clé (%0)",
|
||||
"generic.delete": "Effacer",
|
||||
"generic.rename": "Renommer",
|
||||
"message.rename_animation": "Renommer l'animation",
|
||||
"message.animation_update_var": "Animation Update Variable",
|
||||
"message.no_animation_selected": "You have to select an animation to do this",
|
||||
"message.no_bone_selected": "You have to select a bone to do this",
|
||||
"message.no_animation_selected": "Vous devez sélectionner une animation pour faire cela",
|
||||
"message.no_bone_selected": "Vous devez sélectionner un os pour faire cela",
|
||||
"message.duplicate_groups.title": "Bone Name Duplicate",
|
||||
"message.duplicate_groups.message": "The name of this bone exists on multiple bones. This can cause problems.",
|
||||
"action.select_all_keyframes": "Select All Keyframes",
|
||||
"action.select_all_keyframes.desc": "Select all keyframes of the current bone",
|
||||
"action.delete_keyframes": "Delete Keyframes",
|
||||
"action.delete_keyframes.desc": "Delete all selected keyframes",
|
||||
"message.duplicate_groups.message": "Le nom de cet os existe sur plusieurs os. Cela peut créer des problèmes.",
|
||||
"action.select_all_keyframes": "Sélectionner toutes les images clés",
|
||||
"action.select_all_keyframes.desc": "Sélectionner toutes les images clés de l'os actuel",
|
||||
"action.delete_keyframes": "Supprimer des images clés",
|
||||
"action.delete_keyframes.desc": "Supprimer toutes les images clés sélectionnées",
|
||||
"menu.animation": "Animation",
|
||||
"menu.animation.loop": "Loop",
|
||||
"menu.animation.override": "Override",
|
||||
"menu.animation.anim_time_update": "Update Variable",
|
||||
"message.display_skin_model.title": "Skin Model",
|
||||
"message.display_skin_model.message": "Chose the model type of your skin",
|
||||
"message.display_skin_model.classic": "Classic",
|
||||
"message.display_skin_model.slim": "Slim",
|
||||
"message.bone_material": "Change bone material",
|
||||
"action.slider_animation_length": "Animation Length",
|
||||
"action.slider_animation_length.desc": "Change the length of the selected animation",
|
||||
"menu.group.material": "Set Material",
|
||||
"action.camera_reset": "Reset Camera",
|
||||
"action.camera_reset.desc": "Reset the current preview to the default camera angle",
|
||||
"menu.animation.loop": "Boucle",
|
||||
"menu.animation.override": "Outrepasser",
|
||||
"menu.animation.anim_time_update": "Mettre à jour la variable",
|
||||
"message.display_skin_model.title": "Skin modèle",
|
||||
"message.display_skin_model.message": "Choisissez le type de votre skin",
|
||||
"message.display_skin_model.classic": "Classique",
|
||||
"message.display_skin_model.slim": "Mince",
|
||||
"message.bone_material": "Changer le matériel d'un os",
|
||||
"action.slider_animation_length": "Longueur de l'animation",
|
||||
"action.slider_animation_length.desc": "Changer la longueur de l'animation selectionnée",
|
||||
"menu.group.material": "Mettre un matériel",
|
||||
"action.camera_reset": "Réinitialiser la caméra",
|
||||
"action.camera_reset.desc": "Réinitialiser l'angle de la caméra de la prévisualisation actuelle",
|
||||
"panel.variable_placeholders": "Variable Placeholders",
|
||||
"panel.variable_placeholders.info": "List the variables you want to preview via name=value",
|
||||
"status_bar.vertex_distance": "Distance: %0"
|
||||
"panel.variable_placeholders.info": "Lister les variables à prévisualiser par nom=valeur",
|
||||
"status_bar.vertex_distance": "Distance: %0",
|
||||
"dialog.create_gif.title": "Enregistrer le GIF",
|
||||
"dialog.create_gif.length": "Longueur (Secondes)",
|
||||
"dialog.create_gif.fps": "FPS",
|
||||
"dialog.create_gif.compression": "Quantité de compression",
|
||||
"dialog.create_gif.play": "Démarrer l'animation",
|
||||
"category.animation": "Animation",
|
||||
"action.record_model_gif": "Enregistrer le GIF",
|
||||
"action.record_model_gif.desc": "Enregistrer un GIF animé du modèle à partir de l'angle actuel",
|
||||
"display.mirror": "Miroir",
|
||||
"data.separator": "Séparateur",
|
||||
"message.set_background_position.title": "Position de l'arrière-plan",
|
||||
"menu.preview.background.set_position": "Définir la position",
|
||||
"dialog.toolbar_edit.hidden": "Hidden",
|
||||
"action.export_class_entity": "Export Java Entity",
|
||||
"action.export_class_entity.desc": "Export the entity model as a Java class"
|
||||
}
|
61
lang/ja.json
61
lang/ja.json
@ -160,7 +160,7 @@
|
||||
"dialog.create_texture.name": "名前",
|
||||
"dialog.create_texture.folder": "フォルダ",
|
||||
"dialog.create_texture.template": "テンプレート",
|
||||
"dialog.create_texture.resolution": "決定",
|
||||
"dialog.create_texture.resolution": "Resolution",
|
||||
"dialog.input.title": "入力",
|
||||
"dialog.update.title": "アップデート",
|
||||
"dialog.update.refresh": "リトライ",
|
||||
@ -374,10 +374,10 @@
|
||||
"action.export_blockmodel.desc": "Minecraftブロックまたはアイテムモデルをエクスポートする",
|
||||
"action.export_entity": "エンティティをエクスポート",
|
||||
"action.export_entity.desc": "現在のモデルをエンティティとして、mobs.jsonに追加する",
|
||||
"action.export_optifine_part": "Optifine JPMのエクスポート",
|
||||
"action.export_optifine_part.desc": "Optifineのエンティティパーツのエクスポート",
|
||||
"action.export_optifine_full": "Optifine JEMのエクスポート",
|
||||
"action.export_optifine_full.desc": "Optifineエンティティモデルを完全にエクスポートする",
|
||||
"action.export_optifine_part": "OptiFine JPMのエクスポート",
|
||||
"action.export_optifine_part.desc": "OptiFineのエンティティパーツのエクスポート",
|
||||
"action.export_optifine_full": "OptiFine JEMのエクスポート",
|
||||
"action.export_optifine_full.desc": "OptiFineエンティティモデルを完全にエクスポートする",
|
||||
"action.export_obj": "OBJモデルのエクスポート",
|
||||
"action.export_obj.desc": "他のプログラムで使用するWavefront OBJモデルをエクスポートするか、Sketchfabにアップロードする",
|
||||
"action.save": "セーブ",
|
||||
@ -575,7 +575,6 @@
|
||||
"menu.uv.mapping.mirror_y": "ミラーY",
|
||||
"menu.uv.tint": "色合い",
|
||||
"menu.uv.texture": "テクスチャ",
|
||||
"menu.uv.texture.transparent": "透明",
|
||||
"cube.color.light_blue": "ライトブルー",
|
||||
"cube.color.yellow": "黄色",
|
||||
"cube.color.orange": "オレンジ",
|
||||
@ -590,7 +589,7 @@
|
||||
"switches.autouv": "自動UV",
|
||||
"panel.uv": "UV",
|
||||
"panel.display": "表示",
|
||||
"panel.textures": "テクスチャ",
|
||||
"panel.textures": "Textures",
|
||||
"panel.outliner": "Outliner",
|
||||
"panel.options": "回転",
|
||||
"panel.options.angle": "角度",
|
||||
@ -660,7 +659,6 @@
|
||||
"action.change_textures_folder": "テクスチャの位置を変更する",
|
||||
"action.change_textures_folder.desc": "すべてのテクスチャが保存されているフォルダを変更する",
|
||||
"menu.texture.particle": "パーティクルの使用",
|
||||
"data.seperator": "セパレータ",
|
||||
"message.update_notification.title": "アップデートが使用可能です",
|
||||
"message.update_notification.message": "新しいBlockbench\"%0\"が使用可能です。今すぐインストールしますか?",
|
||||
"message.update_notification.install": "インストール",
|
||||
@ -707,8 +705,8 @@
|
||||
"uv_editor.rotated": "回転済み",
|
||||
"uv_editor.auto_cull": "カウルフェイスを手動にする",
|
||||
"uv_editor.copied": "コピーした面",
|
||||
"uv_editor.pasted": "ペーストした面",
|
||||
"uv_editor.copied_x": "コピーした%0の面",
|
||||
"uv_editor.pasted": "ペースト",
|
||||
"uv_editor.copied_x": "%0をコピー",
|
||||
"uv_editor.reset": "面をリセット",
|
||||
"uv_editor.maximized": "最大化",
|
||||
"uv_editor.autouv": "自動サイズ",
|
||||
@ -771,30 +769,45 @@
|
||||
"generic.delete": "削除",
|
||||
"generic.rename": "名前を変更",
|
||||
"message.rename_animation": "アニメーションの名前を変更する",
|
||||
"message.animation_update_var": "Animation Update Variable",
|
||||
"message.animation_update_var": "アニメーション変数の更新",
|
||||
"message.no_animation_selected": "アニメーションを選択してください",
|
||||
"message.no_bone_selected": "You have to select a bone to do this",
|
||||
"message.duplicate_groups.title": "Bone Name Duplicate",
|
||||
"message.duplicate_groups.message": "The name of this bone exists on multiple bones. This can cause problems.",
|
||||
"message.no_bone_selected": "これを行うにはboneを選択する必要があります",
|
||||
"message.duplicate_groups.title": "bone の名前重複",
|
||||
"message.duplicate_groups.message": "この名前はすでに存在します。",
|
||||
"action.select_all_keyframes": "すべてのキーフレームを選択",
|
||||
"action.select_all_keyframes.desc": "Select all keyframes of the current bone",
|
||||
"action.select_all_keyframes.desc": "すべてのキーフレームを選択する",
|
||||
"action.delete_keyframes": "キーフレームを削除",
|
||||
"action.delete_keyframes.desc": "選択したすべてのキーフレームを削除する",
|
||||
"menu.animation": "アニメーション",
|
||||
"menu.animation.loop": "ループ",
|
||||
"menu.animation.override": "オーバーライド",
|
||||
"menu.animation.anim_time_update": "Update Variable",
|
||||
"menu.animation.anim_time_update": "変数を更新",
|
||||
"message.display_skin_model.title": "スキンモデル",
|
||||
"message.display_skin_model.message": "Chose the model type of your skin",
|
||||
"message.display_skin_model.message": "スキンのタイプを選択する",
|
||||
"message.display_skin_model.classic": "クラシック",
|
||||
"message.display_skin_model.slim": "スリム",
|
||||
"message.bone_material": "Change bone material",
|
||||
"action.slider_animation_length": "アニメーションの長さ",
|
||||
"action.slider_animation_length.desc": "Change the length of the selected animation",
|
||||
"menu.group.material": "Set Material",
|
||||
"action.camera_reset": "Reset Camera",
|
||||
"action.camera_reset.desc": "Reset the current preview to the default camera angle",
|
||||
"panel.variable_placeholders": "Variable Placeholders",
|
||||
"panel.variable_placeholders.info": "List the variables you want to preview via name=value",
|
||||
"status_bar.vertex_distance": "Distance: %0"
|
||||
"action.slider_animation_length.desc": "選択したアニメーションの長さを変更する",
|
||||
"menu.group.material": "素材を設定する",
|
||||
"action.camera_reset": "カメラをリセット",
|
||||
"action.camera_reset.desc": "現在のプレビューをデフォルトのカメラアングルにリセットする",
|
||||
"panel.variable_placeholders": "可変プレースホルダ",
|
||||
"panel.variable_placeholders.info": "プレビューする変数を 名前 = 値で表示する",
|
||||
"status_bar.vertex_distance": "キョリ:%0",
|
||||
"dialog.create_gif.title": "レコードGIF",
|
||||
"dialog.create_gif.length": "長さ(秒)",
|
||||
"dialog.create_gif.fps": "FPS",
|
||||
"dialog.create_gif.compression": "圧縮量",
|
||||
"dialog.create_gif.play": "アニメーションを再生",
|
||||
"category.animation": "アニメーション",
|
||||
"action.record_model_gif": "Record GIF",
|
||||
"action.record_model_gif.desc": "現在の角度からモデルのアニメーションGIFを記録する",
|
||||
"display.mirror": "ミラー",
|
||||
"data.separator": "セパレータ",
|
||||
"message.set_background_position.title": "Background Position",
|
||||
"menu.preview.background.set_position": "Set Position",
|
||||
"dialog.toolbar_edit.hidden": "Hidden",
|
||||
"action.export_class_entity": "Export Java Entity",
|
||||
"action.export_class_entity.desc": "Export the entity model as a Java class"
|
||||
}
|
27
lang/nl.json
27
lang/nl.json
@ -374,10 +374,10 @@
|
||||
"action.export_blockmodel.desc": "Exporteer Minecraft blok of item model",
|
||||
"action.export_entity": "Exporteer Bedrock Entity",
|
||||
"action.export_entity.desc": "Voeg het huidige model toe als entity in een mobs.json bestand",
|
||||
"action.export_optifine_part": "Exporteer Optifine JPM",
|
||||
"action.export_optifine_part.desc": "Exporteer een entity deel model voor Optifine",
|
||||
"action.export_optifine_full": "Exporteer Optifine JEM",
|
||||
"action.export_optifine_full.desc": "Exporteer een volledig Optifine entity model",
|
||||
"action.export_optifine_part": "Exporteer OptiFine JPM",
|
||||
"action.export_optifine_part.desc": "Exporteer een entity deel model voor OptiFine",
|
||||
"action.export_optifine_full": "Exporteer OptiFine JEM",
|
||||
"action.export_optifine_full.desc": "Exporteer een volledig OptiFine entity model",
|
||||
"action.export_obj": "Exporteer OBJ Model",
|
||||
"action.export_obj.desc": "Exporteer een Wavefront OBJ model om in andere programma's te gebuiken of om te uploaden naar Sketchfab",
|
||||
"action.save": "Opslaan",
|
||||
@ -575,7 +575,6 @@
|
||||
"menu.uv.mapping.mirror_y": "Spiegel Y",
|
||||
"menu.uv.tint": "Tint",
|
||||
"menu.uv.texture": "Afbeelding",
|
||||
"menu.uv.texture.transparent": "Transparant",
|
||||
"cube.color.light_blue": "Lichtblauw",
|
||||
"cube.color.yellow": "Geel",
|
||||
"cube.color.orange": "Oranje",
|
||||
@ -660,7 +659,6 @@
|
||||
"action.change_textures_folder": "Verander Textuur Locatie",
|
||||
"action.change_textures_folder.desc": "Verander de map waar alle texturen zijn opgeslagen",
|
||||
"menu.texture.particle": "Gebruik voor Deeltjes",
|
||||
"data.seperator": "Scheidingsteken",
|
||||
"message.update_notification.title": "Er is een update van Blockbench beschikbaar.",
|
||||
"message.update_notification.message": "Blockbench versie %0 is uit. Wil je deze installeren?",
|
||||
"message.update_notification.install": "Installeren",
|
||||
@ -796,5 +794,20 @@
|
||||
"action.camera_reset.desc": "Reset the current preview to the default camera angle",
|
||||
"panel.variable_placeholders": "Variable Placeholders",
|
||||
"panel.variable_placeholders.info": "List the variables you want to preview via name=value",
|
||||
"status_bar.vertex_distance": "Distance: %0"
|
||||
"status_bar.vertex_distance": "Distance: %0",
|
||||
"dialog.create_gif.title": "Record GIF",
|
||||
"dialog.create_gif.length": "Length (Seconds)",
|
||||
"dialog.create_gif.fps": "FPS",
|
||||
"dialog.create_gif.compression": "Compression Amount",
|
||||
"dialog.create_gif.play": "Start Animation",
|
||||
"category.animation": "Animation",
|
||||
"action.record_model_gif": "Record GIF",
|
||||
"action.record_model_gif.desc": "Record an animated GIF of the model from the current angle",
|
||||
"display.mirror": "Mirror",
|
||||
"data.separator": "Scheidingsteken",
|
||||
"message.set_background_position.title": "Background Position",
|
||||
"menu.preview.background.set_position": "Set Position",
|
||||
"dialog.toolbar_edit.hidden": "Hidden",
|
||||
"action.export_class_entity": "Export Java Entity",
|
||||
"action.export_class_entity.desc": "Export the entity model as a Java class"
|
||||
}
|
25
lang/pl.json
25
lang/pl.json
@ -374,10 +374,10 @@
|
||||
"action.export_blockmodel.desc": "Eksportuj model bloku lub przedmiotu Minecraft",
|
||||
"action.export_entity": "Eksportuj byt Bedrock",
|
||||
"action.export_entity.desc": "Dodaj aktualny model jako byt do pliku mobs.json",
|
||||
"action.export_optifine_part": "Eksportuj JPM Optifine",
|
||||
"action.export_optifine_part": "Eksportuj JPM OptiFine",
|
||||
"action.export_optifine_part.desc": "Eksportuje ",
|
||||
"action.export_optifine_full": "Eksportuj JEM Optifine",
|
||||
"action.export_optifine_full.desc": "Eksportuj cały model bytu Optifine",
|
||||
"action.export_optifine_full": "Eksportuj JEM OptiFine",
|
||||
"action.export_optifine_full.desc": "Eksportuj cały model bytu OptiFine",
|
||||
"action.export_obj": "Eksportuj model OBJ",
|
||||
"action.export_obj.desc": "Eksportuj model Wavefront OBJ do użycia w innych programach lub wstawienia na Sketchfab",
|
||||
"action.save": "Zapisz",
|
||||
@ -575,7 +575,6 @@
|
||||
"menu.uv.mapping.mirror_y": "Odbicie Y",
|
||||
"menu.uv.tint": "Odcień",
|
||||
"menu.uv.texture": "Tekstura",
|
||||
"menu.uv.texture.transparent": "Przeźroczystość",
|
||||
"cube.color.light_blue": "Jasnoniebieski",
|
||||
"cube.color.yellow": "Żółty",
|
||||
"cube.color.orange": "Pomarańczowy",
|
||||
@ -660,7 +659,6 @@
|
||||
"action.change_textures_folder": "Zmień lokalizacje tekstur",
|
||||
"action.change_textures_folder.desc": "Zmienia katalog, w którym są zapisane wszystkie tekstury",
|
||||
"menu.texture.particle": "Użyj dla cząstek",
|
||||
"data.seperator": "Separator",
|
||||
"message.update_notification.title": "Dostępna jest aktualizacja",
|
||||
"message.update_notification.message": "Nowa wersja Blockbench \"%0\" jest dostępna. Chcesz ją teraz zainstalować?",
|
||||
"message.update_notification.install": "Zainstaluj",
|
||||
@ -796,5 +794,20 @@
|
||||
"action.camera_reset.desc": "Reset the current preview to the default camera angle",
|
||||
"panel.variable_placeholders": "Variable Placeholders",
|
||||
"panel.variable_placeholders.info": "List the variables you want to preview via name=value",
|
||||
"status_bar.vertex_distance": "Distance: %0"
|
||||
"status_bar.vertex_distance": "Distance: %0",
|
||||
"dialog.create_gif.title": "Record GIF",
|
||||
"dialog.create_gif.length": "Length (Seconds)",
|
||||
"dialog.create_gif.fps": "FPS",
|
||||
"dialog.create_gif.compression": "Compression Amount",
|
||||
"dialog.create_gif.play": "Start Animation",
|
||||
"category.animation": "Animation",
|
||||
"action.record_model_gif": "Record GIF",
|
||||
"action.record_model_gif.desc": "Record an animated GIF of the model from the current angle",
|
||||
"display.mirror": "Mirror",
|
||||
"data.separator": "Separator",
|
||||
"message.set_background_position.title": "Background Position",
|
||||
"menu.preview.background.set_position": "Set Position",
|
||||
"dialog.toolbar_edit.hidden": "Hidden",
|
||||
"action.export_class_entity": "Export Java Entity",
|
||||
"action.export_class_entity.desc": "Export the entity model as a Java class"
|
||||
}
|
559
lang/ru.json
559
lang/ru.json
@ -29,9 +29,9 @@
|
||||
"keys.enter": "Ввод",
|
||||
"keys.escape": "Escape",
|
||||
"keys.function": "F%0",
|
||||
"keys.numpad": "Numbad %0",
|
||||
"keys.caps": "Capslock",
|
||||
"keys.menu": "Контекстное меню",
|
||||
"keys.numpad": "%0 (цифр. кл.)",
|
||||
"keys.caps": "Caps Lock",
|
||||
"keys.menu": "Menu",
|
||||
"keys.left": "Стрелка влево",
|
||||
"keys.up": "Стрелка вверх",
|
||||
"keys.right": "Стрелка вправо",
|
||||
@ -46,99 +46,99 @@
|
||||
"keys.end": "End",
|
||||
"keys.pos1": "Home",
|
||||
"keys.printscreen": "Print Screen",
|
||||
"keys.pause": "Пауза",
|
||||
"keys.pause": "Pause",
|
||||
"message.rotation_limit.title": "Ограничение поворота",
|
||||
"message.rotation_limit.message": "Поворот ограничен до 22,5 градусов Майнкрафтом по каждой с осей. Поворот на разных осях сбросит повороты на других. Отключите функцию \"Ограничение поворота\", если вы создаете модель для других целей, где нужен свободный поворот.",
|
||||
"message.file_not_found.title": "Файл не найден",
|
||||
"message.file_not_found.message": "Blockbench не может найти запрашиваемый файл. Убедитесь, что он сохранен по указанному пути, не на облаке.",
|
||||
"message.file_not_found.message": "Blockbench не может найти запрашиваемый файл. Убедитесь, что он сохранен по указанному пути, не в облаке.",
|
||||
"message.screenshot.title": "Скриншот",
|
||||
"message.screenshot.message": "Скриншот сделан",
|
||||
"message.screenshot.clipboard": "Буфер обмена",
|
||||
"message.screenshot.right_click": "Скриншот - ПКМ, чтобы скопировать",
|
||||
"message.invalid_file.title": "Неверный файл",
|
||||
"message.screenshot.message": "Скриншот сделан.",
|
||||
"message.screenshot.clipboard": "Скопировать",
|
||||
"message.screenshot.right_click": "Скриншот: ПКМ — скопировать",
|
||||
"message.invalid_file.title": "Недопустимый файл",
|
||||
"message.invalid_file.message": "Не удалось открыть модель: %0",
|
||||
"message.invalid_model.title": "Неверный файл модели",
|
||||
"message.invalid_model.message": "Этот файл имеет не верную структуру модели.",
|
||||
"message.invalid_model.title": "Недопустимый файл модели",
|
||||
"message.invalid_model.message": "Этот файл содержит недопустимые данные модели.",
|
||||
"message.child_model_only.title": "Пустая дочерняя модель",
|
||||
"message.child_model_only.message": "Это дочерняя модель %0, которая не содержит модели.",
|
||||
"message.drag_background.title": "Расположение фона",
|
||||
"message.drag_background.message": "Нажмите и перетаскивайте фон, чтобы изменить его положение. Удерживайте Shift, для изменения размера.",
|
||||
"message.unsaved_textures.title": "Несохраненные текстуры",
|
||||
"message.unsaved_textures.message": "Ваша модель имеет несохраненные текстуры. Убедитесь, что они сохранены и помещены в ресурспак с моделью.",
|
||||
"message.drag_background.message": "Нажмите и перетаскивайте фон, чтобы изменить его положение. Удерживайте Shift для изменения размера.",
|
||||
"message.unsaved_textures.title": "Несохранённые текстуры",
|
||||
"message.unsaved_textures.message": "Ваша модель содержит несохранённые текстуры. Убедитесь, что они сохранены и помещены в пакет ресурсов.",
|
||||
"message.model_clipping.title": "Модель слишком большая",
|
||||
"message.model_clipping.message": "Ваша модель содержит %0 кубы, которые больше, чем 3x3x3 - лимит самого Майнкрафта. Данная модель не будет работать в игре. Включите функцию \"Ограниченный холст\", чтобы избежать этого.",
|
||||
"message.loose_texture.title": "Импортировать текстуру",
|
||||
"message.loose_texture.message": "Импортированная текстура не находится в ресурспаке. Майнкрафт может использовать текструы, только из них.",
|
||||
"message.model_clipping.message": "Модель содержит %0 кубов, которые превысили ограничение размера моделей в Minecraft — 3x3x3. Модель не будет работать в игре. Включите функцию «Ограниченный холст», чтобы этого избежать.",
|
||||
"message.loose_texture.title": "Импортирование текстуры",
|
||||
"message.loose_texture.message": "Импортированная текстура не находится в пакете ресурсов. Игра может использовать только текстуры, находящиеся в папке текстур загруженного пакета ресурсов.",
|
||||
"message.loose_texture.change": "Изменить путь",
|
||||
"message.update_res.title": "Разрешение текстуры",
|
||||
"message.update_res.message": "Вы хотите обновить разрешение проекта в соответствии с разрешением текстуры? Нажмите \"Отменить\", если разрешение вашей текстуры больше.",
|
||||
"message.update_res.message": "Хотите ли вы обновить разрешение проекта в соответствии с разрешением текстуры? Нажмите «Отмена», если разрешение вашей текстуры больше.",
|
||||
"message.update_res.update": "Обновить",
|
||||
"message.bedrock_overwrite_error.message": "Blockbench не может совместить эту модель со старым файлом.",
|
||||
"message.bedrock_overwrite_error.backup_overwrite": "Создайте копию или замените",
|
||||
"message.bedrock_overwrite_error.backup_overwrite": "Создать копию и заменить",
|
||||
"message.bedrock_overwrite_error.overwrite": "Заменить",
|
||||
"message.close_warning.message": "Вы хотите сохранить вашу модель?",
|
||||
"message.close_warning.web": "Ваша работа будет утеряна. Вы уверенны, что хотите выйти?",
|
||||
"message.close_warning.message": "Вы хотите сохранить модель?",
|
||||
"message.close_warning.web": "Ваша работа будет утеряна. Вы уверены, что хотите выйти?",
|
||||
"message.default_textures.title": "Стандартные текстуры",
|
||||
"message.default_textures.message": "Выберите папку \"textures\" с текстурпаком по умолчанию",
|
||||
"message.default_textures.detail": "Извлеките стандартный ресурспак из Minecraft jar файла или скачайте его с интернета, после чего выберите папку \"textures\" и откройте ее. Blockbench запомнит ее и будет брать текстуры из нее, если не сможет найти из данного ресурспака.",
|
||||
"message.default_textures.select": "Выберите паку \"textures\" для текстур по умолчанию",
|
||||
"message.default_textures.message": "Выберите папку «textures» стандартного пакета ресурсов.",
|
||||
"message.default_textures.detail": "Извлеките стандартный пакет ресурсов из JAR-файла Minecraft или поищите его в интернете. Затем найдите папку «textures» и выберите ее. Blockbench запомнит её расположение и будет загружать текстуры из неё, если не сможет найти их в текущем пакете ресурсов.",
|
||||
"message.default_textures.select": "Выбрать папку «textures»",
|
||||
"message.default_textures.continue": "Продолжить",
|
||||
"message.default_textures.remove": "Удалить",
|
||||
"message.image_editor.title": "Выберите редактор изображений",
|
||||
"message.image_editor.title": "Выбор редактора изображений",
|
||||
"message.image_editor.file": "Выбрать файл...",
|
||||
"message.image_editor.exe": "Выберите .exe файл редактора изображений",
|
||||
"message.display_skin.title": "Скин дисплея",
|
||||
"message.image_editor.exe": "Выберите исполняемый файл редактора",
|
||||
"message.display_skin.title": "Отображаемый скин",
|
||||
"message.display_skin.message": "Выберите скин на вашем компьютере или введите имя игрока",
|
||||
"message.display_skin.upload": "Загрузить скин",
|
||||
"message.display_skin.name": "Никнейм",
|
||||
"message.display_skin.name": "Ввести имя",
|
||||
"message.display_skin.reset": "Сбросить",
|
||||
"message.invalid_plugin": "Неверный файл плагина, посмотрите в консоль",
|
||||
"message.load_plugin_app": "Разрешаете ли вы изменять плагину файлы на вашем компьютере? Загружайте плагины те, которым доверяете.",
|
||||
"message.load_plugin_web": "Вы хотите загрузить этот плагин? Загружайте плагины те, которым доверяете.",
|
||||
"message.preset_no_info": "Шаблон не содержит информации для этого слота.",
|
||||
"message.restart_to_update": "Перезагрузите Blockbench, чтобы применить изменения",
|
||||
"message.restart_to_update": "Перезапустите Blockbench, чтобы применить изменения",
|
||||
"message.save_file": "Сохранено как %0",
|
||||
"message.save_obj": "Сохранено как .obj модель",
|
||||
"message.save_entity": "Сохранено как модель сущности для Бедрок",
|
||||
"message.save_obj": "Сохранено как файл OBJ",
|
||||
"message.save_entity": "Сохранено как модель сущности (Bedrock)",
|
||||
"message.rename_cubes": "Переименовать кубы",
|
||||
"dialog.project.title": "Проект",
|
||||
"dialog.project.name": "Имя файла",
|
||||
"dialog.project.parent": "Родительская модель",
|
||||
"dialog.project.geoname": "Имя геометрий моба",
|
||||
"dialog.project.openparent": "Открыть родительскую модель",
|
||||
"dialog.project.ao": "Окружающая окклюзия",
|
||||
"dialog.project.ao": "Мягкое освещение",
|
||||
"dialog.project.texture_size": "Размер текстуры",
|
||||
"dialog.project.width": "Ширина",
|
||||
"dialog.project.height": "Высота",
|
||||
"dialog.project.to_blockmodel": "К модели блока",
|
||||
"dialog.project.to_entitymodel": "К модели сущности",
|
||||
"dialog.project.to_blockmodel": "В модель блока",
|
||||
"dialog.project.to_entitymodel": "В модель сущности",
|
||||
"dialog.texture.title": "Текстура",
|
||||
"dialog.texture.name": "Имя",
|
||||
"dialog.texture.name": "Имя файла",
|
||||
"dialog.texture.variable": "Переменная",
|
||||
"dialog.texture.namespace": "Пространство имён",
|
||||
"dialog.texture.folder": "Папка",
|
||||
"dialog.extrude.title": "Скан изображения",
|
||||
"dialog.extrude.mode": "Метод сканирования",
|
||||
"dialog.extrude.mode.areas": "Площади",
|
||||
"dialog.extrude.mode.lines": "Линии",
|
||||
"dialog.extrude.mode.columns": "Столбцы",
|
||||
"dialog.extrude.mode.pixels": "Пиксели",
|
||||
"dialog.extrude.opacity": "Минимальная непрозрачность",
|
||||
"dialog.extrude.title": "Сканирование изображения",
|
||||
"dialog.extrude.mode": "Способ создания модели",
|
||||
"dialog.extrude.mode.areas": "по областям",
|
||||
"dialog.extrude.mode.lines": "по линиям",
|
||||
"dialog.extrude.mode.columns": "по столбцам",
|
||||
"dialog.extrude.mode.pixels": "по пикселям",
|
||||
"dialog.extrude.opacity": "Мин. непрозрачность",
|
||||
"dialog.extrude.scan": "Сканировать и импортировать",
|
||||
"dialog.display_preset.title": "Создать шаблон",
|
||||
"dialog.display_preset.message": "Выберите слоты, которые Вы хотите сохранить",
|
||||
"dialog.display_preset.title": "Создание шаблона",
|
||||
"dialog.display_preset.message": "Выберите слоты, которые нужно сохранить",
|
||||
"dialog.display_preset.create": "Создать",
|
||||
"dialog.select.title": "Выбрать",
|
||||
"dialog.select.new": "Новый выбор",
|
||||
"dialog.select.group": "В выбранной группе",
|
||||
"dialog.select.title": "Выделение",
|
||||
"dialog.select.new": "Новое выделение",
|
||||
"dialog.select.group": "В выделенной группе",
|
||||
"dialog.select.name": "Имя содержит",
|
||||
"dialog.select.random": "Случайность",
|
||||
"dialog.select.select": "Выбрать",
|
||||
"dialog.scale.title": "Масштабировать модель",
|
||||
"dialog.select.select": "Выделить",
|
||||
"dialog.scale.title": "Масштабирование модели",
|
||||
"dialog.scale.axis": "Оси",
|
||||
"dialog.scale.scale": "Масштабировать",
|
||||
"dialog.scale.clipping": "Ваша модель слишком велика!",
|
||||
"dialog.scale.confirm": "Масштаб",
|
||||
"dialog.scale.scale": "Масштаб",
|
||||
"dialog.scale.clipping": "Обрезка модели: модель слишком большая",
|
||||
"dialog.scale.confirm": "Масштабировать",
|
||||
"dialog.plugins.title": "Плагины",
|
||||
"dialog.plugins.installed": "Установленные",
|
||||
"dialog.plugins.available": "Доступные",
|
||||
@ -148,8 +148,8 @@
|
||||
"dialog.plugins.none_installed": "Нет установленных плагинов",
|
||||
"dialog.plugins.none_available": "Нет доступных плагинов",
|
||||
"dialog.plugins.outdated": "Требуется более новая версия Blockbench",
|
||||
"dialog.plugins.web_only": "Только для веб приложения",
|
||||
"dialog.plugins.app_only": "Только для приложения для рабочего стола",
|
||||
"dialog.plugins.web_only": "Только для веб-приложения",
|
||||
"dialog.plugins.app_only": "Только для классического приложения",
|
||||
"dialog.plugins.author": "от %0",
|
||||
"dialog.plugins.show_less": "Показать меньше",
|
||||
"dialog.entitylist.title": "Открыть модель сущности",
|
||||
@ -157,7 +157,7 @@
|
||||
"dialog.entitylist.bones": "костей",
|
||||
"dialog.entitylist.cubes": "кубов",
|
||||
"dialog.create_texture.title": "Создать текстуру",
|
||||
"dialog.create_texture.name": "Имя",
|
||||
"dialog.create_texture.name": "Имя файла",
|
||||
"dialog.create_texture.folder": "Папка",
|
||||
"dialog.create_texture.template": "Шаблон",
|
||||
"dialog.create_texture.resolution": "Разрешение",
|
||||
@ -167,169 +167,169 @@
|
||||
"dialog.update.up_to_date": "Blockbench обновлён!",
|
||||
"dialog.update.connecting": "Подключение к серверу",
|
||||
"dialog.settings.settings": "Настройки",
|
||||
"dialog.settings.keybinds": "Клавиши",
|
||||
"dialog.settings.keybinds": "Управление",
|
||||
"dialog.settings.layout": "Внешний вид",
|
||||
"dialog.settings.about": "О программе",
|
||||
"layout.color.back": "Фон",
|
||||
"layout.color.back.desc": "Фоны и поля ввода",
|
||||
"layout.color.dark": "Тёмный",
|
||||
"layout.color.dark.desc": "Цвет фона",
|
||||
"layout.color.ui": "Интерфейс",
|
||||
"layout.color.ui.desc": "Главный цвет интерфейса",
|
||||
"layout.color.bright_ui": "Яркий интерфейс",
|
||||
"layout.color.back": "Задний план",
|
||||
"layout.color.back.desc": "Фон и поля ввода",
|
||||
"layout.color.dark": "Тьма",
|
||||
"layout.color.dark.desc": "Фон рабочей области",
|
||||
"layout.color.ui": "ИП",
|
||||
"layout.color.ui.desc": "Основной цвет интерфейса",
|
||||
"layout.color.bright_ui": "Светлый ИП",
|
||||
"layout.color.bright_ui.desc": "Контекстное меню и подсказки",
|
||||
"layout.color.button": "Кнопка",
|
||||
"layout.color.button.desc": "Кнопки и переключатели",
|
||||
"layout.color.selected": "Выбранное",
|
||||
"layout.color.selected.desc": "Выбранные вкладки и объекты",
|
||||
"layout.color.selected": "Выделенное",
|
||||
"layout.color.selected.desc": "Выделенные вкладки и объекты",
|
||||
"layout.color.border": "Границы",
|
||||
"layout.color.border.desc": "Границы кнопок и вводов",
|
||||
"layout.color.accent": "Акцент",
|
||||
"layout.color.border.desc": "Границы полей ввода и кнопок",
|
||||
"layout.color.accent": "Контраст",
|
||||
"layout.color.accent.desc": "Ползунки и другие детали",
|
||||
"layout.color.grid": "Сеть",
|
||||
"layout.color.grid.desc": "3D сеть",
|
||||
"layout.color.grid": "Сетка",
|
||||
"layout.color.grid.desc": "Сетка рабочей области",
|
||||
"layout.color.text": "Текст",
|
||||
"layout.color.text.desc": "Обычный текст",
|
||||
"layout.color.light": "Яркость",
|
||||
"layout.color.light.desc": "Выделенный текст",
|
||||
"layout.color.accent_text": "Акцентированный текст",
|
||||
"layout.color.accent_text.desc": "Текст на акцентированных элементах",
|
||||
"layout.font.main": "Главный шрифт",
|
||||
"layout.color.light": "Подсветка",
|
||||
"layout.color.light.desc": "Подсвеченный текст",
|
||||
"layout.color.accent_text": "Контрастный текст",
|
||||
"layout.color.accent_text.desc": "Текст на светлых элементах",
|
||||
"layout.font.main": "Шрифт основного текста",
|
||||
"layout.font.headline": "Шрифт заголовка",
|
||||
"about.version": "Версия:",
|
||||
"about.creator": "Создатель:",
|
||||
"about.website": "Вебсайт:",
|
||||
"about.bugtracker": "Баг трекер:",
|
||||
"about.electron": "Это приложение построено с помощью Electron, фреймворк для создания нативных приложений с веб технологиями как JavaScript, HTML и CSS.",
|
||||
"about.website": "Веб-сайт:",
|
||||
"about.bugtracker": "Баг-трекер:",
|
||||
"about.electron": "Это приложение создано с помощью Electron — платформа для создания нативных приложений с веб-технологиями как JavaScript, HTML и CSS.",
|
||||
"about.vertex_snap": "Вершинная привязка основана на плагине от SirBenet",
|
||||
"about.icons": "Пакеты значков:",
|
||||
"about.icons": "Наборы значков:",
|
||||
"about.libraries": "Библиотеки:",
|
||||
"settings.category.general": "Основные",
|
||||
"settings.category.preview": "Предпросмотр",
|
||||
"settings.category.grid": "Сеть",
|
||||
"settings.category.edit": "Изменить",
|
||||
"settings.category.snapping": "Привязка",
|
||||
"settings.category.grid": "Сетка",
|
||||
"settings.category.edit": "Редактирование",
|
||||
"settings.category.snapping": "Привязка к сетке",
|
||||
"settings.category.defaults": "По умолчанию",
|
||||
"settings.category.dialogs": "Диалоги",
|
||||
"settings.category.dialogs": "Диалоговые окна",
|
||||
"settings.category.export": "Экспорт",
|
||||
"settings.language": "Язык",
|
||||
"settings.language.desc": "Язык интерфейса. Перезапустите Blockbench, чтобы сохранить изменения",
|
||||
"settings.show_actions": "Показывать действия",
|
||||
"settings.show_actions.desc": "Показывать каждое действие в статус баре",
|
||||
"settings.language.desc": "Язык интерфейса. Перезапустите Blockbench, чтобы применить изменения.",
|
||||
"settings.show_actions": "Отображение действий",
|
||||
"settings.show_actions.desc": "Показывать каждое действие в строке состояния",
|
||||
"settings.backup_interval": "Интервал автосохранения",
|
||||
"settings.backup_interval.desc": "Интервал автосохранения в минутах",
|
||||
"settings.origin_size": "Центр поворота",
|
||||
"settings.origin_size.desc": "Размер центра поворота",
|
||||
"settings.control_size": "Размер осевых стрелок",
|
||||
"settings.control_size.desc": "Размер трёх стрелок управления",
|
||||
"settings.display_skin": "Скин дисплея",
|
||||
"settings.display_skin.desc": "Скин эталонной модели в режиме дисплея",
|
||||
"settings.control_size.desc": "Размер трёх осевых стрелок управления",
|
||||
"settings.display_skin": "Отображаемый скин",
|
||||
"settings.display_skin.desc": "Скин модели игрока в режиме отображения",
|
||||
"settings.shading": "Тень",
|
||||
"settings.shading.desc": "Включить тени",
|
||||
"settings.transparency": "Прозрачность",
|
||||
"settings.transparency.desc": "Отрисовывать прозрачные текстуры",
|
||||
"settings.texture_fps": "КВС анимированных текстур",
|
||||
"settings.texture_fps.desc": "Кадры в секунду анимированных текстур",
|
||||
"settings.base_grid": "Маленькая сеть",
|
||||
"settings.base_grid.desc": "Показывать маленькую сеть и оси",
|
||||
"settings.large_grid": "Большая сеть",
|
||||
"settings.large_grid.desc": "Показывать большую сеть",
|
||||
"settings.full_grid": "Полная большая сеть",
|
||||
"settings.full_grid.desc": "Показывать точную сеть 3x3",
|
||||
"settings.texture_fps": "FPS анимированных текстур",
|
||||
"settings.texture_fps.desc": "Число кадров в секунду у анимации текстуры",
|
||||
"settings.base_grid": "Маленькая сетка",
|
||||
"settings.base_grid.desc": "Показывать маленькую сетку с осями",
|
||||
"settings.large_grid": "Большая сетка",
|
||||
"settings.large_grid.desc": "Показывать блочную сетку 3x3",
|
||||
"settings.full_grid": "Полная большая сетка",
|
||||
"settings.full_grid.desc": "Показывать полную блочную сетку 3x3",
|
||||
"settings.large_box": "Большая коробка",
|
||||
"settings.large_box.desc": "Показывать границы блоков 3x3",
|
||||
"settings.display_grid": "Режим дисплея",
|
||||
"settings.display_grid.desc": "Показывать сеть в режиме дисплея",
|
||||
"settings.undo_limit": "Лимит отмен",
|
||||
"settings.large_box.desc": "Показывать границу блоков в кубе 3x3x3",
|
||||
"settings.display_grid": "Режим отображения",
|
||||
"settings.display_grid.desc": "Показывать сетку в режиме отображения",
|
||||
"settings.undo_limit": "Максимальное число отмен",
|
||||
"settings.undo_limit.desc": "Количество изменений, которые можно отменить",
|
||||
"settings.restricted_canvas": "Ограниченный холст",
|
||||
"settings.restricted_canvas.desc": "Ограничить размер холста до 3x3 блока во избежание неверных моделей",
|
||||
"settings.restricted_canvas": "Ограниченное пространство",
|
||||
"settings.restricted_canvas.desc": "Ограничить размер модели до 3x3 блока, чтобы избежать ошибок",
|
||||
"settings.limited_rotation": "Ограниченные повороты",
|
||||
"settings.limited_rotation.desc": "Ограничить повороты до лимитов Minecraft",
|
||||
"settings.local_move": "Двигать по относительным осям",
|
||||
"settings.local_move.desc": "Двигать повёрнутые элементы на своих осях, если возможно",
|
||||
"settings.canvas_unselect": "Клик на холст снимает выбор",
|
||||
"settings.canvas_unselect.desc": "Снимает выбор со всех элементов при клике на фоне холста",
|
||||
"settings.limited_rotation.desc": "Ограничить повороты допустимыми значениями в Minecraft",
|
||||
"settings.local_move": "Перемещение по относительным осям",
|
||||
"settings.local_move.desc": "По возможности сделать перемещение повёрнутых элементов по своим осям",
|
||||
"settings.canvas_unselect": "Снятие выделения при нажатии по фону",
|
||||
"settings.canvas_unselect.desc": "Снимать выделение со всех элементов при нажатии по фону рабочей области",
|
||||
"settings.paint_side_restrict": "Ограничить кисть до грани",
|
||||
"settings.paint_side_restrict.desc": "Ограничить кисть до выбранной грани",
|
||||
"settings.autouv": "Авто UV",
|
||||
"settings.autouv.desc": "Включать авто UV по умолчанию",
|
||||
"settings.create_rename": "Переименовывать новый куб",
|
||||
"settings.create_rename.desc": "Переименовывать новые элементы или группы",
|
||||
"settings.edit_size": "Разрешение сети",
|
||||
"settings.edit_size.desc": "Разрешение сети к которой привязываются кубы",
|
||||
"settings.autouv.desc": "Применять «Авто UV» по умолчанию",
|
||||
"settings.create_rename": "Переименовывание новых кубов",
|
||||
"settings.create_rename.desc": "При создании элемента или группы перемещать фокус на переименование",
|
||||
"settings.edit_size": "Разрешение сетки",
|
||||
"settings.edit_size.desc": "Разрешение сетки привязки кубов",
|
||||
"settings.shift_size": "Разрешение Shift",
|
||||
"settings.shift_size.desc": "Разрешение сети удерживая клавишу Shift",
|
||||
"settings.ctrl_size": "Разрешение Control",
|
||||
"settings.ctrl_size.desc": "Разрешение сети удерживая клавишу Control",
|
||||
"settings.negative_size": "Негативный размер",
|
||||
"settings.negative_size.desc": "Разрешить использование негативных размеров",
|
||||
"settings.dialog_unsaved_textures": "Несохраненные текстуры",
|
||||
"settings.dialog_unsaved_textures.desc": "Показывать диалог \"Несохраненные текстуры\"",
|
||||
"settings.shift_size.desc": "Разрешение сетки привязки при удерживании Shift",
|
||||
"settings.ctrl_size": "Разрешение Ctrl",
|
||||
"settings.ctrl_size.desc": "Разрешение сетки привязки при удерживании Ctrl",
|
||||
"settings.negative_size": "Отрицательный размер",
|
||||
"settings.negative_size.desc": "Разрешить использование отрицательных размеров",
|
||||
"settings.dialog_unsaved_textures": "Несохранённые текстуры",
|
||||
"settings.dialog_unsaved_textures.desc": "Показывать окно «Несохранённые текстуры»",
|
||||
"settings.dialog_larger_cubes": "Модель слишком большая",
|
||||
"settings.dialog_larger_cubes.desc": "Показывать диалог \"Модель слишком большая\"",
|
||||
"settings.dialog_rotation_limit": "Лимиты вращения",
|
||||
"settings.dialog_rotation_limit.desc": "Показывать диалог \"Лимиты вращения\"",
|
||||
"settings.minifiedout": "Сокращенное экспортирование",
|
||||
"settings.minifiedout.desc": "Писать файл JSON в одну строку",
|
||||
"settings.export_groups": "Экспортировать группы",
|
||||
"settings.export_groups.desc": "Сохранять группы в файлах моделей",
|
||||
"settings.obj_textures": "Экспортировать текстуры",
|
||||
"settings.obj_textures.desc": "Экспортировать текстуры для модель OBJ",
|
||||
"settings.dialog_larger_cubes.desc": "Показывать окно «Модель слишком большая»",
|
||||
"settings.dialog_rotation_limit": "Ограничение поворота",
|
||||
"settings.dialog_rotation_limit.desc": "Показывать окно «Ограничение поворота»",
|
||||
"settings.minifiedout": "Минимизированный экспорт",
|
||||
"settings.minifiedout.desc": "Записывать JSON-файл в одну строку",
|
||||
"settings.export_groups": "Экспорт групп",
|
||||
"settings.export_groups.desc": "Сохранять группы в файл модели",
|
||||
"settings.obj_textures": "Экспорт текстур",
|
||||
"settings.obj_textures.desc": "Экспортировать текстуры при экспорте OBJ-файла",
|
||||
"settings.credit": "Комментарий создателя",
|
||||
"settings.credit.desc": "Добавлять комментарий создателя к экспортированным файлам",
|
||||
"settings.credit.desc": "Комментарий создателя к экспортированным файлам",
|
||||
"settings.default_path": "Путь по умолчанию",
|
||||
"settings.default_path.desc": "Папка из которой Blockbench загружает текстуры по умолчанию",
|
||||
"settings.default_path.desc": "Папка, из которой загружаются стандартные текстуры",
|
||||
"settings.image_editor": "Редактор изображений",
|
||||
"settings.image_editor.desc": "Редактор изображений по умолчанию для редактирования текстур",
|
||||
"settings.image_editor.desc": "Редактор изображений для изменения текстур",
|
||||
"category.navigate": "Навигация",
|
||||
"category.tools": "Инструменты",
|
||||
"category.file": "Файл",
|
||||
"category.blockbench": "Blockbench",
|
||||
"category.edit": "Изменить",
|
||||
"category.edit": "Редактирование",
|
||||
"category.transform": "Трансформация",
|
||||
"category.filter": "Фильтр",
|
||||
"category.view": "Вид",
|
||||
"category.display": "Настройки дисплея",
|
||||
"category.display": "Настройки отображения",
|
||||
"category.textures": "Текстуры",
|
||||
"category.misc": "Разное",
|
||||
"keybind.preview_select": "Выбрать",
|
||||
"keybind.preview_rotate": "Крутить вид",
|
||||
"keybind.preview_drag": "Переместить вид",
|
||||
"keybind.preview_select": "Выделить элемент",
|
||||
"keybind.preview_rotate": "Вращать вид",
|
||||
"keybind.preview_drag": "Перетащить вид",
|
||||
"keybind.confirm": "Подтвердить",
|
||||
"keybind.cancel": "Отменить",
|
||||
"action.slider_pos_x": "Сдвинуть на оси X",
|
||||
"action.slider_pos_x.desc": "Сдвинуть кубы на оси X",
|
||||
"action.slider_pos_y": "Сдвинуть на оси Y",
|
||||
"action.slider_pos_y.desc": "Сдвинуть кубы на оси Y",
|
||||
"action.slider_pos_z": "Сдвинуть на оси Z",
|
||||
"action.slider_pos_z.desc": "Сдвинуть кубы на оси Z",
|
||||
"action.slider_size_x": "Размер на оси X",
|
||||
"action.slider_size_x.desc": "Изменить размер на оси X",
|
||||
"action.slider_size_y": "Размер на оси Y",
|
||||
"action.slider_size_y.desc": "Изменить размер на оси Y",
|
||||
"action.slider_size_z": "Размер на оси Z",
|
||||
"action.slider_size_z.desc": "Изменить размер на оси Z",
|
||||
"action.slider_pos_x": "Смещение X",
|
||||
"action.slider_pos_x.desc": "Смещение кубов по оси X",
|
||||
"action.slider_pos_y": "Смещение Y",
|
||||
"action.slider_pos_y.desc": "Смещение кубов по оси Y",
|
||||
"action.slider_pos_z": "Смещение Z",
|
||||
"action.slider_pos_z.desc": "Смещение кубов по оси Z",
|
||||
"action.slider_size_x": "Размер X",
|
||||
"action.slider_size_x.desc": "Размер кубов на оси X",
|
||||
"action.slider_size_y": "Размер Y",
|
||||
"action.slider_size_y.desc": "Размер кубов на оси Y",
|
||||
"action.slider_size_z": "Размер Z",
|
||||
"action.slider_size_z.desc": "Размер кубов на оси Z",
|
||||
"action.slider_inflate": "Раздуть",
|
||||
"action.slider_inflate.desc": "Раздуть кубы во все направления без изменений в UV",
|
||||
"action.slider_rotation_x": "Поворот X",
|
||||
"action.slider_rotation_x.desc": "Повернуть кубы на оси X",
|
||||
"action.slider_rotation_x.desc": "Поворот кубов на оси X",
|
||||
"action.slider_rotation_y": "Поворот Y",
|
||||
"action.slider_rotation_y.desc": "Повернуть кубы на оси Y",
|
||||
"action.slider_rotation_y.desc": "Поворот кубов на оси Y",
|
||||
"action.slider_rotation_z": "Поворот Z",
|
||||
"action.slider_rotation_z.desc": "Повернуть кубы на оси Z",
|
||||
"action.slider_rotation_z.desc": "Поворот кубов на оси Z",
|
||||
"action.slider_origin_x": "Центр поворота X",
|
||||
"action.slider_origin_x.desc": "Сдвинуть центр поворота на оси X",
|
||||
"action.slider_origin_x.desc": "Смещение центра поворота по оси X",
|
||||
"action.slider_origin_y": "Центр поворота Y",
|
||||
"action.slider_origin_y.desc": "Сдвинуть центр поворота на оси Y",
|
||||
"action.slider_origin_y.desc": "Смещение центра поворота по оси Y",
|
||||
"action.slider_origin_z": "Центр поворота Z",
|
||||
"action.slider_origin_z.desc": "Сдвинуть центр поворота на оси Z",
|
||||
"action.brush_mode": "Режим",
|
||||
"action.slider_origin_z.desc": "Смещение центра поворота по оси Z",
|
||||
"action.brush_mode": "Режим кисти",
|
||||
"action.brush_mode.desc": "Режим кисти",
|
||||
"action.brush_color": "Цвет",
|
||||
"action.brush_color.desc": "Цвет кисти",
|
||||
"action.slider_brush_size": "Размер",
|
||||
"action.slider_brush_size.desc": "Радиус кисти в пикселях",
|
||||
"action.slider_brush_size.desc": "Размер кисти в пикселях",
|
||||
"action.slider_brush_opacity": "Непрозрачность",
|
||||
"action.slider_brush_opacity.desc": "Непрозрачность кисти в процентах",
|
||||
"action.slider_brush_softness": "Мягкость",
|
||||
@ -345,159 +345,159 @@
|
||||
"action.uv_slider_size_y": "Вертикальный масштаб",
|
||||
"action.uv_slider_size_y.desc": "Масштабировать UV выбранных кубов вертикально",
|
||||
"action.vertex_snap_mode": "Режим привязки",
|
||||
"action.vertex_snap_mode.desc": "Выберите если вершинная привязка должна двигать элементы или изменять их размер",
|
||||
"action.move_tool": "Двигать",
|
||||
"action.move_tool.desc": "Инструмент для выбора и движения элементов",
|
||||
"action.resize_tool": "Изменить размер",
|
||||
"action.resize_tool.desc": "Инструмент для выбора и изменения размера элементов",
|
||||
"action.vertex_snap_mode.desc": "Выбор режима привязки: перемещение элементов или изменение их размера",
|
||||
"action.move_tool": "Перемещение",
|
||||
"action.move_tool.desc": "Инструмент для выделения и перемещения элементов",
|
||||
"action.resize_tool": "Изменение размера",
|
||||
"action.resize_tool.desc": "Инструмент для выделения и изменения размера элементов",
|
||||
"action.brush_tool": "Кисть",
|
||||
"action.brush_tool.desc": "Инструмент для рисования на текстурах, на гранях кубов или в редакторе UV",
|
||||
"action.vertex_snap_tool": "Вершинная привязка",
|
||||
"action.vertex_snap_tool.desc": "Переместить один куб к другому соединяя две вершины",
|
||||
"action.display_mode_tool": "Дисплей",
|
||||
"action.display_mode_tool.desc": "Изменить вид модели в руках игроков",
|
||||
"action.swap_tools": "Поменять инструменты",
|
||||
"action.swap_tools.desc": "Переключиться между инструментами сдвига и изменения размера",
|
||||
"action.vertex_snap_tool.desc": "Перемещение одного куба к другому, соединяя две их вершины",
|
||||
"action.display_mode_tool": "Отображение",
|
||||
"action.display_mode_tool.desc": "Изменение вида модели в руках игроков",
|
||||
"action.swap_tools": "Смена инструмента",
|
||||
"action.swap_tools.desc": "Переключение между инструментом перемещения и изменения размера",
|
||||
"action.project_window": "Проект...",
|
||||
"action.project_window.desc": "Открывает окно проекта, где можно изменить метаданные Вашей модели",
|
||||
"action.project_window.desc": "Открывает окно проекта, где можно изменить метаданные модели",
|
||||
"action.new_block_model": "Новая модель",
|
||||
"action.new_block_model.desc": "Создаёт новую модель блока/вещи",
|
||||
"action.new_block_model.desc": "Создаёт новую модель блока/предмета",
|
||||
"action.new_entity_model": "Новая модель сущности",
|
||||
"action.new_entity_model.desc": "Создаёт новую модель сущности для Бедрок",
|
||||
"action.new_entity_model.desc": "Создаёт новую модель сущности (Bedrock)",
|
||||
"action.open_model": "Открыть модель",
|
||||
"action.open_model.desc": "Открыть файл модели на Вашем компьютере",
|
||||
"action.open_model.desc": "Открыть файл модели на компьютере",
|
||||
"action.add_model": "Добавить модель",
|
||||
"action.add_model.desc": "Добавить модель из файла к этой модели",
|
||||
"action.extrude_texture": "Отсканированное изображение",
|
||||
"action.extrude_texture.desc": "Сгенерировать модель выдавливая текстуру",
|
||||
"action.add_model.desc": "Добавить модель из файла к текущей модели",
|
||||
"action.extrude_texture": "Сканирование изображения",
|
||||
"action.extrude_texture.desc": "Создание модели посредством сканирования текстуры",
|
||||
"action.export_blockmodel": "Экспортировать модель блока",
|
||||
"action.export_blockmodel.desc": "Экспортировать Майнкрафт модель для вещей или блоков",
|
||||
"action.export_entity": "Экспортировать Бедрок сущность",
|
||||
"action.export_blockmodel.desc": "Экспортировать модель блока/предмета",
|
||||
"action.export_entity": "Экспортировать сущность (Bedrock)",
|
||||
"action.export_entity.desc": "Добавить текущую модель как сущность в файл mobs.json",
|
||||
"action.export_optifine_part": "Экспортировать в Optifine JPM",
|
||||
"action.export_optifine_part.desc": "Экспортировать часть сущности для Optifine",
|
||||
"action.export_optifine_full": "Экспорт в Optifine JEM",
|
||||
"action.export_optifine_full.desc": "Экспортировать полную модель для Optifine",
|
||||
"action.export_obj": "Экспорт в OBJ",
|
||||
"action.export_optifine_part": "Экспортировать в OptiFine JPM",
|
||||
"action.export_optifine_part.desc": "Экспортировать часть сущности для OptiFine",
|
||||
"action.export_optifine_full": "Экспортировать в OptiFine JEM",
|
||||
"action.export_optifine_full.desc": "Экспортировать полную модель для OptiFine",
|
||||
"action.export_obj": "Экспортировать в OBJ",
|
||||
"action.export_obj.desc": "Экспортировать модель Wavefront OBJ для использования в других программах или для загрузки на Sketchfab",
|
||||
"action.save": "Сохранить",
|
||||
"action.save.desc": "Сохранить текущие модель и текстуры",
|
||||
"action.settings_window": "Настройки...",
|
||||
"action.settings_window.desc": "Открыть диалог настроек Blockbench",
|
||||
"action.settings_window.desc": "Открыть окно настроек Blockbench",
|
||||
"action.plugins_window": "Плагины...",
|
||||
"action.plugins_window.desc": "Открыть окно склада плагинов",
|
||||
"action.plugins_window.desc": "Открыть окно хранилища плагинов",
|
||||
"action.update_window": "Обновления...",
|
||||
"action.update_window.desc": "Искать обновления Blockbench",
|
||||
"action.donate": "Пожертвовать",
|
||||
"action.donate.desc": "Пожертвовать Blockbench",
|
||||
"action.reset_keybindings": "Сбросить сочетания клавиш",
|
||||
"action.reset_keybindings.desc": "Сбросить все сочетания клавиш",
|
||||
"action.import_layout": "Импортировать внешний вид",
|
||||
"action.update_window.desc": "Проверить наличие обновлений Blockbench",
|
||||
"action.donate": "Проспонсировать",
|
||||
"action.donate.desc": "Проспонсировать Blockbench",
|
||||
"action.reset_keybindings": "Сбросить управление",
|
||||
"action.reset_keybindings.desc": "Вернуть все сочетания клавиш к первоначальным",
|
||||
"action.import_layout": "Импорт внешнего вида",
|
||||
"action.import_layout.desc": "Импортировать файл внешнего вида",
|
||||
"action.export_layout": "Экспортировать внешний вид",
|
||||
"action.export_layout.desc": "Создать файл внешнего виды на основе текущих настроек",
|
||||
"action.export_layout": "Экспорт внешнего вида",
|
||||
"action.export_layout.desc": "Создать файл внешнего вида на основе текущих настроек",
|
||||
"action.reset_layout": "Сбросить внешний вид",
|
||||
"action.reset_layout.desc": "Сбросить внешний вид",
|
||||
"action.reset_layout.desc": "Вернуть внешний вид к первоначальному",
|
||||
"action.load_plugin": "Загрузить плагин из файла",
|
||||
"action.load_plugin.desc": "Загрузить плагин импортируя исходный файл",
|
||||
"action.load_plugin.desc": "Загрузить плагин, импортировав файл",
|
||||
"action.reload_plugins": "Перезагрузить плагины",
|
||||
"action.reload_plugins.desc": "Перезагрузить все плагины в разработке",
|
||||
"action.uv_dialog": "Окно UV",
|
||||
"action.uv_dialog.desc": "Открыть диалог UV чтобы увидеть все грани",
|
||||
"action.uv_dialog.desc": "Окно UV со всеми гранями",
|
||||
"action.uv_dialog_full": "Полный вид",
|
||||
"action.uv_dialog_full.desc": "Открыть диалог UV для изменения одной грани в полном экране",
|
||||
"action.undo": "Отменить",
|
||||
"action.undo.desc": "Отменяет последнее изменение",
|
||||
"action.redo": "Повторить",
|
||||
"action.redo.desc": "Возвращает последнюю отмену",
|
||||
"action.uv_dialog_full.desc": "Окно UV с выбранной гранью",
|
||||
"action.undo": "Отмена",
|
||||
"action.undo.desc": "Отмена последнего действия",
|
||||
"action.redo": "Возврат",
|
||||
"action.redo.desc": "Возврат последнего отменённого действия",
|
||||
"action.copy": "Копировать",
|
||||
"action.copy.desc": "Скопировать выбранное выделение, грань или настройки дисплея",
|
||||
"action.copy.desc": "Копирование выделение, грань или настройки отображения",
|
||||
"action.paste": "Вставить",
|
||||
"action.paste.desc": "Вставить выбранное выделение, грань или настройки дисплея",
|
||||
"action.paste.desc": "Вставить выделение, грань или настройки отображения",
|
||||
"action.cut": "Вырезать",
|
||||
"action.cut.desc": "Вырезать выбранное выделение, грань или настройки дисплея",
|
||||
"action.cut.desc": "Вырезать выделение, грань или настройки отображения",
|
||||
"action.add_cube": "Добавить куб",
|
||||
"action.add_cube.desc": "Добавляет новый куб",
|
||||
"action.add_group": "Добавить группу",
|
||||
"action.add_group.desc": "Добавляет новую группу или кость",
|
||||
"action.outliner_toggle": "Больше опций",
|
||||
"action.outliner_toggle.desc": "Показывает больше опций для элементов",
|
||||
"action.outliner_toggle": "Больше настроек",
|
||||
"action.outliner_toggle.desc": "Больше настроек в списке элементов",
|
||||
"action.duplicate": "Создать копию",
|
||||
"action.duplicate.desc": "Копирует выбранные кубы или группы",
|
||||
"action.duplicate.desc": "Создаёт копию выделенных кубов или групп",
|
||||
"action.delete": "Удалить",
|
||||
"action.delete.desc": "Удаляет выбранные кубы или группы",
|
||||
"action.delete.desc": "Удаляет выделенные кубы или группы",
|
||||
"action.sort_outliner": "Сортировать элементы",
|
||||
"action.sort_outliner.desc": "Сортировать элементы в алфавитном порядке",
|
||||
"action.local_move": "Двигать относительно",
|
||||
"action.local_move.desc": "Двигать повёрнутые на собственных осях, если возможно",
|
||||
"action.local_move": "Относительное перемещение",
|
||||
"action.local_move.desc": "По возможности сделать перемещение повёрнутых элементов по своим осям",
|
||||
"action.select_window": "Выделить...",
|
||||
"action.select_window.desc": "Искать и выбрать кубы на основе их свойств",
|
||||
"action.invert_selection": "Инвертировать выбор",
|
||||
"action.invert_selection.desc": "Инвертировать текущий выбор кубов",
|
||||
"action.select_all": "Выделить все",
|
||||
"action.select_window.desc": "Выделить кубы на основе их свойств",
|
||||
"action.invert_selection": "Инвертировать выделение",
|
||||
"action.invert_selection.desc": "Инвертировать текущее выделение кубов",
|
||||
"action.select_all": "Выделить всё",
|
||||
"action.select_all.desc": "Выделить все кубы",
|
||||
"action.collapse_groups": "Спрятать содержимое групп",
|
||||
"action.collapse_groups.desc": "Спрятать содержимое всех групп",
|
||||
"action.scale": "Масштабировать...",
|
||||
"action.scale.desc": "Масштабировать выбранные кубы",
|
||||
"action.scale.desc": "Масштабировать выделенные кубы",
|
||||
"action.rotate_x_cw": "Повернуть по часовой стрелке",
|
||||
"action.rotate_x_cw.desc": "Поворачивает выбранные кубы 90° на оси X",
|
||||
"action.rotate_x_cw.desc": "Поворачивает выделенные кубы на +90° на оси X",
|
||||
"action.rotate_x_ccw": "Повернуть против часовой стрелки",
|
||||
"action.rotate_x_ccw.desc": "Поворачивает выбранные кубы -90° на оси X",
|
||||
"action.rotate_x_ccw.desc": "Поворачивает выделенные кубы на –90° на оси X",
|
||||
"action.rotate_y_cw": "Повернуть по часовой стрелке",
|
||||
"action.rotate_y_cw.desc": "Поворачивает выбранные кубы 90° на оси Y",
|
||||
"action.rotate_y_cw.desc": "Поворачивает выделенные кубы на +90° на оси Y",
|
||||
"action.rotate_y_ccw": "Повернуть против часовой стрелки",
|
||||
"action.rotate_y_ccw.desc": "Поворачивает выбранные кубы -90° на оси Y",
|
||||
"action.rotate_y_ccw.desc": "Поворачивает выделенные кубы на –90° на оси Y",
|
||||
"action.rotate_z_cw": "Повернуть по часовой стрелке",
|
||||
"action.rotate_z_cw.desc": "Поворачивает выбранные кубы 90° на оси Z",
|
||||
"action.rotate_z_cw.desc": "Поворачивает выделенные кубы на +90° на оси Z",
|
||||
"action.rotate_z_ccw": "Повернуть против часовой стрелки",
|
||||
"action.rotate_z_ccw.desc": "Поворачивает выбранные кубы -90° на оси Z",
|
||||
"action.rotate_z_ccw.desc": "Поворачивает выделенные кубы на –90° на оси Z",
|
||||
"action.flip_x": "Перевернуть на оси X",
|
||||
"action.flip_x.desc": "Перевернуть выбранные кубы на оси X",
|
||||
"action.flip_x.desc": "Перевернуть выделенные кубы на оси X",
|
||||
"action.flip_y": "Перевернуть на оси Y",
|
||||
"action.flip_y.desc": "Перевернуть выбранные кубы на оси Y",
|
||||
"action.flip_y.desc": "Перевернуть выделенные кубы на оси Y",
|
||||
"action.flip_z": "Перевернуть на оси Z",
|
||||
"action.flip_z.desc": "Перевернуть выбранные кубы на оси Z",
|
||||
"action.flip_z.desc": "Перевернуть выделенные кубы на оси Z",
|
||||
"action.center_x": "Центрировать на оси X",
|
||||
"action.center_x.desc": "Центрировать выбранные кубы на оси X",
|
||||
"action.center_x.desc": "Центрировать выделенные кубы на оси X",
|
||||
"action.center_y": "Центрировать на оси Y",
|
||||
"action.center_y.desc": "Центрировать выбранные кубы на оси Y",
|
||||
"action.center_y.desc": "Центрировать выделенные кубы на оси Y",
|
||||
"action.center_z": "Центрировать на оси Z",
|
||||
"action.center_z.desc": "Центрировать выбранные кубы на оси Z",
|
||||
"action.center_z.desc": "Центрировать выделенные кубы на оси Z",
|
||||
"action.center_all": "Центрировать на всех осях",
|
||||
"action.center_all.desc": "Центрировать выбранные кубы",
|
||||
"action.center_all.desc": "Центрировать выделенные кубы",
|
||||
"action.toggle_visibility": "Переключить видимость",
|
||||
"action.toggle_visibility.desc": "Переключить видимость выбранных кубов",
|
||||
"action.toggle_visibility.desc": "Переключить видимость выделенных кубов",
|
||||
"action.toggle_export": "Переключить экспорт",
|
||||
"action.toggle_export.desc": "Переключить экспортирование выбранных кубов",
|
||||
"action.toggle_export.desc": "Переключить экспорт выделенных кубов",
|
||||
"action.toggle_autouv": "Переключить авто UV",
|
||||
"action.toggle_autouv.desc": "Переключить настройку авто-UV выбранных кубов",
|
||||
"action.toggle_autouv.desc": "Переключить настройку авто UV выделенных кубов",
|
||||
"action.toggle_shade": "Переключить тени",
|
||||
"action.toggle_shade.desc": "Переключить тени выбранных кубов",
|
||||
"action.toggle_shade.desc": "Переключить тени выделенных кубов",
|
||||
"action.rename": "Переименовать",
|
||||
"action.rename.desc": "Переименовать выбранные кубы",
|
||||
"action.rename.desc": "Переименовать выделенные кубы",
|
||||
"action.add_display_preset": "Новый шаблон",
|
||||
"action.add_display_preset.desc": "Добавить новый шаблон настроек предпросмотра",
|
||||
"action.add_display_preset.desc": "Создать шаблон настроек отображения",
|
||||
"action.fullscreen": "Полный экран",
|
||||
"action.fullscreen.desc": "Переключает полноэкранный режим",
|
||||
"action.fullscreen.desc": "Включает/Выключает полноэкранный режим.",
|
||||
"action.zoom_in": "Увеличить",
|
||||
"action.zoom_in.desc": "Увеличить для увеличения масштаба интерфейса",
|
||||
"action.zoom_out": "Уменшить",
|
||||
"action.zoom_out.desc": "Уменшить для уменшения масштаба интерфейса",
|
||||
"action.zoom_reset": "Сбросить зум",
|
||||
"action.zoom_reset.desc": "Сбросить зум к 100%.",
|
||||
"action.zoom_in.desc": "Увеличить масштаб интерфейса",
|
||||
"action.zoom_out": "Уменьшить",
|
||||
"action.zoom_out.desc": "Уменьшить масштаб интерфейса",
|
||||
"action.zoom_reset": "Сбросить масштаб",
|
||||
"action.zoom_reset.desc": "Сбросить масштаб к 100%.",
|
||||
"action.reset_interface": "Сбросить интерфейс",
|
||||
"action.reset_interface.desc": "Сбросить размер и позиции ГПИ",
|
||||
"action.toggle_wireframe": "Переключить каркасные",
|
||||
"action.toggle_wireframe.desc": "Переключить режим каркасных",
|
||||
"action.screenshot_model": "Снимок модели",
|
||||
"action.screenshot_model.desc": "Сделать вырезанный снимок модели с текущего вида",
|
||||
"action.screenshot_app": "Снимок приложения",
|
||||
"action.screenshot_app.desc": "Сделать снимок экрана всего приложения",
|
||||
"action.toggle_quad_view": "Переключить режим четырёх видов",
|
||||
"action.reset_interface.desc": "Сбросить размер и позиции интерфейса",
|
||||
"action.toggle_wireframe": "Каркас",
|
||||
"action.toggle_wireframe.desc": "Переключить режим отображения каркаса",
|
||||
"action.screenshot_model": "Скриншот модели",
|
||||
"action.screenshot_model.desc": "Сделать скриншот модели с текущего ракурса",
|
||||
"action.screenshot_app": "Скриншот приложения",
|
||||
"action.screenshot_app.desc": "Сделать скриншот экрана всего приложения",
|
||||
"action.toggle_quad_view": "Режим четырёх видов",
|
||||
"action.toggle_quad_view.desc": "Переключить режим четырёх видов",
|
||||
"action.import_texture": "Импортировать текстуру",
|
||||
"action.import_texture.desc": "Импортировать одну или больше текстур из Вашей файловой системы.",
|
||||
"action.import_texture": "Импорт текстур",
|
||||
"action.import_texture.desc": "Импортировать текстуры из файловой системы.",
|
||||
"action.create_texture": "Создать текстуру",
|
||||
"action.create_texture.desc": "Создать пустую или шаблонную текстуру",
|
||||
"action.reload_textures": "Перезагрузить текстуры",
|
||||
@ -505,7 +505,7 @@
|
||||
"action.save_textures": "Сохранить текстуры",
|
||||
"action.save_textures.desc": "Сохранить все несохранённые текстуры",
|
||||
"action.animated_textures": "Проигрывать анимированные текстуры",
|
||||
"action.animated_textures.desc": "Проигрывать превью анимированных текстур",
|
||||
"action.animated_textures.desc": "Проигрывать анимацию текстур",
|
||||
"action.origin_to_geometry": "Центр поворота к геометрии",
|
||||
"action.origin_to_geometry.desc": "Установить центр поворота в центр геометрии",
|
||||
"action.rescale_toggle": "Переключить масштабирование",
|
||||
@ -515,10 +515,10 @@
|
||||
"action.reload": "Перезагрузить Blockbench",
|
||||
"action.reload.desc": "Перезагрузить Blockbench. Это удалит весь несохранённый прогресс.",
|
||||
"menu.file": "Файл",
|
||||
"menu.edit": "Изменить",
|
||||
"menu.transform": "Трансформировать",
|
||||
"menu.edit": "Редактирование",
|
||||
"menu.transform": "Трансформация",
|
||||
"menu.filter": "Фильтр",
|
||||
"menu.display": "Дисплей",
|
||||
"menu.display": "Отображение",
|
||||
"menu.view": "Вид",
|
||||
"menu.file.new": "Новый",
|
||||
"menu.file.recent": "Недавние",
|
||||
@ -527,31 +527,31 @@
|
||||
"menu.transform.rotate": "Повернуть",
|
||||
"menu.transform.flip": "Перевернуть",
|
||||
"menu.transform.center": "Центрировать",
|
||||
"menu.transform.properties": "Опции",
|
||||
"menu.transform.properties": "Свойства",
|
||||
"menu.display.preset": "Применить шаблон",
|
||||
"menu.display.preset_all": "Применить шаблон везде",
|
||||
"menu.display.remove_preset": "Удалить шаблон",
|
||||
"menu.view.zoom": "Зум",
|
||||
"menu.view.zoom": "Масштаб интерфейса",
|
||||
"menu.view.background": "Фон",
|
||||
"menu.view.screenshot": "Снимок экрана",
|
||||
"menu.view.screenshot": "Скриншот",
|
||||
"menu.cube.duplicate": "Создать копию",
|
||||
"menu.cube.color": "Цвет маркера",
|
||||
"menu.cube.color": "Цвет куба",
|
||||
"menu.cube.texture": "Текстура",
|
||||
"menu.cube.texture.transparent": "Прозрачная",
|
||||
"menu.cube.texture.blank": "Пустая",
|
||||
"menu.group.duplicate": "Создать копию",
|
||||
"menu.group.sort": "Сортировать",
|
||||
"menu.group.resolve": "Освободить",
|
||||
"menu.group.resolve": "Разгруппировать",
|
||||
"menu.texture.face": "Применить к грани",
|
||||
"menu.texture.cube": "Применить к кубам",
|
||||
"menu.texture.file": "Файл",
|
||||
"menu.texture.refresh": "Обновить",
|
||||
"menu.texture.change": "Изменить файл",
|
||||
"menu.texture.change": "Заменить файл",
|
||||
"menu.texture.folder": "Открыть в папке",
|
||||
"menu.texture.edit": "Изменить",
|
||||
"menu.texture.export": "Экспортировать",
|
||||
"menu.texture.edit": "Редактировать",
|
||||
"menu.texture.export": "Сохранить как",
|
||||
"menu.texture.save": "Сохранить",
|
||||
"menu.texture.properties": "Опции",
|
||||
"menu.texture.properties": "Свойства...",
|
||||
"menu.preview.background": "Фон",
|
||||
"menu.preview.background.load": "Загрузить",
|
||||
"menu.preview.background.position": "Позиция",
|
||||
@ -562,7 +562,7 @@
|
||||
"menu.preview.perspective.normal": "Обычная",
|
||||
"menu.preview.quadview": "Четыре вида",
|
||||
"menu.preview.fullview": "Полный вид",
|
||||
"menu.preview.stop_drag": "Остановить позиционирование фона",
|
||||
"menu.preview.stop_drag": "Закончить изменение расположения",
|
||||
"menu.uv.copy": "Копировать",
|
||||
"menu.uv.paste": "Вставить",
|
||||
"menu.uv.mapping": "UV-преобразование",
|
||||
@ -575,7 +575,6 @@
|
||||
"menu.uv.mapping.mirror_y": "Отразить ось Y",
|
||||
"menu.uv.tint": "Тон",
|
||||
"menu.uv.texture": "Текстура",
|
||||
"menu.uv.texture.transparent": "Прозрачная",
|
||||
"cube.color.light_blue": "Голубой",
|
||||
"cube.color.yellow": "Жёлтый",
|
||||
"cube.color.orange": "Оранжевый",
|
||||
@ -597,7 +596,7 @@
|
||||
"panel.options.origin": "Центр поворота",
|
||||
"uv_editor.title": "Редактор UV",
|
||||
"uv_editor.all_faces": "Все",
|
||||
"uv_editor.no_faces": "Ничто",
|
||||
"uv_editor.no_faces": "Нет",
|
||||
"face.north": "Север",
|
||||
"face.south": "Юг",
|
||||
"face.west": "Запад",
|
||||
@ -660,7 +659,6 @@
|
||||
"action.change_textures_folder": "Изменить папку текстур",
|
||||
"action.change_textures_folder.desc": "Изменить папку в которой сохранены все текстуры",
|
||||
"menu.texture.particle": "Использовать для частиц",
|
||||
"data.seperator": "Разделитель",
|
||||
"message.update_notification.title": "Доступно обновление",
|
||||
"message.update_notification.message": "Доступно обновление Blockbench \"%0\". Вы хотите установить его?",
|
||||
"message.update_notification.install": "Установить",
|
||||
@ -721,8 +719,8 @@
|
||||
"uv_editor.tint_off": "Тон выключен",
|
||||
"action.uv_apply_all": "Применить ко всем граням",
|
||||
"action.uv_apply_all.desc": "Применяет настройки текущей грани на всех гранях",
|
||||
"message.convert_mode.title": "Конвертировать модель",
|
||||
"message.convert_mode.message": "Вы действительно хотите конвертировать эту модель в %0? Вы не можете отменить это действие.",
|
||||
"message.convert_mode.title": "Конвертация модели",
|
||||
"message.convert_mode.message": "Вы действительно хотите конвертировать эту модель в %0? Это действие невозможно отменить.",
|
||||
"message.convert_mode.block": "модель сущности",
|
||||
"message.convert_mode.entity": "модель блока",
|
||||
"message.convert_mode.convert": "Конвертировать",
|
||||
@ -748,8 +746,8 @@
|
||||
"action.move_forth.desc": "Двигать выбранные кубы вперед относительно камеры",
|
||||
"action.move_back": "Двигать назад",
|
||||
"action.move_back.desc": "Двигать выбранные кубы назад относительно камеры",
|
||||
"layout.color.wireframe": "Каркасные",
|
||||
"layout.color.wireframe.desc": "Линии в каркасном режиме",
|
||||
"layout.color.wireframe": "Каркас",
|
||||
"layout.color.wireframe.desc": "Линии при отображении каркаса",
|
||||
"action.add_animation": "Добавить анимацию",
|
||||
"action.add_animation.desc": "Создать пустую анимацию",
|
||||
"action.load_animation_file": "Импортировать анимации",
|
||||
@ -792,9 +790,24 @@
|
||||
"action.slider_animation_length": "Длительность анимации",
|
||||
"action.slider_animation_length.desc": "Изменить длительность выбранной анимации",
|
||||
"menu.group.material": "Установить материал",
|
||||
"action.camera_reset": "Reset Camera",
|
||||
"action.camera_reset.desc": "Reset the current preview to the default camera angle",
|
||||
"panel.variable_placeholders": "Variable Placeholders",
|
||||
"panel.variable_placeholders.info": "List the variables you want to preview via name=value",
|
||||
"status_bar.vertex_distance": "Distance: %0"
|
||||
"action.camera_reset": "Сбросить камеру",
|
||||
"action.camera_reset.desc": "Сбросить угол камеры",
|
||||
"panel.variable_placeholders": "Заполнители переменных",
|
||||
"panel.variable_placeholders.info": "Перечислите переменные, которые вы хотите просмотреть используя имя=значение",
|
||||
"status_bar.vertex_distance": "Дистанция: %0",
|
||||
"dialog.create_gif.title": "Запись GIF",
|
||||
"dialog.create_gif.length": "Длительность (В секундах)",
|
||||
"dialog.create_gif.fps": "FPS",
|
||||
"dialog.create_gif.compression": "Сжатие",
|
||||
"dialog.create_gif.play": "Воспроизвести анимацию",
|
||||
"category.animation": "Анимация",
|
||||
"action.record_model_gif": "Записать GIF",
|
||||
"action.record_model_gif.desc": "Записать анимированное GIF изображение модели с текущего угла камеры",
|
||||
"display.mirror": "Отразить",
|
||||
"data.separator": "Разделитель",
|
||||
"message.set_background_position.title": "Позиция фона",
|
||||
"menu.preview.background.set_position": "Установить позицию",
|
||||
"dialog.toolbar_edit.hidden": "Спрятано",
|
||||
"action.export_class_entity": "Экспортировать сущность Java",
|
||||
"action.export_class_entity.desc": "Экспортировать модель сущности как класс Java"
|
||||
}
|
813
lang/sv.json
Normal file
813
lang/sv.json
Normal file
@ -0,0 +1,813 @@
|
||||
{
|
||||
"dialog.ok": "Ok",
|
||||
"dialog.cancel": "Avbryt",
|
||||
"dialog.confirm": "Bekräfta",
|
||||
"dialog.close": "Stäng",
|
||||
"dialog.import": "Importera",
|
||||
"dialog.save": "Spara",
|
||||
"dialog.discard": "Släng",
|
||||
"dialog.dontshowagain": "Visa inte igen",
|
||||
"data.cube": "Kub",
|
||||
"data.cubes": "Kuber",
|
||||
"data.group": "Grupp",
|
||||
"data.texture": "Textur",
|
||||
"data.plugin": "Plugin",
|
||||
"data.preview": "Förhansvisning",
|
||||
"data.toolbar": "Verktygsfält",
|
||||
"data.image": "Bild",
|
||||
"keys.ctrl": "Ctrl",
|
||||
"keys.shift": "Skift",
|
||||
"keys.alt": "Alt",
|
||||
"keys.meta": "Cmd",
|
||||
"keys.delete": "Radera",
|
||||
"keys.space": "Mellanslag",
|
||||
"keys.leftclick": "Vänsterklick",
|
||||
"keys.middleclick": "Mittenklick",
|
||||
"keys.rightclick": "Högerklick",
|
||||
"keys.tab": "Tab",
|
||||
"keys.backspace": "Bakslag",
|
||||
"keys.enter": "Retur",
|
||||
"keys.escape": "Escape",
|
||||
"keys.function": "F%0",
|
||||
"keys.numpad": "Knappsats %0",
|
||||
"keys.caps": "Capslock",
|
||||
"keys.menu": "Innehålls meny",
|
||||
"keys.left": "Vänster",
|
||||
"keys.up": "Upp",
|
||||
"keys.right": "Höger",
|
||||
"keys.down": "Ner",
|
||||
"keys.pageup": "Sida upp",
|
||||
"keys.pagedown": "Sida ner",
|
||||
"keys.plus": "Plus",
|
||||
"keys.comma": "Komma",
|
||||
"keys.point": "Punkt",
|
||||
"keys.minus": "Minus",
|
||||
"keys.cross": "Kryss",
|
||||
"keys.end": "Slutet",
|
||||
"keys.pos1": "Position 1",
|
||||
"keys.printscreen": "Skärmdump",
|
||||
"keys.pause": "Paus",
|
||||
"message.rotation_limit.title": "Rotationsgränser",
|
||||
"message.rotation_limit.message": "Roteringar är begränsade av Minecraft till en axel och 22.5 graders steg. Rotering av en annan axel raderar alla andra rotationer på de andra axlarna. Inaktivera alternativet \"Begränsad rotation\" om du gör modeller för andra syften och behöver fria rotationer.",
|
||||
"message.file_not_found.title": "Hittade inte filen",
|
||||
"message.file_not_found.message": "Blockbench kunde inte hitta den begärda filen. Försäkra dig att den är sparad lokalt och inte i molnet.",
|
||||
"message.screenshot.title": "Skärmbild",
|
||||
"message.screenshot.message": "Skärmbild tagen",
|
||||
"message.screenshot.clipboard": "Urklipp",
|
||||
"message.screenshot.right_click": "Skärmbild - Högerklicka för att kopiera",
|
||||
"message.invalid_file.title": "Ogiltig fil",
|
||||
"message.invalid_file.message": "Kunde inte öppna modell filen: %0",
|
||||
"message.invalid_model.title": "Ogiltig model fil",
|
||||
"message.invalid_model.message": "Filen innehåller inte giltig modellinformation",
|
||||
"message.child_model_only.title": "Tom delmodell",
|
||||
"message.child_model_only.message": "Denna filen är en delmodell av %0 och innehåller inte en modell.",
|
||||
"message.drag_background.title": "Positionera bakgrunden",
|
||||
"message.drag_background.message": "Dra bakgrunden till sin position. Håll Skift och dra upp och ner för att ändra dess storlek.",
|
||||
"message.unsaved_textures.title": "Osparade texturer",
|
||||
"message.unsaved_textures.message": "Din modell har osparade texturer. Kom ihåg att spara dem och att lägga in dem i ditt resurspaket i rätt mapp.",
|
||||
"message.model_clipping.title": "För stor modell",
|
||||
"message.model_clipping.message": "Din modell innehåller %0 kuber som är större än gränsen 3x3x3 som Minecraft tillåter.",
|
||||
"message.loose_texture.title": "Importera texturer",
|
||||
"message.loose_texture.message": "Den importerade texturen finns inte i ett resurspaket. Minecraft kan endast ladda texturer som finns inuti texturmappen i det laddade resurspaketet.",
|
||||
"message.loose_texture.change": "Ändra sökväg",
|
||||
"message.update_res.title": "Texturupplösning",
|
||||
"message.update_res.message": "Vill du uppdatera produktupplösningen till upplösningen av denna texturen? Klicka \"Avbryt\" om din textur har en större upplösning än normalt.",
|
||||
"message.update_res.update": "Uppdatera",
|
||||
"message.bedrock_overwrite_error.message": "Blockbench kan inte slå ihop denna modellen med en gammal fil",
|
||||
"message.bedrock_overwrite_error.backup_overwrite": "Gör en säkerhetskopiering och skriv över",
|
||||
"message.bedrock_overwrite_error.overwrite": "Skriv över",
|
||||
"message.close_warning.message": "Vill du spara din modell?",
|
||||
"message.close_warning.web": "Ditt nuvarande arbete kommer att försvinna. Är du säker att du vill avsluta?",
|
||||
"message.default_textures.title": "Standardtexturer",
|
||||
"message.default_textures.message": "Välj \"textur\"-mappen i standardresurspaketet",
|
||||
"message.default_textures.detail": "Extrahera standardresurspaketet från Minecraft .jar filen eller googla och ladda ner det. Lokalisera sedan \"textur\"-mappen och öppna den. Blockbench kommer ihåg den platsen och kommer att försöka hämta texturer därifrån om den inte kan hitta dem i det aktuella resurspaketet.",
|
||||
"message.default_textures.select": "Välj standard \"textur\"-mapp",
|
||||
"message.default_textures.continue": "Fortsätt",
|
||||
"message.default_textures.remove": "Ta bort",
|
||||
"message.image_editor.title": "Välj en bildredigerare",
|
||||
"message.image_editor.file": "Välj fil...",
|
||||
"message.image_editor.exe": "Välj en exekverbar bildredigerare",
|
||||
"message.display_skin.title": "Visa skinn",
|
||||
"message.display_skin.message": "Välj en skinnfil från din dator eller ange ett spelarnamn",
|
||||
"message.display_skin.upload": "Ladda upp skinn",
|
||||
"message.display_skin.name": "Användarnamn",
|
||||
"message.display_skin.reset": "Återställ",
|
||||
"message.invalid_plugin": "Ogiltig plugin fil, se konsolen",
|
||||
"message.load_plugin_app": "Vill du tillåta detta plugin att göra ändringar på din dator? Använd bara plugins från personer du litar på.",
|
||||
"message.load_plugin_web": "Vill du ladda detta plugin? Använd bara plugins från personer du litar på.",
|
||||
"message.preset_no_info": "Förinställningen innehåller ingen information för denna plats",
|
||||
"message.restart_to_update": "Starta om Blockbench för att tillämpa ändringar",
|
||||
"message.save_file": "Sparad som %0",
|
||||
"message.save_obj": "Sparad som .obj modell",
|
||||
"message.save_entity": "Sparad som Bedrock entitymodell",
|
||||
"message.rename_cubes": "Byt namn på kubern",
|
||||
"dialog.project.title": "Projekt",
|
||||
"dialog.project.name": "Filnamn",
|
||||
"dialog.project.parent": "Modermodell",
|
||||
"dialog.project.geoname": "Mob geometri namn",
|
||||
"dialog.project.openparent": "Öppna moder",
|
||||
"dialog.project.ao": "Miljöavstängning",
|
||||
"dialog.project.texture_size": "Texturstorlek",
|
||||
"dialog.project.width": "Bredd",
|
||||
"dialog.project.height": "Höjd",
|
||||
"dialog.project.to_blockmodel": "Till blockmodell",
|
||||
"dialog.project.to_entitymodel": "Till entitymodell",
|
||||
"dialog.texture.title": "Textur",
|
||||
"dialog.texture.name": "Namn",
|
||||
"dialog.texture.variable": "Variabel",
|
||||
"dialog.texture.namespace": "Namnrymd",
|
||||
"dialog.texture.folder": "Mapp",
|
||||
"dialog.extrude.title": "Ta bort bild",
|
||||
"dialog.extrude.mode": "Skanningsläge",
|
||||
"dialog.extrude.mode.areas": "Områden",
|
||||
"dialog.extrude.mode.lines": "Linjer",
|
||||
"dialog.extrude.mode.columns": "Kolumner",
|
||||
"dialog.extrude.mode.pixels": "Pixlar",
|
||||
"dialog.extrude.opacity": "Minsta opacitet",
|
||||
"dialog.extrude.scan": "Skanna och importera",
|
||||
"dialog.display_preset.title": "Skapa förinställning",
|
||||
"dialog.display_preset.message": "Välj platserna som du vill spara",
|
||||
"dialog.display_preset.create": "Skapa",
|
||||
"dialog.select.title": "Välj",
|
||||
"dialog.select.new": "Nytt urval",
|
||||
"dialog.select.group": "I vald grupp",
|
||||
"dialog.select.name": "Namnet inehåller",
|
||||
"dialog.select.random": "Slumpmässigt",
|
||||
"dialog.select.select": "Välj",
|
||||
"dialog.scale.title": "Skala modellen",
|
||||
"dialog.scale.axis": "Axel",
|
||||
"dialog.scale.scale": "Skala",
|
||||
"dialog.scale.clipping": "Modellklippning: Din modell är för stor för kanvasen",
|
||||
"dialog.scale.confirm": "Skala",
|
||||
"dialog.plugins.title": "Plugin",
|
||||
"dialog.plugins.installed": "Installerade",
|
||||
"dialog.plugins.available": "Tillgängliga",
|
||||
"dialog.plugins.install": "Installera",
|
||||
"dialog.plugins.uninstall": "Avinstallera",
|
||||
"dialog.plugins.reload": "Ladda om",
|
||||
"dialog.plugins.none_installed": "Inga installerade plugins",
|
||||
"dialog.plugins.none_available": "Inga tillgängliga plugins",
|
||||
"dialog.plugins.outdated": "Kräver en nyare version av Blockbench",
|
||||
"dialog.plugins.web_only": "Endast för webappen",
|
||||
"dialog.plugins.app_only": "Endast för skrivbordsappen",
|
||||
"dialog.plugins.author": "av %0",
|
||||
"dialog.plugins.show_less": "Visa mindre",
|
||||
"dialog.entitylist.title": "Öppna entitymodell",
|
||||
"dialog.entitylist.text": "Välj modellen du vill importera",
|
||||
"dialog.entitylist.bones": "Ben",
|
||||
"dialog.entitylist.cubes": "Kuber",
|
||||
"dialog.create_texture.title": "Skapa textur",
|
||||
"dialog.create_texture.name": "Namn",
|
||||
"dialog.create_texture.folder": "Mapp",
|
||||
"dialog.create_texture.template": "Mall",
|
||||
"dialog.create_texture.resolution": "Upplösning",
|
||||
"dialog.input.title": "Inmatning",
|
||||
"dialog.update.title": "Uppdateringar",
|
||||
"dialog.update.refresh": "Försök igen",
|
||||
"dialog.update.up_to_date": "Blockbench är uppdaterad!",
|
||||
"dialog.update.connecting": "Ansluter till servern",
|
||||
"dialog.settings.settings": "Inställningar",
|
||||
"dialog.settings.keybinds": "Tangentbindningar",
|
||||
"dialog.settings.layout": "Layout",
|
||||
"dialog.settings.about": "Om",
|
||||
"layout.color.back": "Tillbaka",
|
||||
"layout.color.back.desc": "Bakgrund och inmatningsfält",
|
||||
"layout.color.dark": "Mörkt",
|
||||
"layout.color.dark.desc": "Kanvasbakgrund",
|
||||
"layout.color.ui": "Användargränssnitt",
|
||||
"layout.color.ui.desc": "Huvudgränssnittets färg",
|
||||
"layout.color.bright_ui": "Ljust gränssnitt",
|
||||
"layout.color.bright_ui.desc": "Kontextmenyer och verktygstips",
|
||||
"layout.color.button": "Knapp",
|
||||
"layout.color.button.desc": "Knappar och brytare",
|
||||
"layout.color.selected": "Vald",
|
||||
"layout.color.selected.desc": "Valda flikar och objekt",
|
||||
"layout.color.border": "Kant",
|
||||
"layout.color.border.desc": "Kant för knappar och inputs",
|
||||
"layout.color.accent": "Accent",
|
||||
"layout.color.accent.desc": "Skjutreglage och andra detaljer",
|
||||
"layout.color.grid": "Rutnät",
|
||||
"layout.color.grid.desc": "3D förhandsgranskningsnät",
|
||||
"layout.color.text": "Text",
|
||||
"layout.color.text.desc": "Normal text",
|
||||
"layout.color.light": "Ljust",
|
||||
"layout.color.light.desc": "Vald text",
|
||||
"layout.color.accent_text": "Accent Text",
|
||||
"layout.color.accent_text.desc": "Text på ljust eller accentelement",
|
||||
"layout.font.main": "Huvudtypsnitt",
|
||||
"layout.font.headline": "Rubrikstypsnitt",
|
||||
"about.version": "Version:",
|
||||
"about.creator": "Skapare:",
|
||||
"about.website": "Hemsida:",
|
||||
"about.bugtracker": "Bug tracker:",
|
||||
"about.electron": "Denna appen är byggd med Electron, ett ramverk för att skapa inhemska applikationer med webbteknologi som Javascript, HTML och CSS.",
|
||||
"about.vertex_snap": "Vortex Snapping är baserat på ett plugin av SirBenet",
|
||||
"about.icons": "Ikonpaket:",
|
||||
"about.libraries": "Bibliotek:",
|
||||
"settings.category.general": "Allmän",
|
||||
"settings.category.preview": "Förhansvisning",
|
||||
"settings.category.grid": "Rutnät",
|
||||
"settings.category.edit": "Ändra",
|
||||
"settings.category.snapping": "Snäppning",
|
||||
"settings.category.defaults": "Standarder",
|
||||
"settings.category.dialogs": "Dialoger",
|
||||
"settings.category.export": "Exportera",
|
||||
"settings.language": "Språk",
|
||||
"settings.language.desc": "Gränssnittsspråk. Starta om Bockbench för att tillämpa ändringar.",
|
||||
"settings.show_actions": "Visningsåtgärder",
|
||||
"settings.show_actions.desc": "Visa varje åtgärd i statusfältet",
|
||||
"settings.backup_interval": "Säkerhetskopierings intervall",
|
||||
"settings.backup_interval.desc": "Intervall av den automatiska säkerhetskopieringen i minuter",
|
||||
"settings.origin_size": "Rotations ursprung",
|
||||
"settings.origin_size.desc": "Storlek på rotationsursprunget",
|
||||
"settings.control_size": "Axlarnas kontroll storlek",
|
||||
"settings.control_size.desc": "Storleken på den tredje axelns kontroll verktyg",
|
||||
"settings.display_skin": "Visa skinn",
|
||||
"settings.display_skin.desc": "Skinn använt för att visa referens spelarmodellen",
|
||||
"settings.shading": "Skuggning",
|
||||
"settings.shading.desc": "Aktivera skuggning",
|
||||
"settings.transparency": "Genomskinlighet",
|
||||
"settings.transparency.desc": "Rendera genomskinliga texturer genomskinliga",
|
||||
"settings.texture_fps": "Animerad textur FPS",
|
||||
"settings.texture_fps.desc": "Bilder per sekund för animerade texturer",
|
||||
"settings.base_grid": "Litet rutnät",
|
||||
"settings.base_grid.desc": "Visa litet rutnät och axlar",
|
||||
"settings.large_grid": "Stort rutnät",
|
||||
"settings.large_grid.desc": "Visa 3x3 block rutnät",
|
||||
"settings.full_grid": "Fullstort rutnät",
|
||||
"settings.full_grid.desc": "Visa exakt 3x3 rutnät",
|
||||
"settings.large_box": "Stor låda",
|
||||
"settings.large_box.desc": "Visa 3x3 block gränslinjer",
|
||||
"settings.display_grid": "Visningsläge",
|
||||
"settings.display_grid.desc": "Visa rutnät i visningsläget",
|
||||
"settings.undo_limit": "Ångrings gräns",
|
||||
"settings.undo_limit.desc": "Antal steg du kan ångra",
|
||||
"settings.restricted_canvas": "Begränsad kanvas",
|
||||
"settings.restricted_canvas.desc": "Begränsa kanvas till ett 3x3 blocks område för att motverka ogiltiga modeller",
|
||||
"settings.limited_rotation": "Begränsad rotation",
|
||||
"settings.limited_rotation.desc": "Begränsa rotationer till de giltiga värdena för Minecraft modeller",
|
||||
"settings.local_move": "Flytta på relativa axlar",
|
||||
"settings.local_move.desc": "Flytta roterade element på dess egna axlar om möjligt",
|
||||
"settings.canvas_unselect": "Avmarkera alla element",
|
||||
"settings.canvas_unselect.desc": "Avmarkera alla element när du klickar på kanvasbakgrunden",
|
||||
"settings.paint_side_restrict": "Begränsa pensel till sida",
|
||||
"settings.paint_side_restrict.desc": "Begränsa penslar till att bara måla på den nuvarande sidan",
|
||||
"settings.autouv": "Auto UV",
|
||||
"settings.autouv.desc": "Aktivera AutoUV som standard",
|
||||
"settings.create_rename": "Byt namn på ny kub",
|
||||
"settings.create_rename.desc": "Foksuera på namnfältet när du skapar nya element eller grupper",
|
||||
"settings.edit_size": "Rutnäts upplösning",
|
||||
"settings.edit_size.desc": "Upplösning på rutnätet som kuber kan snäppa emot",
|
||||
"settings.shift_size": "Shift upplösning",
|
||||
"settings.shift_size.desc": "Upplösning av rutnätet medan du håller ner skift",
|
||||
"settings.ctrl_size": "Kontrollupplösning",
|
||||
"settings.ctrl_size.desc": "Upplösning av rutnätet medan du håller ner ctrl",
|
||||
"settings.negative_size": "Negativ storlek",
|
||||
"settings.negative_size.desc": "Tillåt skalningsverktyget att använda negativa storlekar",
|
||||
"settings.dialog_unsaved_textures": "Osparade texturer",
|
||||
"settings.dialog_unsaved_textures.desc": "Visa \"Osparade texturer\" dialogrutan",
|
||||
"settings.dialog_larger_cubes": "För stor modell",
|
||||
"settings.dialog_larger_cubes.desc": "Visa \"För stor modell\" dialogrutan",
|
||||
"settings.dialog_rotation_limit": "Rotations begränsningar",
|
||||
"settings.dialog_rotation_limit.desc": "Visa \"Rotations begränsningar\" dialogrutan",
|
||||
"settings.minifiedout": "Förminskad export",
|
||||
"settings.minifiedout.desc": "Skriv JSON filer på en rad",
|
||||
"settings.export_groups": "Exportera grupper",
|
||||
"settings.export_groups.desc": "Spara grupper i blockmodell filerna",
|
||||
"settings.obj_textures": "Exportera textruer",
|
||||
"settings.obj_textures.desc": "Exportera texturer vid export av OBJ filer",
|
||||
"settings.credit": "Medverkande kommentar",
|
||||
"settings.credit.desc": "Lägg till medverkande kommentar till exporterade filer",
|
||||
"settings.default_path": "Standard sökväg",
|
||||
"settings.default_path.desc": "Mapp där Blockbench laddar standardtexturer",
|
||||
"settings.image_editor": "Bildredigerare",
|
||||
"settings.image_editor.desc": "Standard bildredigerare att redigera texturer med",
|
||||
"category.navigate": "Navigering",
|
||||
"category.tools": "Verktyg",
|
||||
"category.file": "Fil",
|
||||
"category.blockbench": "Blockbench",
|
||||
"category.edit": "Ändra",
|
||||
"category.transform": "Omvandla",
|
||||
"category.filter": "Filter",
|
||||
"category.view": "Visa",
|
||||
"category.display": "Skärminställningar",
|
||||
"category.textures": "Texturer",
|
||||
"category.misc": "Diverse",
|
||||
"keybind.preview_select": "Välj",
|
||||
"keybind.preview_rotate": "Rotera vy",
|
||||
"keybind.preview_drag": "Dra vy",
|
||||
"keybind.confirm": "Tillämpa",
|
||||
"keybind.cancel": "Avbryt",
|
||||
"action.slider_pos_x": "Flytta X",
|
||||
"action.slider_pos_x.desc": "Flytta kuber på X axeln",
|
||||
"action.slider_pos_y": "Flytta Y",
|
||||
"action.slider_pos_y.desc": "Flytta kuber på Y axeln",
|
||||
"action.slider_pos_z": "Flytta Z",
|
||||
"action.slider_pos_z.desc": "Flytta kuber på Z axeln",
|
||||
"action.slider_size_x": "Storlek X",
|
||||
"action.slider_size_x.desc": "Ändra storlek på kuber på X axeln",
|
||||
"action.slider_size_y": "Storlek Y",
|
||||
"action.slider_size_y.desc": "Ändra storlek på kuber på Y axeln",
|
||||
"action.slider_size_z": "Storlek Z",
|
||||
"action.slider_size_z.desc": "Ändra storlek på kuber på X axeln",
|
||||
"action.slider_inflate": "Blåsa upp",
|
||||
"action.slider_inflate.desc": "Blås upp kuber i alla riktningar utan att ändra UV.",
|
||||
"action.slider_rotation_x": "Rotera X",
|
||||
"action.slider_rotation_x.desc": "Rotera kuber på X axeln",
|
||||
"action.slider_rotation_y": "Rotera Y",
|
||||
"action.slider_rotation_y.desc": "Rotera kuber på Y axeln",
|
||||
"action.slider_rotation_z": "Rotera Z",
|
||||
"action.slider_rotation_z.desc": "Rotera kuber på Z axeln",
|
||||
"action.slider_origin_x": "Ursprung X",
|
||||
"action.slider_origin_x.desc": "Flytta ursprunget på X axeln",
|
||||
"action.slider_origin_y": "Ursprung Y",
|
||||
"action.slider_origin_y.desc": "Flytta ursprunget på Y axeln",
|
||||
"action.slider_origin_z": "Ursprung Z",
|
||||
"action.slider_origin_z.desc": "Flytta ursprunget på Z axeln",
|
||||
"action.brush_mode": "Penselläge",
|
||||
"action.brush_mode.desc": "Penselns läge",
|
||||
"action.brush_color": "Färg",
|
||||
"action.brush_color.desc": "Färg på penseln",
|
||||
"action.slider_brush_size": "Storlek",
|
||||
"action.slider_brush_size.desc": "Penselns radie i pixlar",
|
||||
"action.slider_brush_opacity": "Opacitet",
|
||||
"action.slider_brush_opacity.desc": "Penselns opacitet i procent",
|
||||
"action.slider_brush_softness": "Mjukhet",
|
||||
"action.slider_brush_softness.desc": "Penselns mjukhet i procent",
|
||||
"action.background_color": "Bakgrundsfärg",
|
||||
"action.background_color.desc": "Bakgrundsfärg på den skapade texturen",
|
||||
"action.uv_slider_pos_x": "Flytta horisontellt",
|
||||
"action.uv_slider_pos_x.desc": "Flytta UV-valet av alla valda kuber horisontellt",
|
||||
"action.uv_slider_pos_y": "Flytta vertikalt",
|
||||
"action.uv_slider_pos_y.desc": "Flytta UV-valet av alla valda kuber vertikalt",
|
||||
"action.uv_slider_size_x": "Skala horisontellt",
|
||||
"action.uv_slider_size_x.desc": "Skala UV-valet av alla valda kuber horisontellt",
|
||||
"action.uv_slider_size_y": "Skala vertikalt",
|
||||
"action.uv_slider_size_y.desc": "Skala UV-valet av alla valda kuber vertikalt",
|
||||
"action.vertex_snap_mode": "Snäppläge",
|
||||
"action.vertex_snap_mode.desc": "Välj om Vertex Snap flyttar element till det valda läget eller ändrar dem",
|
||||
"action.move_tool": "Flytta",
|
||||
"action.move_tool.desc": "Verktyg för att flytta element",
|
||||
"action.resize_tool": "Ändra storlek",
|
||||
"action.resize_tool.desc": "Verktyg för att ändra storlek på element",
|
||||
"action.brush_tool": "Målarpensel",
|
||||
"action.brush_tool.desc": "Verktyg att måla på bitmaptexturer på ytor eller UV-redigeraren.",
|
||||
"action.vertex_snap_tool": "Vortex Snap",
|
||||
"action.vertex_snap_tool.desc": "Flytta en kub till en annan kub genom att koppla samman två hörn.",
|
||||
"action.display_mode_tool": "Visa",
|
||||
"action.display_mode_tool.desc": "Ändra hur modellen ser ut när den hålls utav spelare",
|
||||
"action.swap_tools": "Byt verktyg",
|
||||
"action.swap_tools.desc": "Växla mellan flytt och storleks verktygen",
|
||||
"action.project_window": "Projekt...",
|
||||
"action.project_window.desc": "Öppnar projektfönstret, där du kan ändra metadata för din modell",
|
||||
"action.new_block_model": "Ny modell",
|
||||
"action.new_block_model.desc": "Skapar ett nytt block/objektmodell",
|
||||
"action.new_entity_model": "Ny enititymodell",
|
||||
"action.new_entity_model.desc": "Skapar en ny Bedrock enititymodell",
|
||||
"action.open_model": "Öppna modell",
|
||||
"action.open_model.desc": "Öppna en modellfil från din dator.",
|
||||
"action.add_model": "Lägg till modell",
|
||||
"action.add_model.desc": "Lägg till en modell från en fil till den nuvarande modellen",
|
||||
"action.extrude_texture": "Extruderad textur",
|
||||
"action.extrude_texture.desc": "Generera en modell genom att sträcka ut en textur",
|
||||
"action.export_blockmodel": "Exportera blockmodell",
|
||||
"action.export_blockmodel.desc": "Exportera ett Minecraft block eller objekt modell",
|
||||
"action.export_entity": "Exportera Bedrock entity",
|
||||
"action.export_entity.desc": "Lägg till den nuvarande modellen som en entity till en mob.json fil",
|
||||
"action.export_optifine_part": "Exportera OptiFine JPM",
|
||||
"action.export_optifine_part.desc": "Exportera en entitydelmodell för OptiFine",
|
||||
"action.export_optifine_full": "Exportera OptiFine JEM",
|
||||
"action.export_optifine_full.desc": "Exportera en hel OptiFine enititymodell",
|
||||
"action.export_obj": "Exportera OBJ modell",
|
||||
"action.export_obj.desc": "Exportera en Wavefront OBJ modell för användning i andra program eller för att ladda upp till Sketchfab",
|
||||
"action.save": "Spara",
|
||||
"action.save.desc": "Spara nuvarande modell och texturer",
|
||||
"action.settings_window": "Inställningar...",
|
||||
"action.settings_window.desc": "Öppna Blockbenchs inställningsdialogruta.",
|
||||
"action.plugins_window": "Plugins...",
|
||||
"action.plugins_window.desc": "Öppna pluginaffärfönstret",
|
||||
"action.update_window": "Uppdateringar...",
|
||||
"action.update_window.desc": "Sök efter Blockbench uppdateringar.",
|
||||
"action.donate": "Donera",
|
||||
"action.donate.desc": "Donera till Blockbench",
|
||||
"action.reset_keybindings": "Återställ tangentbindningar",
|
||||
"action.reset_keybindings.desc": "Återställ alla tangentbindningar till Blockbenchs standardtangentbindningar",
|
||||
"action.import_layout": "Importera layouter",
|
||||
"action.import_layout.desc": "Importera en layoutfil",
|
||||
"action.export_layout": "Exportera layouter",
|
||||
"action.export_layout.desc": "Skapa en layoutfil baserad på de aktuella inställningarna",
|
||||
"action.reset_layout": "Återställ layout",
|
||||
"action.reset_layout.desc": "Återställ layouten till Blockbenchs standardlayout",
|
||||
"action.load_plugin": "Ladda plugin från fil",
|
||||
"action.load_plugin.desc": "Ladda ett plugin genom att importera källfilen.",
|
||||
"action.reload_plugins": "Ladda om plugins",
|
||||
"action.reload_plugins.desc": "Ladda om alla utvecklingsplugins",
|
||||
"action.uv_dialog": "UV fönster",
|
||||
"action.uv_dialog.desc": "Öppna UV-dialogen för att se alla ytor bredvid varandra",
|
||||
"action.uv_dialog_full": "Full vy",
|
||||
"action.uv_dialog_full.desc": "Öppna UV-dialogen för att ändra en yta i helskärm",
|
||||
"action.undo": "Ångra",
|
||||
"action.undo.desc": "Ångrar den senaste ändringen",
|
||||
"action.redo": "Gör om",
|
||||
"action.redo.desc": "Gör om den senaste ångringen",
|
||||
"action.copy": "Kopiera",
|
||||
"action.copy.desc": "Kopiera det valda urvalet, yta eller bildskärmsinställningarna",
|
||||
"action.paste": "Klistra in",
|
||||
"action.paste.desc": "Klistra in det valda urvalet, yta eller bildskärmsinställningarna",
|
||||
"action.cut": "Klipp ut",
|
||||
"action.cut.desc": "Klipp ut det valda urvalet, yta eller bildskärmsinställningarna",
|
||||
"action.add_cube": "Lägg till en kub",
|
||||
"action.add_cube.desc": "Lägger till en ny kub",
|
||||
"action.add_group": "Lägg till en grupp",
|
||||
"action.add_group.desc": "Lägger till en ny grupp eller ben",
|
||||
"action.outliner_toggle": "Växla fler alternativ",
|
||||
"action.outliner_toggle.desc": "Växla knappar för mer alternativ i konturen",
|
||||
"action.duplicate": "Duplicera",
|
||||
"action.duplicate.desc": "Duplicerar de valda kuberna eller en grupp",
|
||||
"action.delete": "Radera",
|
||||
"action.delete.desc": "Raderar de valda kuberna eller en grupp",
|
||||
"action.sort_outliner": "Sortera konturer",
|
||||
"action.sort_outliner.desc": "Sortera konturen alfabetiskt",
|
||||
"action.local_move": "Flytta relativt",
|
||||
"action.local_move.desc": "Flytta roterade element på deras egna axlar om möjligt",
|
||||
"action.select_window": "Välj...",
|
||||
"action.select_window.desc": "Sök och välj kuber baserat på deras egenskaper",
|
||||
"action.invert_selection": "Invertera valet",
|
||||
"action.invert_selection.desc": "Invertera det nuvarande valet av kuber",
|
||||
"action.select_all": "Välj alla",
|
||||
"action.select_all.desc": "Välj alla kuber",
|
||||
"action.collapse_groups": "Kollapsa grupper",
|
||||
"action.collapse_groups.desc": "Kollapsa alla grupper",
|
||||
"action.scale": "Skala...",
|
||||
"action.scale.desc": "Skala valda kuber",
|
||||
"action.rotate_x_cw": "Rotera CW",
|
||||
"action.rotate_x_cw.desc": "Rotera valda kuber 90° på X axeln",
|
||||
"action.rotate_x_ccw": "Rotera Counter-CW",
|
||||
"action.rotate_x_ccw.desc": "Rotera valda kuber -90° på X axeln",
|
||||
"action.rotate_y_cw": "Rotera CW",
|
||||
"action.rotate_y_cw.desc": "Rotera valda kuber 90° på Y axeln",
|
||||
"action.rotate_y_ccw": "Rotera Counter-CW",
|
||||
"action.rotate_y_ccw.desc": "Rotera valda kuber -90° på Y axeln",
|
||||
"action.rotate_z_cw": "Rotera CW",
|
||||
"action.rotate_z_cw.desc": "Rotera valda kuber 90° på Z axeln",
|
||||
"action.rotate_z_ccw": "Rotera Counter-CW",
|
||||
"action.rotate_z_ccw.desc": "Rotera valda kuber -90° på Z axeln",
|
||||
"action.flip_x": "Vänd X",
|
||||
"action.flip_x.desc": "Vänd valda kuber på X axeln",
|
||||
"action.flip_y": "Vänd Y",
|
||||
"action.flip_y.desc": "Vänd valda kuber på Y axeln",
|
||||
"action.flip_z": "Vänd Z",
|
||||
"action.flip_z.desc": "Vänd valda kuber på Z axeln",
|
||||
"action.center_x": "Centrera X",
|
||||
"action.center_x.desc": "Centrera valda kuber på X axeln",
|
||||
"action.center_y": "Centrera Y",
|
||||
"action.center_y.desc": "Centrera valda kuber på Y axeln",
|
||||
"action.center_z": "Centrera Z",
|
||||
"action.center_z.desc": "Centrera valda kuber på Z axeln",
|
||||
"action.center_all": "Centrera alla",
|
||||
"action.center_all.desc": "Centrera valda kuber.",
|
||||
"action.toggle_visibility": "Växla synlighet",
|
||||
"action.toggle_visibility.desc": "Växla synlighet för de valda kuberna.",
|
||||
"action.toggle_export": "Växla export",
|
||||
"action.toggle_export.desc": "Växla exportinställningarna för de valda kuberna.",
|
||||
"action.toggle_autouv": "Växla Auto UV",
|
||||
"action.toggle_autouv.desc": "Växla Auto UV-inställningar för de valda kuberna.",
|
||||
"action.toggle_shade": "Växla skuggning",
|
||||
"action.toggle_shade.desc": "Växla skuggningen för de valda kuberna.",
|
||||
"action.rename": "Byt namn",
|
||||
"action.rename.desc": "Byta namn för de valda kuberna.",
|
||||
"action.add_display_preset": "Ny förinställning",
|
||||
"action.add_display_preset.desc": "Lägg till en ny förinställd skärminställning.",
|
||||
"action.fullscreen": "Helskärm",
|
||||
"action.fullscreen.desc": "Växlar helskärmsläget.",
|
||||
"action.zoom_in": "Zooma in",
|
||||
"action.zoom_in.desc": "Zooma in för att skala upp gränssnittet.",
|
||||
"action.zoom_out": "Zooma ut",
|
||||
"action.zoom_out.desc": "Zooma ut för att skala ner gränssnittet.",
|
||||
"action.zoom_reset": "Återställ zoom",
|
||||
"action.zoom_reset.desc": "Återställ zoom till 100%.",
|
||||
"action.reset_interface": "Återställ gränssnitt",
|
||||
"action.reset_interface.desc": "Återställ storlek och positioner för GUI",
|
||||
"action.toggle_wireframe": "Växla wireframe",
|
||||
"action.toggle_wireframe.desc": "Byt skärmsläge för wireframe.",
|
||||
"action.screenshot_model": "Skärmbildsmodell",
|
||||
"action.screenshot_model.desc": "Ta en klippt skärmbild av modellen från den nuvarande vinkeln.",
|
||||
"action.screenshot_app": "Skärmbildsapp",
|
||||
"action.screenshot_app.desc": "Ta en skärmbild av hela applikationen.",
|
||||
"action.toggle_quad_view": "Växla fyrvy",
|
||||
"action.toggle_quad_view.desc": "Växla till fyrvisningsläget",
|
||||
"action.import_texture": "Importera textur",
|
||||
"action.import_texture.desc": "Importera en eller fler texturer från ditt filsystem.",
|
||||
"action.create_texture": "Gör en textur",
|
||||
"action.create_texture.desc": "Skapa en tom textur eller malltextur",
|
||||
"action.reload_textures": "Ladda om texturer",
|
||||
"action.reload_textures.desc": "Ladda om alla texturer",
|
||||
"action.save_textures": "Spara texturer",
|
||||
"action.save_textures.desc": "Spara alla osparade texturer",
|
||||
"action.animated_textures": "Spela animerade texturer",
|
||||
"action.animated_textures.desc": "Spela och pausa förhandsvisningen av animerade texturer",
|
||||
"action.origin_to_geometry": "Ursprung till geometri",
|
||||
"action.origin_to_geometry.desc": "Ställ in ursprunget i mitten av geometrin",
|
||||
"action.rescale_toggle": "Växla omskalning",
|
||||
"action.rescale_toggle.desc": "Skala om alla kuber baserat på deras nuvarande position",
|
||||
"action.bone_reset_toggle": "Återställ ben",
|
||||
"action.bone_reset_toggle.desc": "Stoppa benet från att visa kuber från modermodellen",
|
||||
"action.reload": "Labba om Blockbench",
|
||||
"action.reload.desc": "Ladda om Blockbench. Detta tar bort alla osparade framsteg.",
|
||||
"menu.file": "Fil",
|
||||
"menu.edit": "Ändra",
|
||||
"menu.transform": "Transformera",
|
||||
"menu.filter": "Filter",
|
||||
"menu.display": "Visa",
|
||||
"menu.view": "Vy",
|
||||
"menu.file.new": "Ny",
|
||||
"menu.file.recent": "Nyligen",
|
||||
"menu.file.import": "Importera",
|
||||
"menu.file.export": "Exportera",
|
||||
"menu.transform.rotate": "Rotera",
|
||||
"menu.transform.flip": "Vänd",
|
||||
"menu.transform.center": "Center",
|
||||
"menu.transform.properties": "Egenskaper",
|
||||
"menu.display.preset": "Applicera förinställning",
|
||||
"menu.display.preset_all": "Applicera förinställning överallt",
|
||||
"menu.display.remove_preset": "Ta bort förinställning",
|
||||
"menu.view.zoom": "Zoom",
|
||||
"menu.view.background": "Bakgrund",
|
||||
"menu.view.screenshot": "Skärmbild",
|
||||
"menu.cube.duplicate": "Duplicera",
|
||||
"menu.cube.color": "Markör färg",
|
||||
"menu.cube.texture": "Textur",
|
||||
"menu.cube.texture.transparent": "Genomskinlig",
|
||||
"menu.cube.texture.blank": "Tom",
|
||||
"menu.group.duplicate": "Duplicera",
|
||||
"menu.group.sort": "Sortera",
|
||||
"menu.group.resolve": "Åtgärda",
|
||||
"menu.texture.face": "Tillämpa på yta",
|
||||
"menu.texture.cube": "Tillämpa på kuber",
|
||||
"menu.texture.file": "Fil",
|
||||
"menu.texture.refresh": "Ladda om",
|
||||
"menu.texture.change": "Ändra fil",
|
||||
"menu.texture.folder": "Öppna i mapp",
|
||||
"menu.texture.edit": "Ändra",
|
||||
"menu.texture.export": "Spara som",
|
||||
"menu.texture.save": "Spara",
|
||||
"menu.texture.properties": "Egenskaper",
|
||||
"menu.preview.background": "Bakgrund",
|
||||
"menu.preview.background.load": "Ladda",
|
||||
"menu.preview.background.position": "Position",
|
||||
"menu.preview.background.lock": "Lås till kamera",
|
||||
"menu.preview.background.remove": "Ta bort",
|
||||
"menu.preview.screenshot": "Skärmbild",
|
||||
"menu.preview.perspective": "Perspektiv",
|
||||
"menu.preview.perspective.normal": "Normal",
|
||||
"menu.preview.quadview": "Fyrvy",
|
||||
"menu.preview.fullview": "Fullvy",
|
||||
"menu.preview.stop_drag": "Stoppa bakgrundspositionering",
|
||||
"menu.uv.copy": "Kopiera",
|
||||
"menu.uv.paste": "Klistra in",
|
||||
"menu.uv.mapping": "UV kartläggning",
|
||||
"menu.uv.mapping.export": "Exportera",
|
||||
"menu.uv.mapping.maximize": "Maximera",
|
||||
"menu.uv.mapping.auto": "Auto UV",
|
||||
"menu.uv.mapping.rel_auto": "Rel. Auto UV",
|
||||
"menu.uv.mapping.rotation": "Rotation",
|
||||
"menu.uv.mapping.mirror_x": "Spegla X",
|
||||
"menu.uv.mapping.mirror_y": "Spegla Y",
|
||||
"menu.uv.tint": "Nyans",
|
||||
"menu.uv.texture": "Textur",
|
||||
"cube.color.light_blue": "Ljus blå",
|
||||
"cube.color.yellow": "Gul",
|
||||
"cube.color.orange": "Orange",
|
||||
"cube.color.red": "Röd",
|
||||
"cube.color.purple": "Lila",
|
||||
"cube.color.blue": "Blå",
|
||||
"cube.color.green": "Grön",
|
||||
"cube.color.lime": "Lime",
|
||||
"switches.visibility": "Synlighet",
|
||||
"switches.export": "Exportera",
|
||||
"switches.shading": "Skugga",
|
||||
"switches.autouv": "Auto UV",
|
||||
"panel.uv": "UV",
|
||||
"panel.display": "Visa",
|
||||
"panel.textures": "Texturer",
|
||||
"panel.outliner": "Konturen",
|
||||
"panel.options": "Rotation",
|
||||
"panel.options.angle": "Vinkel",
|
||||
"panel.options.origin": "Ursprung",
|
||||
"uv_editor.title": "UV redigerare",
|
||||
"uv_editor.all_faces": "Alla",
|
||||
"uv_editor.no_faces": "Ingen",
|
||||
"face.north": "Norr",
|
||||
"face.south": "Söder",
|
||||
"face.west": "Väster",
|
||||
"face.east": "Öster",
|
||||
"face.up": "Upp",
|
||||
"face.down": "Ner",
|
||||
"direction.north": "Norr",
|
||||
"direction.south": "Söder",
|
||||
"direction.west": "Väster",
|
||||
"direction.east": "Öster",
|
||||
"direction.top": "Topp",
|
||||
"direction.bottom": "Botten",
|
||||
"display.slot.third_right": "Tredje person höger",
|
||||
"display.slot.third_left": "Tredje person vänster",
|
||||
"display.slot.first_right": "Första person höger",
|
||||
"display.slot.first_left": "Första person vänster",
|
||||
"display.slot.head": "Huvud",
|
||||
"display.slot.ground": "Mark",
|
||||
"display.slot.frame": "Ram",
|
||||
"display.slot.gui": "GUI",
|
||||
"display.rotation": "Rotation",
|
||||
"display.translation": "Översättning",
|
||||
"display.scale": "Skala",
|
||||
"display.slot": "Plats",
|
||||
"display.reference": "Referensmodell",
|
||||
"display.presetname": "Namn",
|
||||
"display.reference.player": "Spelare",
|
||||
"display.reference.zombie": "Zombie",
|
||||
"display.reference.armor_stand": "Rustningsställ",
|
||||
"display.reference.baby_zombie": "Bäbis zombie",
|
||||
"display.reference.armor_stand_small": "Litet rustningsställ",
|
||||
"display.reference.monitor": "Normal",
|
||||
"display.reference.bow": "Pilbåge",
|
||||
"display.reference.block": "Block",
|
||||
"display.reference.frame": "Föremålsram",
|
||||
"display.reference.inventory_nine": "3x3",
|
||||
"display.reference.inventory_full": "Inventarium",
|
||||
"display.reference.hud": "HUD",
|
||||
"display.preset.blank_name": "Ange ett namn",
|
||||
"display.preset.item": "Standardobjekt",
|
||||
"display.preset.block": "Standard block",
|
||||
"display.preset.handheld": "Standard vapen",
|
||||
"display.preset.rod": "Standard spö",
|
||||
"dialog.continue": "Fortsätt",
|
||||
"message.square_textures": "Texturer måste vara fyrkantiga",
|
||||
"message.unsaved_texture.title": "Osparad textur",
|
||||
"message.unsaved_texture.message": "Alla osparade ändringar till denna textur kommer att försvinna. Vill du fortsätta?",
|
||||
"dialog.update.no_connection": "Ingen internetanslutning",
|
||||
"dialog.update.latest": "Senaste version",
|
||||
"dialog.update.installed": "Installerad version",
|
||||
"dialog.update.update": "Uppdatera",
|
||||
"action.brush_mode.brush": "Pensel",
|
||||
"action.brush_mode.noise": "Brus",
|
||||
"action.brush_mode.eraser": "Suddgummi",
|
||||
"action.brush_mode.fill": "Fyll",
|
||||
"action.vertex_snap_mode.move": "Flytta",
|
||||
"action.vertex_snap_mode.scale": "Skala",
|
||||
"action.open_model_folder": "Öppna modellmapp",
|
||||
"action.open_model_folder.desc": "Öppnar mappen som modellen finns i",
|
||||
"action.change_textures_folder": "Ändra texturposition",
|
||||
"action.change_textures_folder.desc": "Ändra mapp som alla texturer sparas i",
|
||||
"menu.texture.particle": "Använd för partiklar",
|
||||
"message.update_notification.title": "En uppdatering är tillgänglig ",
|
||||
"message.update_notification.message": "Den nya Blockbench versionen \"%0\" är tillgänglig. Vill du installera den nu?",
|
||||
"message.update_notification.install": "Installera",
|
||||
"message.update_notification.later": "Senare",
|
||||
"message.untextured": "Denna ytan har ingen textur",
|
||||
"dialog.toolbar_edit.title": "Anpassa verktygsfältet",
|
||||
"dialog.shift_uv.title": "Skifta UV",
|
||||
"dialog.shift_uv.message": "Ange det nummer du vill multiplicera UV offsetkoordinaterna med. Matematiska uttryck är tillåtna. Lägg till \"+\" om du vill addera det numret.",
|
||||
"dialog.shift_uv.horizontal": "Horisontellt",
|
||||
"dialog.shift_uv.vertical": "Vertikalt",
|
||||
"keybindings.reset": "Återställ",
|
||||
"keybindings.clear": "Tom",
|
||||
"action.cube_counter": "Kubräknare",
|
||||
"action.uv_rotation": "UV rotation",
|
||||
"action.uv_rotation.desc": "Rotation av UV ytan",
|
||||
"action.uv_grid": "UV rutnät",
|
||||
"action.uv_grid.desc": "Upplösningen av rutnätet som UV väljaren snäpper till",
|
||||
"action.uv_grid.auto": "Auto",
|
||||
"action.uv_grid.none": "Ingen",
|
||||
"action.uv_maximize": "Maximera UV",
|
||||
"action.uv_maximize.desc": "Ställer in UV för denna ytan till den fulla texturen",
|
||||
"action.uv_auto": "Auto UV",
|
||||
"action.uv_auto.desc": "Ställer in UV för denna ytan till den riktiga storleken av ytan",
|
||||
"action.uv_rel_auto": "Rel. Auto UV",
|
||||
"action.uv_rel_auto.desc": "Ställer in UV för denna ytan till positionen och storleken av den faktiska ytan",
|
||||
"action.uv_mirror_x": "UV spegla X",
|
||||
"action.uv_mirror_x.desc": "Speglar UV i denna ytan på X axeln",
|
||||
"action.uv_mirror_y": "UV spegla Y",
|
||||
"action.uv_mirror_y.desc": "Speglar UV i denna ytan på Y axeln",
|
||||
"action.uv_transparent": "Transparent yta",
|
||||
"action.uv_transparent.desc": "Gör den nuvarande ytan transparent",
|
||||
"action.uv_reset": "Återställ yta",
|
||||
"action.uv_reset.desc": "Återställer den nuvarande ytan",
|
||||
"action.cullface": "Cullface",
|
||||
"action.cullface.desc": "Inaktiverar rendering av denna ytan om den valda sidan av modellen är täckt",
|
||||
"action.auto_cullface": "Auto cullface",
|
||||
"action.auto_cullface.desc": "Sätter cullface för denna ytan till sig själv",
|
||||
"action.face_tint": "Nyans",
|
||||
"action.face_tint.desc": "Aktiverar nyans alternativet för den aktuella ytan",
|
||||
"action.uv_shift": "Skifta UV",
|
||||
"action.uv_shift.desc": "Skifta alla UV regioner med en bestämd mängd eller ett matematiskt uttryck",
|
||||
"menu.toolbar.edit": "Anpassa",
|
||||
"menu.toolbar.reset": "Återställ",
|
||||
"uv_editor.rotated": "Roterade",
|
||||
"uv_editor.auto_cull": "Cullface till sig själv",
|
||||
"uv_editor.copied": "Kopierade ytan",
|
||||
"uv_editor.pasted": "Klistrande in ytan",
|
||||
"uv_editor.copied_x": "Kopierade %0 ytor",
|
||||
"uv_editor.reset": "Återställ yta",
|
||||
"uv_editor.maximized": "Maximerad",
|
||||
"uv_editor.autouv": "Auto storlek",
|
||||
"uv_editor.mirrored": "Speglad",
|
||||
"uv_editor.to_all": "Applicerad på alla ytor",
|
||||
"uv_editor.transparent": "Gjord genomskinlig",
|
||||
"uv_editor.cullface_on": "Cullface på",
|
||||
"uv_editor.cullface_off": "Cullface av",
|
||||
"uv_editor.tint_on": "Nyans på",
|
||||
"uv_editor.tint_off": "Nyans av",
|
||||
"action.uv_apply_all": "Applicera på alla ytor",
|
||||
"action.uv_apply_all.desc": "Applicerar inställningarna från den nuvarande ytan till alla ytor",
|
||||
"message.convert_mode.title": "Konvertera modell",
|
||||
"message.convert_mode.message": "Är du säker att du vill konvertera denna modellen till %0? Du kan inte ångra detta steget.",
|
||||
"message.convert_mode.block": "en entitymodell",
|
||||
"message.convert_mode.entity": "en blockmodell",
|
||||
"message.convert_mode.convert": "Konvertera",
|
||||
"message.image_editor_missing.title": "Standard bildredigerare",
|
||||
"message.image_editor_missing.message": "Välj den körbara filen för din bildredigerare",
|
||||
"message.image_editor_missing.detail": "Blockbench kunde inte hitta någon bildredigerare på din dator. Välj den körbara filen för din föredragna bildredigerare.",
|
||||
"action.update_autouv": "Uppdatera Auto UV",
|
||||
"action.update_autouv.desc": "Uppdatera Auto UV kartläggning för de valda kuberna",
|
||||
"category.uv": "UV",
|
||||
"status_bar.saved": "Modellen är sparad",
|
||||
"status_bar.unsaved": "Det finns osparade ändringar",
|
||||
"action.animation_mode_tool": "Animation",
|
||||
"action.animation_mode_tool.desc": "Definiera anpassade animationer för modellen",
|
||||
"action.move_up": "Flytta upp",
|
||||
"action.move_up.desc": "Flytta de valda kuberna upp relativt till den nuvarande kameravinkeln",
|
||||
"action.move_down": "Flytta ner",
|
||||
"action.move_down.desc": "Flytta de valda kuberna ner relativt till den nuvarande kameravinkeln",
|
||||
"action.move_left": "Flytta vänster",
|
||||
"action.move_left.desc": "Flytta de valda kuberna vänster relativt till den nuvarande kameravinkeln",
|
||||
"action.move_right": "Flytta höger",
|
||||
"action.move_right.desc": "Flytta de valda kuberna höger relativt till den nuvarande kameravinkeln",
|
||||
"action.move_forth": "Flytta framåt",
|
||||
"action.move_forth.desc": "Flytta de valda kuberna framåt relativt till den nuvarande kameravinkeln",
|
||||
"action.move_back": "Flytta bakåt",
|
||||
"action.move_back.desc": "Flytta de valda kuberna bakåt relativt till den nuvarande kameravinkeln",
|
||||
"layout.color.wireframe": "Wireframe",
|
||||
"layout.color.wireframe.desc": "Visa wireframe linjer",
|
||||
"action.add_animation": "Lägg till animation",
|
||||
"action.add_animation.desc": "Skapa en tom animation",
|
||||
"action.load_animation_file": "Importera animationer",
|
||||
"action.load_animation_file.desc": "Importera en animationsfil",
|
||||
"action.play_animation": "Spela animationer",
|
||||
"action.play_animation.desc": "Förhandsgranska den valda animationen",
|
||||
"action.export_animation_file": "Exportera animationer",
|
||||
"action.export_animation_file.desc": "Exportera en json fil med den nuvarande animationen",
|
||||
"action.slider_keyframe_time": "Tidskod",
|
||||
"action.slider_keyframe_time.desc": "Ändra tidskoden för de valda nyckelramarna",
|
||||
"timeline.rotation": "Rotation",
|
||||
"timeline.position": "Position",
|
||||
"timeline.scale": "Skala",
|
||||
"menu.timeline.add": "Lägg till keyframe",
|
||||
"menu.keyframe.quaternion": "Kvartärperiod",
|
||||
"panel.animations": "Animationer",
|
||||
"panel.keyframe": "Keyframe",
|
||||
"panel.keyframe.type": "Keyframe (%0)",
|
||||
"generic.delete": "Radera",
|
||||
"generic.rename": "Byt namn",
|
||||
"message.rename_animation": "Byt animationens namn",
|
||||
"message.animation_update_var": "Uppdatera animations variabel",
|
||||
"message.no_animation_selected": "Du måste välja en animation för att göra detta",
|
||||
"message.no_bone_selected": "Du måste välja ett ben för att göra detta",
|
||||
"message.duplicate_groups.title": "Ben namn dublett",
|
||||
"message.duplicate_groups.message": "Benets namn finns på flera ben. Detta kan orsaka problem.",
|
||||
"action.select_all_keyframes": "Välj alla keyframes",
|
||||
"action.select_all_keyframes.desc": "Välj alla keyframes av de nuvarande benet",
|
||||
"action.delete_keyframes": "Radera keyframes",
|
||||
"action.delete_keyframes.desc": "Radera alla valda keyframes",
|
||||
"menu.animation": "Animation",
|
||||
"menu.animation.loop": "Slinga",
|
||||
"menu.animation.override": "Åsidosätta",
|
||||
"menu.animation.anim_time_update": "Uppdatera variabel",
|
||||
"message.display_skin_model.title": "Skinnmodell",
|
||||
"message.display_skin_model.message": "Välj modell typ för ditt skinn",
|
||||
"message.display_skin_model.classic": "Klassisk",
|
||||
"message.display_skin_model.slim": "Smal",
|
||||
"message.bone_material": "Ändra ben material",
|
||||
"action.slider_animation_length": "Animationslängd",
|
||||
"action.slider_animation_length.desc": "Ändra längden av den valda animationen",
|
||||
"menu.group.material": "Ange material",
|
||||
"action.camera_reset": "Återställ kamera",
|
||||
"action.camera_reset.desc": "Återställ den aktuella förhandsvisningen till standard kameravinkeln",
|
||||
"panel.variable_placeholders": "Platshållare variabel",
|
||||
"panel.variable_placeholders.info": "Ange de variabler du vill förhandsgranska via namn=värde",
|
||||
"status_bar.vertex_distance": "Distans: %0",
|
||||
"dialog.create_gif.title": "Record GIF",
|
||||
"dialog.create_gif.length": "Length (Seconds)",
|
||||
"dialog.create_gif.fps": "FPS",
|
||||
"dialog.create_gif.compression": "Compression Amount",
|
||||
"dialog.create_gif.play": "Start Animation",
|
||||
"category.animation": "Animation",
|
||||
"action.record_model_gif": "Record GIF",
|
||||
"action.record_model_gif.desc": "Record an animated GIF of the model from the current angle",
|
||||
"display.mirror": "Mirror",
|
||||
"data.separator": "Seperator",
|
||||
"message.set_background_position.title": "Background Position",
|
||||
"menu.preview.background.set_position": "Set Position",
|
||||
"dialog.toolbar_edit.hidden": "Hidden",
|
||||
"action.export_class_entity": "Export Java Entity",
|
||||
"action.export_class_entity.desc": "Export the entity model as a Java class"
|
||||
}
|
55
lang/zh.json
55
lang/zh.json
@ -374,10 +374,10 @@
|
||||
"action.export_blockmodel.desc": "导出 Minecraft 方块或物品模型",
|
||||
"action.export_entity": "导出基岩版实体",
|
||||
"action.export_entity.desc": "将当前模型作为实体添加到 mobs.json 文件中",
|
||||
"action.export_optifine_part": "导出 Optifine JPM",
|
||||
"action.export_optifine_part.desc": "导出 Optifine 实体文件(Json Part Model)",
|
||||
"action.export_optifine_full": "导出 Optifine JEM",
|
||||
"action.export_optifine_full.desc": "导出 Optifine 实体文件(Json Entity Model)",
|
||||
"action.export_optifine_part": "导出 OptiFine JPM",
|
||||
"action.export_optifine_part.desc": "导出 OptiFine 实体文件(Json Part Model)",
|
||||
"action.export_optifine_full": "导出 OptiFine JEM",
|
||||
"action.export_optifine_full.desc": "导出 OptiFine 实体文件(Json Entity Model)",
|
||||
"action.export_obj": "导出 OBJ 模型",
|
||||
"action.export_obj.desc": "导出 Wavefront OBJ 模型以用于其他程序或上传到 Sketchfab",
|
||||
"action.save": "保存",
|
||||
@ -386,7 +386,7 @@
|
||||
"action.settings_window.desc": "打开 Blockbench 设置对话框。",
|
||||
"action.plugins_window": "插件",
|
||||
"action.plugins_window.desc": "打开插件商店页面",
|
||||
"action.update_window": "更新",
|
||||
"action.update_window": "更新...",
|
||||
"action.update_window.desc": "检查 Blockbench 更新",
|
||||
"action.donate": "赞助开发者",
|
||||
"action.donate.desc": "赞助 Blockbench",
|
||||
@ -516,9 +516,9 @@
|
||||
"action.reload.desc": "重载 Blockbench,这将删除所有未保存的进度",
|
||||
"menu.file": "文件",
|
||||
"menu.edit": "编辑",
|
||||
"menu.transform": "转换",
|
||||
"menu.filter": "过滤",
|
||||
"menu.display": "显示",
|
||||
"menu.transform": "调整",
|
||||
"menu.filter": "插件目录",
|
||||
"menu.display": "物品显示",
|
||||
"menu.view": "视图",
|
||||
"menu.file.new": "新建",
|
||||
"menu.file.recent": "最近",
|
||||
@ -531,7 +531,7 @@
|
||||
"menu.display.preset": "应用预设",
|
||||
"menu.display.preset_all": "在全局应用预设",
|
||||
"menu.display.remove_preset": "删除预设",
|
||||
"menu.view.zoom": "放大",
|
||||
"menu.view.zoom": "缩放",
|
||||
"menu.view.background": "背景",
|
||||
"menu.view.screenshot": "截图",
|
||||
"menu.cube.duplicate": "复制",
|
||||
@ -575,7 +575,6 @@
|
||||
"menu.uv.mapping.mirror_y": "镜像 Y 轴",
|
||||
"menu.uv.tint": "着色",
|
||||
"menu.uv.texture": "贴图",
|
||||
"menu.uv.texture.transparent": "透明化",
|
||||
"cube.color.light_blue": "淡蓝色",
|
||||
"cube.color.yellow": "黄色",
|
||||
"cube.color.orange": "橙色",
|
||||
@ -591,7 +590,7 @@
|
||||
"panel.uv": "UV",
|
||||
"panel.display": "显示",
|
||||
"panel.textures": "贴图",
|
||||
"panel.outliner": "大纲视图",
|
||||
"panel.outliner": "大纲",
|
||||
"panel.options": "旋转",
|
||||
"panel.options.angle": "角度",
|
||||
"panel.options.origin": "原点",
|
||||
@ -649,10 +648,10 @@
|
||||
"dialog.update.latest": "最新版本",
|
||||
"dialog.update.installed": "已安装的版本",
|
||||
"dialog.update.update": "更新",
|
||||
"action.brush_mode.brush": "刷子",
|
||||
"action.brush_mode.noise": "噪点",
|
||||
"action.brush_mode.brush": "笔刷",
|
||||
"action.brush_mode.noise": "点",
|
||||
"action.brush_mode.eraser": "橡皮擦",
|
||||
"action.brush_mode.fill": "填充",
|
||||
"action.brush_mode.fill": "油漆桶",
|
||||
"action.vertex_snap_mode.move": "移动",
|
||||
"action.vertex_snap_mode.scale": "规模",
|
||||
"action.open_model_folder": "打开模型文件夹",
|
||||
@ -660,7 +659,6 @@
|
||||
"action.change_textures_folder": "更改材质纹理位置",
|
||||
"action.change_textures_folder.desc": "更改保存所有纹理的文件夹",
|
||||
"menu.texture.particle": "使用的颗粒",
|
||||
"data.seperator": "分隔符",
|
||||
"message.update_notification.title": "有可用更新",
|
||||
"message.update_notification.message": "新的 Blockbench 版本“%0”可用。你想现在安装吗?",
|
||||
"message.update_notification.install": "安装",
|
||||
@ -781,7 +779,7 @@
|
||||
"action.delete_keyframes": "删除关键帧",
|
||||
"action.delete_keyframes.desc": "删除所有选定的关键帧",
|
||||
"menu.animation": "动画",
|
||||
"menu.animation.loop": "环?不懂怎么翻译",
|
||||
"menu.animation.loop": "环",
|
||||
"menu.animation.override": "覆盖",
|
||||
"menu.animation.anim_time_update": "更新变量",
|
||||
"message.display_skin_model.title": "皮肤模型",
|
||||
@ -792,9 +790,24 @@
|
||||
"action.slider_animation_length": "动画长度",
|
||||
"action.slider_animation_length.desc": "更改所选的动画长度",
|
||||
"menu.group.material": "设置材料",
|
||||
"action.camera_reset": "Reset Camera",
|
||||
"action.camera_reset.desc": "Reset the current preview to the default camera angle",
|
||||
"panel.variable_placeholders": "Variable Placeholders",
|
||||
"panel.variable_placeholders.info": "List the variables you want to preview via name=value",
|
||||
"status_bar.vertex_distance": "Distance: %0"
|
||||
"action.camera_reset": "重置相机位置",
|
||||
"action.camera_reset.desc": "将当前预览视角重置为默认摄像机角度",
|
||||
"panel.variable_placeholders": "变量占位符",
|
||||
"panel.variable_placeholders.info": "列出要通过 name=value 预览的变量",
|
||||
"status_bar.vertex_distance": "距离: %0",
|
||||
"dialog.create_gif.title": "Record GIF",
|
||||
"dialog.create_gif.length": "Length (Seconds)",
|
||||
"dialog.create_gif.fps": "FPS",
|
||||
"dialog.create_gif.compression": "Compression Amount",
|
||||
"dialog.create_gif.play": "Start Animation",
|
||||
"category.animation": "Animation",
|
||||
"action.record_model_gif": "Record GIF",
|
||||
"action.record_model_gif.desc": "Record an animated GIF of the model from the current angle",
|
||||
"display.mirror": "Mirror",
|
||||
"data.separator": "分隔符",
|
||||
"message.set_background_position.title": "Background Position",
|
||||
"menu.preview.background.set_position": "Set Position",
|
||||
"dialog.toolbar_edit.hidden": "Hidden",
|
||||
"action.export_class_entity": "Export Java Entity",
|
||||
"action.export_class_entity.desc": "Export the entity model as a Java class"
|
||||
}
|
3
lib/gif.js
Normal file
3
lib/gif.js
Normal file
File diff suppressed because one or more lines are too long
3
lib/gif.worker.js
Normal file
3
lib/gif.worker.js
Normal file
File diff suppressed because one or more lines are too long
@ -21405,6 +21405,10 @@
|
||||
|
||||
} catch ( error ) {
|
||||
|
||||
document.getElementById('loading_error_message').innerText = 'Failed to access WebGL. Try to update your graphics drivers or '+
|
||||
(isApp ?'use the Blockbench web-app.'
|
||||
:'your browser.')
|
||||
|
||||
console.error( 'THREE.WebGLRenderer: ' + error.message );
|
||||
|
||||
}
|
||||
|
4
main.js
4
main.js
@ -37,9 +37,9 @@ app.commandLine.appendSwitch('ignore-gpu-blacklist')
|
||||
app.on('ready', createWindow)
|
||||
|
||||
app.on('window-all-closed', () => {
|
||||
if (process.platform !== 'darwin') {
|
||||
//if (process.platform !== 'darwin') {
|
||||
app.quit()
|
||||
}
|
||||
//}
|
||||
})
|
||||
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "Blockbench",
|
||||
"description": "Minecraft Block Model Editor",
|
||||
"version": "2.1.0",
|
||||
"version": "2.2.0",
|
||||
"license": "MIT",
|
||||
"author": {
|
||||
"name": "JannisX11",
|
||||
|
Loading…
x
Reference in New Issue
Block a user