/home/bill/web/CompLangs/PineScript/peacefulLizard: 3D Engine Overlay PineScript.txt // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © peacefulLizard50262 //USE 1W TIME FRAME OR GREATER //@version=5 indicator("3D Engine", max_bars_back = 5000, max_lines_count = 500, overlay = true) scale_factor = open type vector2 float x float y type vector3 float x float y float z type vector4 float x float y float z float w type face int v1 int v2 int v3 type mesh array v array f type mesh2d array v array f type location vector3 position vector3 theta vector3 scale type object mesh m location l type poly4 float x1 float x2 float y1 float y2 type polyg poly4 l1 poly4 l2 poly4 l3 type camera vector3 pos //position vector3 tar //target float fov //field of view vector2 ar //aspect ratio vector2 vd //view distance type mat4 float m11 = 1 float m12 = 0 float m13 = 0 float m14 = 0 float m21 = 0 float m22 = 1 float m23 = 0 float m24 = 0 float m31 = 0 float m32 = 0 float m33 = 1 float m34 = 0 float m41 = 0 float m42 = 0 float m43 = 0 float m44 = 1 mat4_multiply(a, b) => mat4.new( a.m11 * b.m11 + a.m12 * b.m21 + a.m13 * b.m31 + a.m14 * b.m41, a.m11 * b.m12 + a.m12 * b.m22 + a.m13 * b.m32 + a.m14 * b.m42, a.m11 * b.m13 + a.m12 * b.m23 + a.m13 * b.m33 + a.m14 * b.m43, a.m11 * b.m14 + a.m12 * b.m24 + a.m13 * b.m34 + a.m14 * b.m44, a.m21 * b.m11 + a.m22 * b.m21 + a.m23 * b.m31 + a.m24 * b.m41, a.m21 * b.m12 + a.m22 * b.m22 + a.m23 * b.m32 + a.m24 * b.m42, a.m21 * b.m13 + a.m22 * b.m23 + a.m23 * b.m33 + a.m24 * b.m43, a.m21 * b.m14 + a.m22 * b.m24 + a.m23 * b.m34 + a.m24 * b.m44, a.m31 * b.m11 + a.m32 * b.m21 + a.m33 * b.m31 + a.m34 * b.m41, a.m31 * b.m12 + a.m32 * b.m22 + a.m33 * b.m32 + a.m34 * b.m42, a.m31 * b.m13 + a.m32 * b.m23 + a.m33 * b.m33 + a.m34 * b.m43, a.m31 * b.m14 + a.m32 * b.m24 + a.m33 * b.m34 + a.m34 * b.m44, a.m41 * b.m11 + a.m42 * b.m21 + a.m43 * b.m31 + a.m44 * b.m41, a.m41 * b.m12 + a.m42 * b.m22 + a.m43 * b.m32 + a.m44 * b.m42, a.m41 * b.m13 + a.m42 * b.m23 + a.m43 * b.m33 + a.m44 * b.m43, a.m41 * b.m14 + a.m42 * b.m24 + a.m43 * b.m34 + a.m44 * b.m44 ) mat4_multiply_vec4(mtx, vector) => x = mtx.m11 * vector.x + mtx.m21 * vector.y + mtx.m31 * vector.z + mtx.m41 * vector.w y = mtx.m12 * vector.x + mtx.m22 * vector.y + mtx.m32 * vector.z + mtx.m42 * vector.w z = mtx.m13 * vector.x + mtx.m23 * vector.y + mtx.m33 * vector.z + mtx.m43 * vector.w w = mtx.m14 * vector.x + mtx.m24 * vector.y + mtx.m34 * vector.z + mtx.m44 * vector.w vector4.new(x, y, z, w) mat4_scale(mtx, scale_vector) => _m11 = mtx.m11 * scale_vector.x _m12 = mtx.m12 * scale_vector.x _m13 = mtx.m13 * scale_vector.x _m14 = mtx.m14 * scale_vector.x _m21 = mtx.m21 * scale_vector.y _m22 = mtx.m22 * scale_vector.y _m23 = mtx.m23 * scale_vector.y _m24 = mtx.m24 * scale_vector.y _m31 = mtx.m31 * scale_vector.z _m32 = mtx.m32 * scale_vector.z _m33 = mtx.m33 * scale_vector.z _m34 = mtx.m34 * scale_vector.z _m41 = mtx.m41 _m42 = mtx.m42 _m43 = mtx.m43 _m44 = mtx.m44 mat4.new(_m11, _m12, _m13, _m14, _m21, _m22, _m23, _m24, _m31, _m32, _m33, _m34, _m41, _m42, _m43, _m44) mat4_translate(mtx, translation_vector) => _m11 = mtx.m11 _m12 = mtx.m12 _m13 = mtx.m13 _m14 = mtx.m14 _m21 = mtx.m21 _m22 = mtx.m22 _m23 = mtx.m23 _m24 = mtx.m24 _m31 = mtx.m31 _m32 = mtx.m32 _m33 = mtx.m33 _m34 = mtx.m34 _m41 = mtx.m11 * translation_vector.x + mtx.m21 * translation_vector.y + mtx.m31 * translation_vector.z + mtx.m41 _m42 = mtx.m12 * translation_vector.x + mtx.m22 * translation_vector.y + mtx.m32 * translation_vector.z + mtx.m42 _m43 = mtx.m13 * translation_vector.x + mtx.m23 * translation_vector.y + mtx.m33 * translation_vector.z + mtx.m43 _m44 = mtx.m14 * translation_vector.x + mtx.m24 * translation_vector.y + mtx.m34 * translation_vector.z + mtx.m44 mat4.new(_m11, _m12, _m13, _m14, _m21, _m22, _m23, _m24, _m31, _m32, _m33, _m34, _m41, _m42, _m43, _m44) rot_x(angle) => c = math.cos(angle) s = math.sin(angle) mat4.new( 1, 0, 0, 0, 0, c, -s, 0, 0, s, c, 0, 0, 0, 0, 1 ) rot_y(angle) => c = math.cos(angle) s = math.sin(angle) mat4.new( c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1 ) rot_z(angle) => c = math.cos(angle) s = math.sin(angle) mat4.new( c, -s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ) create_transformation_matrix(position, rotation, scale) => translation_matrix = mat4_translate(mat4.new(), position) rotation_matrix_x = rot_x(rotation.x) rotation_matrix_y = rot_y(rotation.y) rotation_matrix_z = rot_z(rotation.z) scale_matrix = mat4_scale(mat4.new(), scale) _transformation_matrix_1 = mat4_multiply(rotation_matrix_x, rotation_matrix_y) _transformation_matrix_2 = mat4_multiply(_transformation_matrix_1, rotation_matrix_z) _transformation_matrix_3 = mat4_multiply(_transformation_matrix_2, scale_matrix) transformation_matrix = mat4_multiply(_transformation_matrix_3, translation_matrix) transformation_matrix radians(degree)=> degree * math.pi/180 ema(source)=> var float ema = 0.0 var int count = 0 count := nz(count[1]) + 1 ema := (1.0 - 2.0 / (count + 1.0)) * nz(ema[1]) + 2.0 / (count + 1.0) * source ema perspective_transform(mesh msh, cam, obj_y_offset, true_range) => transformed_vertices = array.new(array.size(msh.v)) minY = 1.7976931348623157e+308 maxY = -1.7976931348623157e+308 fov_scale = math.tan(radians(cam.fov) / 2) * 2 for i = 0 to array.size(msh.v) - 1 aspect_ratio = cam.ar.x/cam.ar.y vertex_position = array.get(msh.v, i) cam_to_vertex = vector3.new(vertex_position.x - cam.pos.x, vertex_position.y - cam.pos.y, vertex_position.z - cam.pos.z) z = cam_to_vertex.z x = (cam_to_vertex.x / true_range * 5) / (z * aspect_ratio * fov_scale) y = (cam_to_vertex.y * true_range * 5) / (z * aspect_ratio * fov_scale) minY := math.min(minY, y) maxY := math.max(maxY, y) array.set(transformed_vertices, i, vector2.new(x, y)) centerY = (minY + maxY) / 2 for i = 0 to array.size(transformed_vertices) - 1 vertex = array.get(transformed_vertices, i) array.set(transformed_vertices, i, vector2.new(vertex.x, vertex.y - centerY + obj_y_offset * syminfo.mintick * 1000)) mesh2d.new(transformed_vertices, msh.f) apply_transformation_matrix(vertex, matrix) => vec4 = mat4_multiply_vec4(matrix, vertex) vec4 transform_mesh(mesh_obj, transformation_matrix) => new_vertex_list = array.new(array.size(mesh_obj.v)) for i = 0 to array.size(mesh_obj.v) - 1 old_vertex = array.get(mesh_obj.v, i) new_vertex = apply_transformation_matrix(old_vertex, transformation_matrix) array.set(new_vertex_list, i, new_vertex) mesh.new(new_vertex_list, mesh_obj.f) process_object(obj, cam, true_range) => transformation_matrix = create_transformation_matrix(obj.l.position, obj.l.theta, obj.l.scale) transformed_mesh = transform_mesh(obj.m, transformation_matrix) perspective_transform(transformed_mesh, cam, obj.l.position.y, true_range) size(scene)=> size = 0 for i = 0 to array.size(scene) - 1 obj = array.get(scene, i) size += array.size(obj.f) size make_poly(scene, poly_count)=> var poly_list = array.new(poly_count) array.clear(poly_list) for i = 0 to array.size(scene) - 1 poly = array.new(array.size(array.get(scene, i).f)) obj = array.get(scene, i) obj_v = obj.v for j = 0 to array.size(obj.f) - 1 v1 = array.get(obj.f, j).v1 v2 = array.get(obj.f, j).v2 v3 = array.get(obj.f, j).v3 array.set(poly, j, polyg.new( poly4.new( array.get(obj_v, v1).x, array.get(obj_v, v2).x, array.get(obj_v, v1).y, array.get(obj_v, v2).y), poly4.new( array.get(obj_v, v2).x, array.get(obj_v, v3).x, array.get(obj_v, v2).y, array.get(obj_v, v3).y), poly4.new( array.get(obj_v, v3).x, array.get(obj_v, v1).x, array.get(obj_v, v3).y, array.get(obj_v, v1).y))) for k = 0 to array.size(poly) - 1 array.push(poly_list, array.get(poly, k)) poly_list process_scene(scn, cam, true_range)=> new_scn = array.new(array.size(scn)) for i = 0 to array.size(scn) - 1 new_object = process_object(array.get(scn, i), cam, true_range) array.set(new_scn, i, new_object) poly_count = size(new_scn) make_poly(new_scn, poly_count) render(scene_list, Camera, offset, offxet_y)=> true_range = ema(high-low) lines = array.new(500) time_quanta = (time[1] - last_bar_time) left = chart.left_visible_bar_time right = chart.right_visible_bar_time center = time + offset//(right + left)/2 ratio = (open/(true_range/2)) / 32 if barstate.islast scene_lines = process_scene(scene_list, Camera, true_range) for i = 0 to array.size(scene_lines) - 1 poly = array.get(scene_lines, i) array.push(lines, line.new(int(center + time_quanta * poly.l1.x1 * scale_factor / ratio), poly.l1.y1 + open + offxet_y, int(center + time_quanta * poly.l1.x2 * scale_factor / ratio), poly.l1.y2 + open + offxet_y, xloc.bar_time)) array.push(lines, line.new(int(center + time_quanta * poly.l2.x1 * scale_factor / ratio), poly.l2.y1 + open + offxet_y, int(center + time_quanta * poly.l2.x2 * scale_factor / ratio), poly.l2.y2 + open + offxet_y, xloc.bar_time)) array.push(lines, line.new(int(center + time_quanta * poly.l3.x1 * scale_factor / ratio), poly.l3.y1 + open + offxet_y, int(center + time_quanta * poly.l3.x2 * scale_factor / ratio), poly.l3.y2 + open + offxet_y, xloc.bar_time)) if barstate.isconfirmed for i = 0 to array.size(lines) - 1 line.delete(array.get(lines, i)) pin_vertex_list = array.from( vector4.new(0, 0.5, 0, 1), //0 a vector4.new( 0.0802, 0.3417, 0.0000, 1), //1 b vector4.new( 0.0567, 0.3417, -0.0567, 1), //2 c vector4.new( 0.0000, 0.3417, -0.0802, 1), //3 d vector4.new(-0.0567, 0.3417, -0.0567, 1), //4 e vector4.new(-0.0802, 0.3417, 0.0000, 1), //5 f vector4.new(-0.0567, 0.3417, 0.0567, 1), //6 g vector4.new( 0.0000, 0.3417, 0.0802, 1), //7 h vector4.new( 0.0567, 0.3417, 0.0567, 1), //8 i vector4.new( 0.0599, 0.1667, 0.0000, 1), //9 j vector4.new( 0.0424, 0.1667, -0.0424, 1), //10 k vector4.new( 0.0000, 0.1667, -0.0599, 1), //11 l vector4.new(-0.0424, 0.1667, -0.0424, 1), //12 m vector4.new(-0.0599, 0.1667, 0.0000, 1), //13 n vector4.new(-0.0424, 0.1667, 0.0424, 1), //14 o vector4.new( 0.0000, 0.1667, 0.0599, 1), //15 p vector4.new( 0.0424, 0.1667, 0.0424, 1), //16 q vector4.new( 0.1589, -0.2000, 0.0000, 1), //17 r vector4.new( 0.1124, -0.2000, -0.1124, 1), //18 s vector4.new( 0.0000, -0.2000, -0.1589, 1), //19 t vector4.new(-0.1124, -0.2000, -0.1124, 1), //20 u vector4.new(-0.1589, -0.2000, 0.0000, 1), //21 v vector4.new(-0.1124, -0.2000, 0.1124, 1), //22 w vector4.new( 0.0000, -0.2000, 0.1589, 1), //23 z vector4.new( 0.1124, -0.2000, 0.1124, 1), //24 a1 vector4.new( 0.0677, -0.5000, 0.0000, 1), //25 b1 vector4.new( 0.0479, -0.5000, -0.0479, 1), //26 c1 vector4.new( 0.0000, -0.5000, -0.0677, 1), //27 d1 vector4.new(-0.0479, -0.5000, -0.0479, 1), //28 e1 vector4.new(-0.0677, -0.5000, 0.0000, 1), //29 f1 vector4.new(-0.0479, -0.5000, 0.0479, 1), //30 g1 vector4.new( 0.0000, -0.5000, 0.0677, 1), //31 h1 vector4.new( 0.0479, -0.5000, 0.0479, 1), //32 i1 vector4.new(0, -0.5, 0, 1) //33 h1 ) pin_face_list = array.from( face.new(0, 1, 2), //0 face.new(0, 2, 3), //1 face.new(0, 3, 4), //2 face.new(0, 4, 5), //3 face.new(0, 5, 6), //4 face.new(0, 6, 7), //5 face.new(0, 7, 8), //6 face.new(0, 1, 8), //7 face.new(1, 2, 9), //8 face.new(2, 9, 10), //9 face.new(2, 10, 11), //10 face.new(2, 3, 11), //11 face.new(3, 4, 11), //12 face.new(4, 11, 12), //13 face.new(4, 12, 13), //14 face.new(4, 5, 13), //15 face.new(5, 6, 13), //16 face.new(6, 13, 14), //17 face.new(6, 14, 15), //18 face.new(6, 7, 15), //19 face.new(7, 8, 15), //20 face.new(8, 15, 16), //21 face.new(8, 9, 16), //22 face.new(1, 8, 9), //23 face.new(9, 17, 18), //24 face.new(9, 10, 18), //25 face.new(10, 11, 18), //26 face.new(11, 18, 19), //27 face.new(11, 19, 20), //28 face.new(11, 12, 20), //29 face.new(12, 13, 20), //30 face.new(13, 20, 21), //31 face.new(13, 21, 22), //32 face.new(13, 14, 22), //33 face.new(14, 15, 22), //34 face.new(15, 22, 23), //35 face.new(15, 23, 24), //36 face.new(15, 16, 24), //37 face.new(9, 16, 24), //38 face.new(9, 17, 24), //39 face.new(17, 18, 25), //40 face.new(17, 24, 25), //41 face.new(18, 25, 26), //42 face.new(18, 26, 27), //43 face.new(18, 19, 27), //44 face.new(19, 20, 27), //45 face.new(20, 27, 28), //46 face.new(20, 28, 29), //47 face.new(20, 21, 29), //48 face.new(21, 22, 29), //49 face.new(22, 29, 30), //50 face.new(22, 30, 31), //51 face.new(22, 23, 31), //52 face.new(23, 24, 31), //53 face.new(24, 31, 32), //54 face.new(24, 25, 32), //55 face.new(25, 26, 33), //56 face.new(26, 27, 33), //57 face.new(27, 28, 33), //58 face.new(28, 29, 33), //59 face.new(29, 30, 33), //60 face.new(30, 31, 33), //61 face.new(31, 32, 33), //62 face.new(25, 32, 33) //63 ) ball_vertex_list = array.from( vector4.new(0.0, -0.5, 0.0, 1), vector4.new(0.0, 0.5, 0.0, 1), vector4.new(0.17026233930306509, 0.3535533905932738, 0.3535533905932738, 1), vector4.new(0.24078730940376433, 3.061616997868383e-17, 0.5, 1), vector4.new(0.1702623393030651, -0.35355339059327373, 0.3535533905932738, 1), vector4.new(0.3825760036952101, 0.3535533905932738, 0.08732047630169361, 1), vector4.new(0.5410441730642656, 3.061616997868383e-17, 0.12348980185873357, 1), vector4.new(0.38257600369521017, -0.35355339059327373, 0.08732047630169362, 1), vector4.new(0.3068021341766003, 0.3535533905932738, -0.24466653765816737, 1), vector4.new(0.4338837391175582, 3.061616997868383e-17, -0.34601073581504793, 1), vector4.new(0.3068021341766003, -0.35355339059327373, -0.2446665376581674, 1), vector4.new(4.805693554381959e-17, 0.3535533905932738, -0.3924146584735999, 1), vector4.new(6.796277001215932e-17, 3.061616997868383e-17, -0.5549581320873712, 1), vector4.new(4.8056935543819596e-17, -0.35355339059327373, -0.39241465847359996, 1), vector4.new(-0.3068021341766002, 0.3535533905932738, -0.24466653765816745, 1), vector4.new(-0.43388373911755806, 3.061616997868383e-17, -0.34601073581504804, 1), vector4.new(-0.30680213417660024, -0.35355339059327373, -0.2446665376581675, 1), vector4.new(-0.3825760036952101, 0.3535533905932738, 0.08732047630169353, 1), vector4.new(-0.5410441730642656, 3.061616997868383e-17, 0.12348980185873344, 1), vector4.new(-0.38257600369521017, -0.35355339059327373, 0.08732047630169354, 1), vector4.new(-0.17026233930306517, 0.3535533905932738, 0.35355339059327373, 1), vector4.new(-0.24078730940376444, 3.061616997868383e-17, 0.49999999999999994, 1), vector4.new(-0.1702623393030652, -0.35355339059327373, 0.3535533905932738, 1) ) ball_face_list = array.from( face.new(2, 5, 1), face.new(2, 3, 6), face.new(3, 4, 7), face.new(7, 4, 0), face.new(5, 8, 1), face.new(5, 6, 9), face.new(6, 7, 10), face.new(10, 7, 0), face.new(8, 11, 1), face.new(8, 9, 12), face.new(9, 10, 13), face.new(13, 10, 0), face.new(11, 14, 1), face.new(11, 12, 15), face.new(12, 13, 16), face.new(16, 13, 0), face.new(14, 17, 1), face.new(14, 15, 18), face.new(15, 16, 19), face.new(19, 16, 0), face.new(17, 20, 1), face.new(17, 18, 21), face.new(18, 19, 22), face.new(22, 19, 0), face.new(20, 2, 1), face.new(20, 21, 3), face.new(21, 22, 4), face.new(4, 22, 0) ) Arwing_vertex_list = array.from( vector4.new(-0.157674, 0.658789, 0.636509, 1), vector4.new(0.157282, 1.19168, -0.64882, 1), vector4.new(-0.157674, 1.19168, -0.64882, 1), vector4.new(0.157282, 0.658789, 0.63651, 1), vector4.new(0.354133, 0.7358, -0.273302, 1), vector4.new(-0.354524, 0.7358, -0.273302, 1), vector4.new(-1.22067, 0.477053, -0.584587, 1), vector4.new(-0.866336, 0.089177, -0.448857, 1), vector4.new(-1.88996, -0.0307165, -0.482857, 1), vector4.new(-0.630116, 0.4804, -0.506169, 1), vector4.new(-0.354524, 0.00868859, -0.484527, 1), vector4.new(-0.000195773, 0.11069, -0.844209, 1), vector4.new(-0.000195815, 0.244741, -0.495345, 1), vector4.new(0.629724, 0.4804, -0.506169, 1), vector4.new(-0.000195811, 0.75586, -0.518657, 1), vector4.new(-0.000195624, 0.804545, -2.0578, 1), vector4.new(-0.354524, 0.727271, -0.280933, 1), vector4.new(-0.157282, 0.687595, 0.588189, 1), vector4.new(0.157677, 0.687601, 0.587795, 1), vector4.new(0.000197441, 0.687598, 3.18898, 1), vector4.new(-0.275391, 0.517739, 2.05394, 1), vector4.new(-0.157283, 0.321096, 2.06269, 1), vector4.new(-0.354133, 0.0121655, 0.460955, 1), vector4.new(-0.550983, 0.167731, 0.414467, 1), vector4.new(-0.866335, 1.4049, -1.84841, 1), vector4.new(-1.22027, 0.167731, 0.414467, 1), vector4.new(-0.865944, 0.237261, 1.9486, 1), vector4.new(0.354133, 0.0086955, -0.484921, 1), vector4.new(0.865944, 0.089177, -0.448856, 1), vector4.new(1.22027, 0.47706, -0.58498, 1), vector4.new(0.865944, 1.40491, -1.8488, 1), vector4.new(0.550985, 0.167731, 0.414467, 1), vector4.new(0.866338, 0.237268, 1.94821, 1), vector4.new(1.22067, 0.167731, 0.414467, 1), vector4.new(0.354527, 0.0121655, 0.460955, 1), vector4.new(-0.078541, 0.16012, 1.99135, 1), vector4.new(0.0789372, 0.16012, 1.99135, 1), vector4.new(0.157676, 0.321096, 2.06269, 1), vector4.new(0.275787, 0.517739, 2.05394, 1), vector4.new(0.354133, 0.727271, -0.280933, 1), vector4.new(0.157282, 1.22255, -0.658122, 1), vector4.new(-0.157674, 1.22255, -0.658122, 1), vector4.new(1.88957, -0.0307096, -0.48325, 1), vector4.new(0.846655, -0.240109, 0.117496, 1), vector4.new(1.20098, -0.161432, 1.84828, 1), vector4.new(1.51555, -0.240109, 0.117496, 1), vector4.new(1.20059, -0.643821, -0.10065, 1), vector4.new(1.20059, -0.3005, -1.2196, 1), vector4.new(1.12185, 0.173013, -0.334768, 1), vector4.new(1.23996, -0.220274, -0.316868, 1), vector4.new(1.12185, -0.220274, -0.316868, 1), vector4.new(1.23996, 0.173013, -0.334768, 1), vector4.new(1.23996, 0.190914, 0.0585201, 1), vector4.new(1.23996, -0.191557, 0.312473, 1), vector4.new(1.12185, -0.191557, 0.312473, 1), vector4.new(1.12185, 0.190914, 0.0585201, 1), vector4.new(0.839568, -0.0834101, -1.2717, 1), vector4.new(1.36988, 0.0463139, -0.945355, 1), vector4.new(1.06595, -0.450375, -1.94557, 1), vector4.new(1.36791, -0.0698241, -0.924162, 1), vector4.new(1.49232, -0.406907, -1.66287, 1), vector4.new(1.4935, -0.329482, -1.67687, 1), vector4.new(0.845866, -0.09343, -1.28408, 1), vector4.new(1.37894, -0.0812873, -0.944052, 1), vector4.new(1.06476, -0.45752, -1.94215, 1), vector4.new(1.35413, -0.152573, -0.898446, 1), vector4.new(1.50098, -0.495096, -1.66363, 1), vector4.new(1.50256, -0.417671, -1.67763, 1), vector4.new(1.35768, 0.0308721, -0.962951, 1), vector4.new(1.80413, 0.130054, -0.153211, 1), vector4.new(1.49705, -0.342761, -1.68301, 1), vector4.new(1.33996, 0.425713, -0.553593, 1), vector4.new(0.901772, 0.303041, -0.832956, 1), vector4.new(1.33366, 0.0773056, -0.49041, 1), vector4.new(1.35413, -0.162688, -0.927762, 1), vector4.new(1.02618, -0.0772801, -1.14992, 1), vector4.new(1.49429, -0.498002, -1.65502, 1), vector4.new(1.09232, -0.458329, -1.91854, 1), vector4.new(1.37343, -0.52054, -2.23267, 1), vector4.new(1.60768, -0.519131, -2.20075, 1), vector4.new(1.76791, -0.457576, -1.62517, 1), vector4.new(1.89075, -0.636746, -1.9386, 1), vector4.new(1.7624, -0.742832, -3.63325, 1), vector4.new(-1.51594, -0.239722, 0.117897, 1), vector4.new(-1.20059, -0.161432, 1.84828, 1), vector4.new(-0.846652, -0.239722, 0.117897, 1), vector4.new(-1.20098, -0.643828, -0.100256, 1), vector4.new(-1.20098, -0.3005, -1.2196, 1), vector4.new(-1.24035, 0.173006, -0.334375, 1), vector4.new(-1.12224, -0.220281, -0.316475, 1), vector4.new(-1.24035, -0.220281, -0.316475, 1), vector4.new(-1.12224, 0.173006, -0.334375, 1), vector4.new(-1.12224, 0.190907, 0.0589135, 1), vector4.new(-1.12224, -0.191557, 0.312473, 1), vector4.new(-1.24035, 0.190907, 0.0589135, 1), vector4.new(-1.24035, -0.191557, 0.312473, 1), vector4.new(-1.50295, -0.417284, -1.67723, 1), vector4.new(-1.37894, -0.0812942, -0.943658, 1), vector4.new(-0.845863, -0.0934369, -1.28369, 1), vector4.new(-1.35453, -0.152972, -0.89806, 1), vector4.new(-1.06476, -0.45752, -1.94215, 1), vector4.new(-1.50138, -0.494709, -1.66323, 1), vector4.new(-1.49389, -0.329489, -1.67648, 1), vector4.new(-1.37027, 0.046307, -0.944961, 1), vector4.new(-0.839565, -0.083417, -1.27131, 1), vector4.new(-1.36791, -0.0698241, -0.924163, 1), vector4.new(-1.06634, -0.450382, -1.94518, 1), vector4.new(-1.49232, -0.406914, -1.66248, 1), vector4.new(-1.80452, 0.130047, -0.152818, 1), vector4.new(-1.49704, -0.342768, -1.68262, 1), vector4.new(-1.76791, -0.457583, -1.62478, 1), vector4.new(-1.35807, 0.0308721, -0.962952, 1), vector4.new(-1.33996, 0.425713, -0.553593, 1), vector4.new(-1.33366, 0.0772987, -0.490016, 1), vector4.new(-1.35453, -0.162688, -0.927762, 1), vector4.new(-1.49429, -0.498009, -1.65463, 1), vector4.new(-1.89114, -0.636746, -1.9386, 1), vector4.new(-1.37382, -0.520547, -2.23228, 1), vector4.new(-1.76279, -0.742839, -3.63285, 1), vector4.new(-1.60767, -0.519131, -2.20075, 1), vector4.new(-1.09271, -0.458329, -1.91854, 1), vector4.new(-1.02618, -0.077287, -1.14953, 1), vector4.new(-0.90177, 0.303041, -0.832956, 1) ) Arwing_face_list = array.from( face.new(0, 1, 2), face.new(0, 3, 1), face.new(3, 4, 1), face.new(0, 2, 5), face.new(6, 7, 8), face.new(9, 7, 6), face.new(9, 10, 7), face.new(9, 11, 10), face.new(9, 12, 11), face.new(9, 13, 12), face.new(13, 9, 14), face.new(9, 15, 14), face.new(9, 16, 15), face.new(17, 16, 9), face.new(16, 17, 18), face.new(17, 19, 18), face.new(20, 19, 17), face.new(19, 20, 21), face.new(21, 20, 9), face.new(9, 20, 17), face.new(21, 9, 22), face.new(9, 23, 22), face.new(23, 9, 24), face.new(6, 24, 9), face.new(25, 24, 6), face.new(26, 24, 25), face.new(26, 23, 24), face.new(25, 23, 26), face.new(25, 7, 23), face.new(8, 7, 25), face.new(8, 25, 6), face.new(7, 22, 23), face.new(7, 10, 22), face.new(10, 27, 22), face.new(10, 11, 27), face.new(13, 27, 11), face.new(13, 28, 27), face.new(13, 29, 28), face.new(13, 30, 29), face.new(31, 30, 13), face.new(32, 30, 31), face.new(32, 33, 30), face.new(31, 33, 32), face.new(31, 28, 33), face.new(34, 28, 31), face.new(27, 28, 34), face.new(22, 27, 34), face.new(22, 34, 35), face.new(35, 34, 36), face.new(37, 36, 34), face.new(37, 35, 36), face.new(35, 37, 21), face.new(21, 37, 19), face.new(19, 37, 38), face.new(37, 13, 38), face.new(37, 34, 13), face.new(34, 31, 13), face.new(18, 38, 13), face.new(19, 38, 18), face.new(18, 13, 39), face.new(15, 39, 13), face.new(39, 15, 40), face.new(41, 40, 15), face.new(40, 41, 16), face.new(16, 41, 15), face.new(40, 16, 39), face.new(16, 18, 39), face.new(15, 13, 14), face.new(21, 22, 35), face.new(28, 42, 33), face.new(29, 42, 28), face.new(29, 33, 42), face.new(33, 29, 30), face.new(12, 13, 11), face.new(43, 44, 45), face.new(43, 46, 44), face.new(43, 47, 46), face.new(43, 45, 47), face.new(45, 46, 47), face.new(44, 46, 45), face.new(48, 49, 50), face.new(49, 48, 51), face.new(52, 49, 51), face.new(53, 49, 52), face.new(52, 54, 53), face.new(54, 52, 55), face.new(54, 55, 48), face.new(54, 48, 50), face.new(56, 57, 58), face.new(57, 56, 59), face.new(56, 60, 59), face.new(56, 58, 60), face.new(61, 60, 58), face.new(58, 57, 61), face.new(62, 63, 64), face.new(63, 62, 65), face.new(62, 66, 65), face.new(62, 64, 66), face.new(67, 66, 64), face.new(64, 63, 67), face.new(68, 69, 70), face.new(69, 68, 71), face.new(72, 71, 68), face.new(71, 72, 73), face.new(72, 74, 73), face.new(72, 75, 74), face.new(72, 68, 75), face.new(68, 74, 75), face.new(74, 68, 70), face.new(74, 70, 76), face.new(70, 77, 76), face.new(77, 70, 78), face.new(78, 70, 79), face.new(70, 80, 79), face.new(70, 69, 80), face.new(74, 80, 69), face.new(74, 76, 80), face.new(76, 81, 80), face.new(78, 81, 76), face.new(78, 82, 81), face.new(78, 79, 82), face.new(79, 81, 82), face.new(79, 80, 81), face.new(77, 78, 76), face.new(73, 74, 69), face.new(71, 73, 69), face.new(83, 84, 85), face.new(84, 83, 86), face.new(83, 87, 86), face.new(83, 85, 87), face.new(85, 86, 87), face.new(86, 85, 84), face.new(88, 89, 90), face.new(89, 88, 91), face.new(92, 89, 91), face.new(93, 89, 92), face.new(94, 93, 92), face.new(93, 94, 95), face.new(95, 94, 88), face.new(95, 88, 90), face.new(96, 97, 98), face.new(97, 99, 98), face.new(99, 100, 98), face.new(101, 100, 99), face.new(96, 100, 101), face.new(96, 98, 100), face.new(102, 103, 104), face.new(103, 105, 104), face.new(105, 106, 104), face.new(107, 106, 105), face.new(102, 106, 107), face.new(102, 104, 106), face.new(108, 109, 110), face.new(108, 111, 109), face.new(108, 112, 111), face.new(112, 108, 113), face.new(108, 114, 113), face.new(108, 110, 114), face.new(110, 115, 114), face.new(116, 115, 110), face.new(116, 117, 115), face.new(116, 118, 117), face.new(116, 119, 118), face.new(116, 110, 119), face.new(110, 109, 119), face.new(119, 109, 117), face.new(109, 120, 117), face.new(109, 115, 120), face.new(111, 115, 109), face.new(114, 115, 111), face.new(111, 121, 114), face.new(122, 121, 111), face.new(114, 121, 122), face.new(114, 122, 113), face.new(112, 113, 122), face.new(111, 112, 122), face.new(115, 117, 120), face.new(118, 119, 117) ) list = input.string("Ball", "3D Scene", ["Pin", "Ball", "Arwing", "Pin and Ball"]) offset_x = input.int(0, "offset x") * (time-time[1]) offset_y = input.float(0, "offset y") object_x = input.float(0) object_y = input.float(0) object_z = input.float(0) object_theta_x = input.float(0) object_theta_y = input.float(0) object_theta_z = input.float(0) object_scale_x = input.float(0.5) object_scale_y = input.float(0.5) object_scale_z = input.float(0.5) x_pos = input.float(0) y_pos = input.float(0) z_pos = input.float(-2) x_look = input.float(0) y_look = input.float(0) z_look = input.float(0) fov = input.float(45) near = input.float(0.1) far = input.float(20) Camera = camera.new(vector3.new(x_pos, y_pos, z_pos), vector3.new(x_look, y_look, z_look), fov, vector2.new(1, 1), vector2.new(near, far)) pin_mesh = mesh.new(pin_vertex_list, pin_face_list) ball_mesh = mesh.new(ball_vertex_list, ball_face_list) arwing_mesh = mesh.new(Arwing_vertex_list, Arwing_face_list) pin = object.new(pin_mesh, location.new(vector3.new(object_x, object_y, object_z), vector3.new(object_theta_x, object_theta_y, object_theta_z), vector3.new(object_scale_x, object_scale_y, object_scale_z))) pin_offset = object.new(pin_mesh, location.new(vector3.new(object_x + 1, object_y, object_z), vector3.new(object_theta_x, object_theta_y, object_theta_z), vector3.new(object_scale_x, object_scale_y, object_scale_z))) ball = object.new(ball_mesh, location.new(vector3.new(object_x, object_y, object_z), vector3.new(object_theta_x, object_theta_y, object_theta_z), vector3.new(object_scale_x, object_scale_y, object_scale_z))) arwing = object.new(arwing_mesh, location.new(vector3.new(object_x, object_y, object_z), vector3.new(object_theta_x, object_theta_y, object_theta_z), vector3.new(object_scale_x, object_scale_y, object_scale_z))) pin_scene = array.from(pin) ball_scene = array.from(ball) arwing_scene = array.from(arwing) pin_ball_scene = array.from(pin_offset, ball) scene_list = switch list "Pin" => pin_scene "Ball" => ball_scene "Arwing" => arwing_scene "Pin and Ball" => pin_ball_scene render(scene_list, Camera, offset_x, offset_y) // plot(ratio) //python program to convert .obj files into 3D files for the engine // def parse_obj(file_path): // vertices = [] // faces = [] // with open(file_path, 'r') as file: // for line in file: // if line.startswith('v '): // coords = list(map(float, line[2:].split())) // vertices.append(coords) // elif line.startswith('f '): // indices = [int(s.split('/')[0]) - 1 for s in line[2:].split()] // faces.append(indices) // return vertices, faces // def convert_to_custom_format(vertices, faces, vertex_var_name, face_var_name): // vertex_lines = [f"vector4.new({v[0]}, {v[1]}, {v[2]}, 1)," for v in vertices] // vertex_data = f"{vertex_var_name} = array.from(\n " + "\n ".join(vertex_lines) + "\n)" // face_lines = [f"face.new({f[0]}, {f[1]}, {f[2]})," for f in faces] // face_data = f"{face_var_name} = array.from(\n " + "\n ".join(face_lines) + "\n)" // return vertex_data + "\n\n" + face_data // def main(): // input_obj_file = "C:/object.obj" // output_custom_file = "C:/object.txt" // vertex_var_name = "object_vertex_list" // face_var_name = "object_face_list" // vertices, faces = parse_obj(input_obj_file) // custom_data = convert_to_custom_format(vertices, faces, vertex_var_name, face_var_name) // with open(output_custom_file, 'w') as output_file: // output_file.write(custom_data) // if __name__ == "__main__": // main()