2015-12-07 21:05:27 +01:00
|
|
|
import bpy
|
|
|
|
import os
|
2016-07-19 19:42:46 +02:00
|
|
|
import assets
|
2015-12-07 21:05:27 +01:00
|
|
|
|
2016-08-12 02:29:09 +02:00
|
|
|
def add_armory_library(sdk_path, name):
|
|
|
|
return ('project.addLibrary("../' + bpy.path.relpath(sdk_path + '/' + name)[2:] + '");\n').replace('\\', '/')
|
|
|
|
|
2015-12-07 21:05:27 +01:00
|
|
|
# Write khafile.js
|
2016-02-08 17:28:05 +01:00
|
|
|
def write_khafilejs(shader_references, asset_references):
|
2016-06-30 13:22:05 +02:00
|
|
|
|
|
|
|
user_preferences = bpy.context.user_preferences
|
|
|
|
addon_prefs = user_preferences.addons['armory'].preferences
|
|
|
|
sdk_path = addon_prefs.sdk_path
|
|
|
|
|
|
|
|
# Merge duplicates and sort
|
|
|
|
shader_references = sorted(list(set(shader_references)))
|
|
|
|
asset_references = sorted(list(set(asset_references)))
|
2016-01-17 22:38:46 +01:00
|
|
|
|
2016-06-30 13:22:05 +02:00
|
|
|
with open('khafile.js', 'w') as f:
|
|
|
|
f.write(
|
2015-12-07 21:05:27 +01:00
|
|
|
"""// Auto-generated
|
2016-08-07 01:43:21 +02:00
|
|
|
let project = new Project('""" + bpy.data.worlds[0].CGProjectName + """');
|
2015-12-07 21:05:27 +01:00
|
|
|
|
|
|
|
project.addSources('Sources');
|
|
|
|
project.addShaders('Sources/Shaders/**');
|
|
|
|
project.addAssets('Assets/**');
|
|
|
|
""")
|
2016-07-19 19:42:46 +02:00
|
|
|
# project.addAssets('compiled/Assets/**');
|
|
|
|
for file in assets.assets:
|
|
|
|
f.write("project.addAssets('" + file + "');\n")
|
2016-06-30 13:22:05 +02:00
|
|
|
|
2016-08-12 02:29:09 +02:00
|
|
|
|
|
|
|
f.write(add_armory_library(sdk_path, 'armory'))
|
|
|
|
f.write(add_armory_library(sdk_path, 'iron'))
|
2016-06-30 13:22:05 +02:00
|
|
|
|
2016-07-21 11:22:34 +02:00
|
|
|
if bpy.data.worlds[0].CGPhysics != 'Disabled':
|
2016-07-22 23:25:07 +02:00
|
|
|
f.write("project.addDefine('WITH_PHYSICS');\n")
|
2016-08-12 02:29:09 +02:00
|
|
|
f.write(add_armory_library(sdk_path, 'haxebullet'))
|
2016-06-30 13:22:05 +02:00
|
|
|
|
2016-08-07 01:43:21 +02:00
|
|
|
for i in range(0, len(shader_references)): # Shaders
|
|
|
|
ref = shader_references[i]
|
|
|
|
# defs = shader_references_defs[i]
|
2016-06-30 13:22:05 +02:00
|
|
|
f.write("project.addShaders('" + ref + ".frag.glsl');\n")
|
|
|
|
f.write("project.addShaders('" + ref + ".vert.glsl');\n")
|
|
|
|
|
|
|
|
for ref in asset_references: # Assets
|
|
|
|
f.write("project.addAssets('" + ref + "');\n")
|
2015-12-07 21:05:27 +01:00
|
|
|
|
2016-07-20 17:33:17 +02:00
|
|
|
if bpy.data.worlds[0].CGPlayConsole:
|
2016-07-22 23:25:07 +02:00
|
|
|
f.write("project.addDefine('WITH_PROFILE');\n")
|
2016-08-12 02:29:09 +02:00
|
|
|
f.write(add_armory_library(sdk_path, 'zui'))
|
2016-07-21 17:45:39 +02:00
|
|
|
f.write('project.addAssets("' + sdk_path + '/armory/Assets/droid_sans.ttf");\n')
|
2016-07-20 17:33:17 +02:00
|
|
|
|
2016-08-12 02:29:09 +02:00
|
|
|
# f.write(add_armory_library(sdk_path, 'haxeui/haxeui-core'))
|
|
|
|
# f.write(add_armory_library(sdk_path, 'haxeui/haxeui-kha'))
|
|
|
|
# f.write(add_armory_library(sdk_path, 'haxeui/hscript'))
|
2016-07-24 19:15:36 +02:00
|
|
|
|
2016-07-20 17:33:17 +02:00
|
|
|
if bpy.data.worlds[0].CGMinimize == False:
|
2016-07-22 23:25:07 +02:00
|
|
|
f.write("project.addDefine('WITH_JSON');\n")
|
2016-08-07 23:12:14 +02:00
|
|
|
|
2016-08-11 22:24:45 +02:00
|
|
|
if bpy.data.worlds[0].CGDeinterleavedBuffers == True:
|
2016-08-07 23:12:14 +02:00
|
|
|
f.write("project.addDefine('WITH_DEINTERLEAVED');\n")
|
|
|
|
|
2016-07-28 13:21:27 +02:00
|
|
|
for d in assets.khafile_defs:
|
|
|
|
f.write("project.addDefine('" + d + "');\n")
|
|
|
|
|
2016-07-28 22:38:11 +02:00
|
|
|
config_text = bpy.data.worlds[0]['CGKhafile']
|
2016-06-30 13:22:05 +02:00
|
|
|
if config_text != '':
|
|
|
|
f.write(bpy.data.texts[config_text].as_string())
|
2016-01-11 13:50:54 +01:00
|
|
|
|
2016-08-04 22:38:56 +02:00
|
|
|
f.write("\n\nresolve(project);\n")
|
2016-01-11 13:07:44 +01:00
|
|
|
|
2015-12-07 21:05:27 +01:00
|
|
|
# Write Main.hx
|
|
|
|
def write_main():
|
2016-07-10 00:51:39 +02:00
|
|
|
wrd = bpy.data.worlds[0]
|
2016-06-30 13:22:05 +02:00
|
|
|
#if not os.path.isfile('Sources/Main.hx'):
|
|
|
|
with open('Sources/Main.hx', 'w') as f:
|
|
|
|
f.write(
|
2015-12-07 21:05:27 +01:00
|
|
|
"""// Auto-generated
|
|
|
|
package ;
|
|
|
|
class Main {
|
2016-07-10 00:51:39 +02:00
|
|
|
public static inline var projectName = '""" + wrd['CGProjectName'] + """';
|
|
|
|
public static inline var projectPackage = '""" + wrd['CGProjectPackage'] + """';
|
|
|
|
static inline var projectWidth = """ + str(wrd['CGProjectWidth']) + """;
|
|
|
|
static inline var projectHeight = """ + str(wrd['CGProjectHeight']) + """;
|
|
|
|
static inline var projectSamplesPerPixel = """ + str(wrd['CGProjectSamplesPerPixel']) + """;
|
|
|
|
public static inline var projectScene = '""" + str(wrd['CGProjectScene']) + """';
|
2016-06-30 13:22:05 +02:00
|
|
|
public static function main() {
|
2016-07-10 00:51:39 +02:00
|
|
|
iron.sys.CompileTime.importPackage('armory.trait');
|
|
|
|
iron.sys.CompileTime.importPackage('armory.renderpipeline');
|
|
|
|
iron.sys.CompileTime.importPackage('""" + wrd['CGProjectPackage'] + """');
|
2016-06-30 13:22:05 +02:00
|
|
|
#if (js && WITH_PHYSICS)
|
|
|
|
untyped __js__("
|
|
|
|
function loadScript(url, callback) {
|
|
|
|
var head = document.getElementsByTagName('head')[0];
|
|
|
|
var script = document.createElement('script');
|
|
|
|
script.type = 'text/javascript';
|
|
|
|
script.src = url;
|
|
|
|
script.onreadystatechange = callback;
|
|
|
|
script.onload = callback;
|
|
|
|
head.appendChild(script);
|
|
|
|
}
|
|
|
|
");
|
|
|
|
untyped loadScript('ammo.js', start);
|
|
|
|
#else
|
|
|
|
start();
|
|
|
|
#end
|
|
|
|
}
|
|
|
|
static function start() {
|
|
|
|
kha.System.init({title: projectName, width: projectWidth, height: projectHeight, samplesPerPixel: projectSamplesPerPixel}, function() {
|
2016-07-10 00:51:39 +02:00
|
|
|
new iron.App(armory.Root);
|
2016-06-30 13:22:05 +02:00
|
|
|
});
|
|
|
|
}
|
2015-12-07 21:05:27 +01:00
|
|
|
}
|
|
|
|
""")
|
2016-07-10 00:51:39 +02:00
|
|
|
|
|
|
|
# Write electron.js
|
2016-08-11 22:24:45 +02:00
|
|
|
def write_electronjs(x, y, w, h, winoff, in_viewport):
|
2016-07-10 00:51:39 +02:00
|
|
|
wrd = bpy.data.worlds[0]
|
|
|
|
dev_tools = wrd.CGPlayDeveloperTools
|
|
|
|
with open('build/electron.js', 'w') as f:
|
|
|
|
f.write(
|
|
|
|
"""// Auto-generated
|
|
|
|
'use strict';
|
|
|
|
const electron = require('electron');
|
|
|
|
const app = electron.app;
|
|
|
|
const BrowserWindow = electron.BrowserWindow;
|
|
|
|
let mainWindow;
|
|
|
|
|
|
|
|
function createWindow () { """)
|
|
|
|
|
2016-08-11 22:24:45 +02:00
|
|
|
if in_viewport:
|
2016-07-10 00:51:39 +02:00
|
|
|
f.write(
|
|
|
|
"""
|
|
|
|
var point = electron.screen.getCursorScreenPoint();
|
|
|
|
var targetDisplay = electron.screen.getDisplayNearestPoint(point);
|
|
|
|
var offY = targetDisplay.workAreaSize.height - """ + str(int(winoff)) + """;
|
|
|
|
var targetX = targetDisplay.bounds.x + """ + str(int(x)) + """;
|
|
|
|
var targetY = targetDisplay.bounds.y + """ + str(int(y)) + """ + offY;
|
|
|
|
mainWindow = new BrowserWindow({x: targetX, y: targetY, width: """ + str(int(w)) + """, height: """ + str(int(h)) + """, frame: false, autoHideMenuBar: true, useContentSize: true, movable: false, resizable: false, transparent: true, enableLargerThanScreen: true});
|
|
|
|
mainWindow.setSkipTaskbar(true);
|
|
|
|
mainWindow.setAlwaysOnTop(true);
|
2016-08-12 02:29:09 +02:00
|
|
|
//app.dock.setBadge('');
|
2016-07-10 00:51:39 +02:00
|
|
|
""")
|
|
|
|
else:
|
|
|
|
f.write(
|
|
|
|
"""
|
|
|
|
mainWindow = new BrowserWindow({width: """ + str(int(w)) + """, height: """ + str(int(h)) + """, autoHideMenuBar: true, useContentSize: true});
|
|
|
|
""")
|
|
|
|
f.write(
|
|
|
|
"""
|
2016-07-28 13:21:27 +02:00
|
|
|
mainWindow.loadURL('file://' + __dirname + '/html5/index.html');
|
|
|
|
//mainWindow.loadURL('http://localhost:8040/build/html5/index.html');
|
2016-07-10 00:51:39 +02:00
|
|
|
mainWindow.on('closed', function() { mainWindow = null; });""")
|
|
|
|
|
|
|
|
if dev_tools:
|
|
|
|
f.write("""
|
|
|
|
mainWindow.toggleDevTools();""")
|
|
|
|
|
|
|
|
f.write("""
|
|
|
|
}
|
|
|
|
app.on('ready', createWindow);
|
|
|
|
app.on('window-all-closed', function () { app.quit(); });
|
|
|
|
app.on('activate', function () { if (mainWindow === null) { createWindow(); } });
|
|
|
|
""")
|
|
|
|
|
|
|
|
# Write index.html
|
2016-08-11 22:24:45 +02:00
|
|
|
def write_indexhtml(w, h, in_viewport):
|
2016-07-10 00:51:39 +02:00
|
|
|
with open('build/html5/index.html', 'w') as f:
|
|
|
|
f.write(
|
|
|
|
"""<!DOCTYPE html>
|
|
|
|
<html>
|
|
|
|
<head>
|
|
|
|
<meta charset="utf-8"/>
|
2016-08-04 22:38:56 +02:00
|
|
|
<title>Armory</title>
|
2016-07-10 00:51:39 +02:00
|
|
|
<style>
|
|
|
|
html, body, canvas, div {
|
|
|
|
margin:0; padding: 0; width:100%; height:100%;
|
|
|
|
}
|
|
|
|
#khanvas {
|
|
|
|
display:block; border:none; outline:none;
|
|
|
|
}
|
|
|
|
</style>
|
|
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<canvas id='khanvas' width='""" + str(w) + """' height='""" + str(h) + """'></canvas>
|
|
|
|
<script src='kha.js'></script>
|
2016-08-12 15:26:56 +02:00
|
|
|
<script>document.addEventListener('keypress', e => { if (e.code == "KeyZ" && e.shiftKey) close(); });</script>
|
2016-07-10 00:51:39 +02:00
|
|
|
</body>
|
|
|
|
</html>
|
|
|
|
""")
|
|
|
|
|
|
|
|
def write_compiledglsl(clip_start, clip_end, shadowmap_size):
|
2016-07-12 00:09:02 +02:00
|
|
|
wrd = bpy.data.worlds[0]
|
2016-07-10 00:51:39 +02:00
|
|
|
with open('compiled/Shaders/compiled.glsl', 'w') as f:
|
|
|
|
f.write(
|
|
|
|
"""const float PI = 3.1415926535;
|
|
|
|
const float PI2 = PI * 2.0;
|
2016-07-17 20:29:53 +02:00
|
|
|
const vec2 cameraPlane = vec2(""" + str(round(clip_start * 100) / 100) + """, """ + str(round(clip_end * 100) / 100) + """);
|
2016-07-10 00:51:39 +02:00
|
|
|
const vec2 shadowmapSize = vec2(""" + str(shadowmap_size) + """, """ + str(shadowmap_size) + """);
|
2016-07-12 00:09:02 +02:00
|
|
|
""")
|
|
|
|
if wrd.generate_clouds:
|
|
|
|
f.write(
|
2016-07-17 20:29:53 +02:00
|
|
|
"""const float cloudsDensity = """ + str(round(wrd.generate_clouds_density * 100) / 100) + """;
|
|
|
|
const float cloudsSize = """ + str(round(wrd.generate_clouds_size * 100) / 100) + """;
|
|
|
|
const float cloudsLower = """ + str(round(wrd.generate_clouds_lower * 1000)) + """;
|
|
|
|
const float cloudsUpper = """ + str(round(wrd.generate_clouds_upper * 1000)) + """;
|
|
|
|
const vec2 cloudsWind = vec2(""" + str(round(wrd.generate_clouds_wind[0] * 1000) / 1000) + """, """ + str(round(wrd.generate_clouds_wind[1] * 1000) / 1000) + """);
|
|
|
|
const float cloudsSecondary = """ + str(round(wrd.generate_clouds_secondary * 100) / 100) + """;
|
|
|
|
const float cloudsPrecipitation = """ + str(round(wrd.generate_clouds_precipitation * 100) / 100) + """;
|
|
|
|
const float cloudsEccentricity = """ + str(round(wrd.generate_clouds_eccentricity * 100) / 100) + """;
|
|
|
|
""")
|
|
|
|
if wrd.generate_ocean:
|
|
|
|
f.write(
|
|
|
|
"""const float seaLevel = """ + str(round(wrd.generate_ocean_level * 100) / 100) + """;
|
|
|
|
const float seaMaxAmplitude = """ + str(round(wrd.generate_ocean_amplitude * 100) / 100) + """;
|
|
|
|
const float seaHeight = """ + str(round(wrd.generate_ocean_height * 100) / 100) + """;
|
|
|
|
const float seaChoppy = """ + str(round(wrd.generate_ocean_choppy * 100) / 100) + """;
|
|
|
|
const float seaSpeed = """ + str(round(wrd.generate_ocean_speed * 100) / 100) + """;
|
|
|
|
const float seaFreq = """ + str(round(wrd.generate_ocean_freq * 100) / 100) + """;
|
|
|
|
const vec3 seaBaseColor = vec3(""" + str(round(wrd.generate_ocean_base_color[0] * 100) / 100) + """, """ + str(round(wrd.generate_ocean_base_color[1] * 100) / 100) + """, """ + str(round(wrd.generate_ocean_base_color[2] * 100) / 100) + """);
|
|
|
|
const vec3 seaWaterColor = vec3(""" + str(round(wrd.generate_ocean_water_color[0] * 100) / 100) + """, """ + str(round(wrd.generate_ocean_water_color[1] * 100) / 100) + """, """ + str(round(wrd.generate_ocean_water_color[2] * 100) / 100) + """);
|
2016-07-27 14:25:01 +02:00
|
|
|
const float seaFade = """ + str(round(wrd.generate_ocean_fade * 100) / 100) + """;
|
2016-07-17 20:29:53 +02:00
|
|
|
""")
|
|
|
|
if wrd.generate_ssao:
|
|
|
|
f.write(
|
|
|
|
"""const float ssaoSize = """ + str(round(wrd.generate_ssao_size * 100) / 100) + """;
|
|
|
|
const float ssaoStrength = """ + str(round(wrd.generate_ssao_strength * 100) / 100) + """;
|
2016-08-09 23:51:40 +02:00
|
|
|
const float ssaoTextureScale = """ + str(round(wrd.generate_ssao_texture_scale * 10) / 10) + """;
|
2016-07-17 20:29:53 +02:00
|
|
|
""")
|
2016-08-07 01:43:21 +02:00
|
|
|
# if wrd.generate_shadows:
|
|
|
|
# f.write(
|
|
|
|
# """const float shadowsBias = """ + str(wrd.generate_shadows_bias) + """;
|
|
|
|
# """)
|
2016-07-18 20:28:52 +02:00
|
|
|
if wrd.generate_bloom:
|
|
|
|
f.write(
|
|
|
|
"""const float bloomTreshold = """ + str(round(wrd.generate_bloom_treshold * 100) / 100) + """;
|
2016-08-07 01:43:21 +02:00
|
|
|
const float bloomStrength = """ + str(round(wrd.generate_bloom_strength * 100) / 100) + """;
|
2016-07-18 20:28:52 +02:00
|
|
|
""")
|
|
|
|
if wrd.generate_motion_blur:
|
|
|
|
f.write(
|
|
|
|
"""const float motionBlurIntensity = """ + str(round(wrd.generate_motion_blur_intensity * 100) / 100) + """;
|
|
|
|
""")
|
|
|
|
if wrd.generate_ssr:
|
|
|
|
f.write(
|
|
|
|
"""const float ssrRayStep = """ + str(round(wrd.generate_ssr_ray_step * 100) / 100) + """;
|
|
|
|
const float ssrMinRayStep = """ + str(round(wrd.generate_ssr_min_ray_step * 100) / 100) + """;
|
|
|
|
const float ssrSearchDist = """ + str(round(wrd.generate_ssr_search_dist * 100) / 100) + """;
|
|
|
|
const float ssrFalloffExp = """ + str(round(wrd.generate_ssr_falloff_exp * 100) / 100) + """;
|
|
|
|
const float ssrJitter = """ + str(round(wrd.generate_ssr_jitter * 100) / 100) + """;
|
2016-08-09 23:51:40 +02:00
|
|
|
const float ssrTextureScale = """ + str(round(wrd.generate_ssr_texture_scale * 10) / 10) + """;
|
2016-07-10 00:51:39 +02:00
|
|
|
""")
|
|
|
|
|
|
|
|
def write_traithx(class_name):
|
|
|
|
wrd = bpy.data.worlds[0]
|
|
|
|
with open('Sources/' + wrd.CGProjectPackage + '/' + class_name + '.hx', 'w') as f:
|
|
|
|
f.write(
|
|
|
|
"""package """ + wrd.CGProjectPackage + """;
|
|
|
|
|
|
|
|
class """ + class_name + """ extends iron.Trait {
|
|
|
|
public function new() {
|
|
|
|
super();
|
|
|
|
|
|
|
|
// notifyOnInit(function() {
|
|
|
|
// });
|
|
|
|
|
|
|
|
// notifyOnUpdate(function() {
|
|
|
|
// });
|
|
|
|
|
|
|
|
// notifyOnRemove(function() {
|
|
|
|
// });
|
|
|
|
}
|
|
|
|
}
|
|
|
|
""")
|