forked from LeenkxTeam/LNXSDK
Repe [T3DU] Update - 31f26d171bba0355ce2a77031e3aad4c64dbc7e9
This commit is contained in:
@ -311,7 +311,7 @@ class Data {
|
||||
|
||||
loadingSceneRaws.set(file, [done]);
|
||||
|
||||
// If no extension specified, set to .arm
|
||||
// If no extension specified, set to .lnx
|
||||
var compressed = file.endsWith(".lz4");
|
||||
var isJson = file.endsWith(".json");
|
||||
var ext = (compressed || isJson || file.endsWith(".lnx")) ? "" : ".lnx";
|
||||
@ -405,6 +405,13 @@ class Data {
|
||||
}
|
||||
#end
|
||||
|
||||
public static function getCurveRawByName(datas: Array<TCurveData>, name: String): TCurveData {
|
||||
if (datas == null || datas.length == 0) return null;
|
||||
if (name == "") return datas[0];
|
||||
for (dat in datas) if (dat.name == name) return dat;
|
||||
return null;
|
||||
}
|
||||
|
||||
// Raw assets
|
||||
public static function getBlob(file: String, done: kha.Blob->Void) {
|
||||
var cached = cachedBlobs.get(file); // Is already cached
|
||||
|
||||
@ -40,6 +40,8 @@ class Geometry {
|
||||
public var instancedVB: VertexBuffer = null;
|
||||
public var instanced = false;
|
||||
public var instanceCount = 0;
|
||||
public var instanceElements: Array<{name: String, data: String}> = [];
|
||||
public var instanceStride: Int = 0;
|
||||
|
||||
public var positions: TVertexArray;
|
||||
public var normals: TVertexArray;
|
||||
@ -130,11 +132,39 @@ class Geometry {
|
||||
structure.add("iscl", kha.graphics4.VertexData.Float3);
|
||||
}
|
||||
|
||||
if (instanceElements != null && instanceElements.length > 0) {
|
||||
for (elem in instanceElements) {
|
||||
if (StringTools.startsWith(elem.name, "i") && elem.name != "ipos" && elem.name != "irot" && elem.name != "iscl") {
|
||||
var vdata = VertexData.Float1;
|
||||
var dataStr: String = Reflect.field(elem, "data");
|
||||
switch (dataStr) {
|
||||
case "float1": vdata = VertexData.Float1;
|
||||
case "float2": vdata = VertexData.Float2;
|
||||
case "float3": vdata = VertexData.Float3;
|
||||
case "float4": vdata = VertexData.Float4;
|
||||
}
|
||||
structure.add(elem.name, vdata);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.instanceStride = Std.int(structure.byteSize() / 4);
|
||||
instanceCount = Std.int(data.length / Std.int(structure.byteSize() / 4));
|
||||
instancedVB = new VertexBuffer(instanceCount, structure, usage, 1);
|
||||
var vertices = instancedVB.lock();
|
||||
for (i in 0...Std.int(vertices.byteLength / 4)) vertices.setFloat32(i * 4, data[i]);
|
||||
instancedVB.unlock();
|
||||
|
||||
}
|
||||
|
||||
public function updateInstanced(data: Float32Array) {
|
||||
if (instancedVB == null) return;
|
||||
|
||||
var vertices = instancedVB.lock();
|
||||
for (i in 0...Std.int(vertices.byteLength / 4)) {
|
||||
vertices.setFloat32(i * 4, data[i]);
|
||||
}
|
||||
instancedVB.unlock();
|
||||
}
|
||||
|
||||
public function copyVertices(vertices: ByteArray, offset = 0, fakeUVs = false) {
|
||||
|
||||
@ -40,6 +40,8 @@ typedef TSceneFormat = {
|
||||
@:optional public var irradiance: Float32Array; // Blob with spherical harmonics, bands 0,1,2
|
||||
@:optional public var terrain_datas: Array<TTerrainData>;
|
||||
@:optional public var terrain_ref: String;
|
||||
@:optional public var properties: Array<TProperty>;
|
||||
@:optional public var curve_datas: Array<TCurveData>;
|
||||
}
|
||||
|
||||
#if js
|
||||
@ -432,6 +434,7 @@ typedef TParticleData = {
|
||||
// Velocity
|
||||
public var object_align_factor: Float32Array;
|
||||
public var factor_random: FastFloat;
|
||||
public var normal_factor: FastFloat;
|
||||
// Rotation
|
||||
public var use_rotations: Bool;
|
||||
public var rotation_mode: Int; // 0 - None, 1 - Normal, 2 - Normal-Tangent, 3 - Velocity/Hair, 4 - Global X, 5 - Global Y, 6 - Global Z, 7 - Object X, 8 - Object Y, 9 - Object Z
|
||||
@ -525,7 +528,7 @@ typedef TVertex_groups = {
|
||||
@:structInit class TVertex_groups {
|
||||
#end
|
||||
public var name: String;
|
||||
public var value: Dynamic;
|
||||
public var value: Float32Array;
|
||||
}
|
||||
|
||||
#if js
|
||||
@ -564,6 +567,21 @@ typedef TConstraint = {
|
||||
@:optional public var invert_z: Null<Bool>;
|
||||
@:optional public var use_offset: Null<Bool>;
|
||||
@:optional public var influence: Null<FastFloat>;
|
||||
@:optional public var use_min_x: Null<Bool>;
|
||||
@:optional public var use_max_x: Null<Bool>;
|
||||
@:optional public var use_min_y: Null<Bool>;
|
||||
@:optional public var use_max_y: Null<Bool>;
|
||||
@:optional public var use_min_z: Null<Bool>;
|
||||
@:optional public var use_max_z: Null<Bool>;
|
||||
@:optional public var use_limit_x: Null<Bool>;
|
||||
@:optional public var use_limit_y: Null<Bool>;
|
||||
@:optional public var use_limit_z: Null<Bool>;
|
||||
@:optional public var min_x: Null<FastFloat>;
|
||||
@:optional public var max_x: Null<FastFloat>;
|
||||
@:optional public var min_y: Null<FastFloat>;
|
||||
@:optional public var max_y: Null<FastFloat>;
|
||||
@:optional public var min_z: Null<FastFloat>;
|
||||
@:optional public var max_z: Null<FastFloat>;
|
||||
}
|
||||
|
||||
#if js
|
||||
@ -622,3 +640,48 @@ typedef TTrack = {
|
||||
public var values: Float32Array; // sampled - full matrix transforms, non-sampled - values
|
||||
@:optional public var ref_values: Array<Array<String>>; // ref values
|
||||
}
|
||||
|
||||
#if js
|
||||
typedef TBezierPoint = {
|
||||
#else
|
||||
@:structInit class TBezierPoint {
|
||||
#end
|
||||
public var co: Float32Array;
|
||||
public var handle_left: Float32Array;
|
||||
public var handle_right: Float32Array;
|
||||
}
|
||||
|
||||
#if js
|
||||
typedef TSpline = {
|
||||
#else
|
||||
@:structInit class TSpline {
|
||||
#end
|
||||
public var closed: Bool;
|
||||
public var resolution: Int;
|
||||
public var points: Array<TBezierPoint>;
|
||||
public var material_index: Int;
|
||||
}
|
||||
|
||||
#if js
|
||||
typedef TShapeKey = {
|
||||
#else
|
||||
@:structInit class TShapeKey {
|
||||
#end
|
||||
public var name: String;
|
||||
public var value: Float;
|
||||
public var points: Array<TBezierPoint>;
|
||||
}
|
||||
|
||||
#if js
|
||||
typedef TCurveData = {
|
||||
#else
|
||||
@:structInit class TCurveData {
|
||||
#end
|
||||
public var name: String;
|
||||
public var object: String;
|
||||
public var splines: Array<TSpline>;
|
||||
public var strength: Float;
|
||||
public var color: Float32Array;
|
||||
@:optional public var material_refs: Array<String>;
|
||||
@:optional public var shape_keys: Array<TShapeKey>;
|
||||
}
|
||||
|
||||
@ -79,6 +79,8 @@ class ShaderContext {
|
||||
|
||||
var structure: VertexStructure;
|
||||
var instancingType = 0;
|
||||
var instanceElements: Array<{name: String, data: String}> = [];
|
||||
var instanceStride: Int = 0;
|
||||
|
||||
public function new(raw: TShaderContext, done: ShaderContext->Void, overrideContext: TShaderOverride = null) {
|
||||
this.raw = raw;
|
||||
@ -108,6 +110,11 @@ class ShaderContext {
|
||||
if (instancingType == 3 || instancingType == 4) {
|
||||
instStruct.add("iscl", VertexData.Float3);
|
||||
}
|
||||
|
||||
for (e in instanceElements)
|
||||
instStruct.add(e.name, parseData(e.data));
|
||||
this.instanceStride = Std.int(instStruct.byteSize() / 4);
|
||||
|
||||
instStruct.instanced = true;
|
||||
pipeState.inputLayout = [structure, instStruct];
|
||||
}
|
||||
@ -268,10 +275,12 @@ class ShaderContext {
|
||||
if (Reflect.field(elem, "name") == "ipos") { ipos = true; continue; }
|
||||
if (Reflect.field(elem, "name") == "irot") { irot = true; continue; }
|
||||
if (Reflect.field(elem, "name") == "iscl") { iscl = true; continue; }
|
||||
if (Reflect.field(elem, "name").startsWith("i")) { instanceElements.push(elem); continue; }
|
||||
#else
|
||||
if (elem.name == "ipos") { ipos = true; continue; }
|
||||
if (elem.name == "irot") { irot = true; continue; }
|
||||
if (elem.name == "iscl") { iscl = true; continue; }
|
||||
if (elem.name.startsWith("i")) { instanceElements.push(elem); continue; }
|
||||
#end
|
||||
structure.add(elem.name, parseData(elem.data));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user