// // MY CLASS TYPE // // Copyright © 2009-2015 Benjamin "Touky" Huet <huet.benjamin@gmail.com> // // This program is free software. It comes without any warranty, to // the extent permitted by applicable law. You can redistribute it // and/or modify it under the terms of the Do What the Fuck You Want // to Public License, Version 2, as published by the WTFPL Task Force. // See http://www.wtfpl.net/ for more details. // #if HAVE_CONFIG_H # include "config.h" #endif #include <cstdio> #include <lol/engine.h> #include "loldebug.h" using namespace lol; //----------------------------------------------------------------------------- EasyMeshLuaLoader::EasyMeshLuaLoader() : LuaLoader() { LuaState* l = GetLuaState(); //Registering demo object LuaObjectDef::Register<EasyMeshLuaObject>(l); } //----------------------------------------------------------------------------- EasyMeshLuaLoader::~EasyMeshLuaLoader() { } //----------------------------------------------------------------------------- static array<EasyMeshLuaObject*> g_instances; void EasyMeshLuaLoader::Store(LuaObject* obj) { EasyMeshLuaObject* ezm = static_cast<EasyMeshLuaObject*>(obj); g_instances << ezm; } //----------------------------------------------------------------------------- array<EasyMeshLuaObject*>& EasyMeshLuaLoader::GetInstances() { return g_instances; } //----------------------------------------------------------------------------- map<String, EasyMeshLuaObject*> EasyMeshLuaLoader::m_meshes; void EasyMeshLuaLoader::RegisterMesh(EasyMeshLuaObject* mesh, String const& name) { m_meshes[name] = mesh; } //----------------------------------------------------------------------------- bool EasyMeshLuaLoader::GetRegisteredMeshes(map<String, EasyMeshLuaObject*>& meshes) { meshes = m_meshes; return !!m_meshes.count(); } //----------------------------------------------------------------------------- EasyMeshLuaObject::EasyMeshLuaObject(String const& name) : LuaObject() { if (!!name.count()) EasyMeshLuaLoader::RegisterMesh(this, name); } //----------------------------------------------------------------------------- EasyMeshLuaObject::~EasyMeshLuaObject() { } //----------------------------------------------------------------------------- EasyMeshLuaObject* EasyMeshLuaObject::New(LuaState* l, int arg_nb) { UNUSED(l); UNUSED(arg_nb); LuaStack s(l); LuaString n("", true); s >> n; return new EasyMeshLuaObject(n()); } //----------------------------------------------------------------------------- const LuaObjectLib* EasyMeshLuaObject::GetLib() { typedef EasyMeshLuaObject EMLO; static const LuaObjectLib lib = LuaObjectLib( "EasyMesh", //Statics { { nullptr, nullptr } }, //Methods { //----------------------------------------------------------------- { "AddCylinder", &EMLO::AppendCylinder }, { "ac", &EMLO::AppendCylinder }, { "AddSphere", &EMLO::AppendSphere }, { "asph", &EMLO::AppendSphere }, { "AddCapsule", &EMLO::AppendCapsule }, { "acap", &EMLO::AppendCapsule }, { "AddTorus", &EMLO::AppendTorus }, { "ato", &EMLO::AppendTorus }, { "AddBox", &EMLO::AppendBox }, { "ab", &EMLO::AppendBox }, { "AddStar", &EMLO::AppendStar }, { "as", &EMLO::AppendStar }, { "AddExpandedStar", &EMLO::AppendExpandedStar }, { "aes", &EMLO::AppendExpandedStar }, { "AddDisc", &EMLO::AppendDisc }, { "ad", &EMLO::AppendDisc }, { "AddTriangle", &EMLO::AppendSimpleTriangle }, { "at", &EMLO::AppendSimpleTriangle }, { "AddQuad", &EMLO::AppendSimpleQuad }, { "aq", &EMLO::AppendSimpleQuad }, { "AddCog", &EMLO::AppendCog }, { "acog", &EMLO::AppendCog }, //----------------------------------------------------------------- { "SetColor", &EMLO::SetCurColor }, { "sc", &EMLO::SetCurColor }, { "SetColorA", &EMLO::SetCurColorA }, { "sca", &EMLO::SetCurColorA }, { "SetColorB", &EMLO::SetCurColorB }, { "scb", &EMLO::SetCurColorB }, { "SetColorV", &EMLO::SetVertColor }, { "scv", &EMLO::SetVertColor }, //----------------------------------------------------------------- { "TranslateX", &EMLO::TranslateX }, { "tx", &EMLO::TranslateX }, { "TranslateY", &EMLO::TranslateY }, { "ty", &EMLO::TranslateY }, { "TranslateZ", &EMLO::TranslateZ }, { "tz", &EMLO::TranslateZ }, { "Translate", &Translate }, { "t", &Translate }, //----------------------------------------------------------------- { "RotateX", &EMLO::RotateX }, { "rx", &EMLO::RotateX }, { "RotateY", &EMLO::RotateY }, { "ry", &EMLO::RotateY }, { "RotateZ", &EMLO::RotateZ }, { "rz", &EMLO::RotateZ }, { "Rotate", &Rotate }, { "r", &Rotate }, //----------------------------------------------------------------- { "ScaleX", &EMLO::ScaleX }, { "sx", &EMLO::ScaleX }, { "ScaleY", &EMLO::ScaleY }, { "sy", &EMLO::ScaleY }, { "ScaleZ", &EMLO::ScaleZ }, { "sz", &EMLO::ScaleZ }, { "Scale", &EMLO::Scale }, { "s", &EMLO::Scale }, //----------------------------------------------------------------- { "RadialJitter", &EMLO::RadialJitter }, { "rj", &EMLO::RadialJitter }, //----------------------------------------------------------------- { "TaperX", &EMLO::TaperX }, { "tax", &EMLO::TaperX }, { "TaperY", &EMLO::TaperY }, { "tay", &EMLO::TaperY }, { "TaperZ", &EMLO::TaperZ }, { "taz", &EMLO::TaperZ }, //----------------------------------------------------------------- { "TwistX", &EMLO::TwistX }, { "twx", &EMLO::TwistX }, { "TwistY", &EMLO::TwistY }, { "twy", &EMLO::TwistY }, { "TwistZ", &EMLO::TwistZ }, { "twz", &EMLO::TwistZ }, //----------------------------------------------------------------- { "ShearX", &EMLO::ShearX }, { "shx", &EMLO::ShearX }, { "ShearY", &EMLO::ShearY }, { "shy", &EMLO::ShearY }, { "ShearZ", &EMLO::ShearZ }, { "shz", &EMLO::ShearZ }, //----------------------------------------------------------------- { "StretchX", &EMLO::StretchX }, { "stx", &EMLO::StretchX }, { "StretchY", &EMLO::StretchY }, { "sty", &EMLO::StretchY }, { "StretchZ", &EMLO::StretchZ }, { "stz", &EMLO::StretchZ }, //----------------------------------------------------------------- { "BendXY", &EMLO::BendXY }, { "bdxy", &EMLO::BendXY }, { "BendXZ", &EMLO::BendXZ }, { "bdxz", &EMLO::BendXZ }, { "BendYX", &EMLO::BendYX }, { "bdyx", &EMLO::BendYX }, { "BendYZ", &EMLO::BendYZ }, { "bdyz", &EMLO::BendYZ }, { "BendZX", &EMLO::BendZX }, { "bdzx", &EMLO::BendZX }, { "BendZY", &EMLO::BendZY }, { "bdzy", &EMLO::BendZY }, //----------------------------------------------------------------- { "MirrorX", &EMLO::MirrorX }, { "mx", &EMLO::MirrorX }, { "MirrorY", &EMLO::MirrorY }, { "my", &EMLO::MirrorY }, { "MirrorZ", &EMLO::MirrorZ }, { "mz", &EMLO::MirrorZ }, //----------------------------------------------------------------- { "Loop", &EMLO::LoopStart }, { "lp", &EMLO::LoopStart }, { "LoopDo", &EMLO::LoopEnd }, { "ld", &EMLO::LoopEnd }, { "BraceOpen", &EMLO::OpenBrace }, { "bop", &EMLO::OpenBrace }, { "BraceClose", &EMLO::CloseBrace }, { "bcl", &EMLO::CloseBrace }, //----------------------------------------------------------------- { "VerticeMerge", &EMLO::VerticesMerge }, { "vm", &EMLO::VerticesMerge }, { "VerticeSeparate", &EMLO::VerticesSeparate }, { "vs", &EMLO::VerticesSeparate }, { "VerticesCleanup", &EMLO::VerticesCleanup }, { "vc", &EMLO::VerticesCleanup }, //----------------------------------------------------------------- { "Duplicate", &EMLO::Duplicate }, { "dup", &EMLO::Duplicate }, { "Smooth", &EMLO::Smooth }, { "smth", &EMLO::Smooth }, { "SplitTriangles", &EMLO::SplitTriangles }, { "splt", &EMLO::SplitTriangles }, { "Chamfer", &EMLO::Chamfer }, { "cf", &EMLO::Chamfer }, //----------------------------------------------------------------- { "ToggleScaleWinding", &EMLO::ToggleScaleWinding }, { "tsw", &EMLO::ToggleScaleWinding }, { "ToggleQuadWeighting", &EMLO::ToggleQuadWeighting }, { "tqw", &EMLO::ToggleQuadWeighting }, { "TogglePostBuildNormal", &EMLO::TogglePostBuildNormal }, { "tpbn", &EMLO::TogglePostBuildNormal }, { "ToggleVerticeNoCleanup", &EMLO::ToggleVerticeNoCleanup }, { "tvnc", &EMLO::ToggleVerticeNoCleanup }, //----------------------------------------------------------------- }, //Variables { { nullptr, nullptr, nullptr } }); return &lib; } //----------------------------------------------------------------------------- bool EasyMesh::Compile(char const *command, bool Execute) { bool res = false; // FIXME: make this work again #if 0 EasyMeshCompiler mc(*this); BD()->Enable(MeshBuildOperation::CommandRecording); if ((res = mc.ParseString(command))) { BD()->Disable(MeshBuildOperation::CommandRecording); if (Execute) ExecuteCmdStack(); } #endif return res; } //----------------------------------------------------------------------------- #define EZSET(M0) BD()->CmdStack().GetValue(M0); #define EZDEF_1(T0) T0 m0; EZSET(m0) #define EZDEF_2(T0, T1) EZDEF_1(T0) T1 m1; EZSET(m1) #define EZDEF_3(T0, T1, T2) EZDEF_2(T0, T1) T2 m2; EZSET(m2) #define EZDEF_4(T0, T1, T2, T3) EZDEF_3(T0, T1, T2) T3 m3; EZSET(m3) #define EZDEF_5(T0, T1, T2, T3, T4) EZDEF_4(T0, T1, T2, T3) T4 m4; EZSET(m4) #define EZDEF_6(T0, T1, T2, T3, T4, T5) EZDEF_5(T0, T1, T2, T3, T4) T5 m5; EZSET(m5) #define EZDEF_7(T0, T1, T2, T3, T4, T5, T6) EZDEF_6(T0, T1, T2, T3, T4, T5) T6 m6; EZSET(m6) #define EZDEF_8(T0, T1, T2, T3, T4, T5, T6, T7) EZDEF_7(T0, T1, T2, T3, T4, T5, T6) T7 m7; EZSET(m7) #define EZDEF_9(T0, T1, T2, T3, T4, T5, T6, T7, T8) EZDEF_8(T0, T1, T2, T3, T4, T5, T6, T7) T8 m8; EZSET(m8) #define EZDEF_10(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) EZDEF_9(T0, T1, T2, T3, T4, T5, T6, T7, T8) T9 m9; EZSET(m9) //---- #define EZCALL_1(F) F(); #define EZCALL_2(F, T0) EZDEF_1(T0) F(m0); #define EZCALL_3(F, T0, T1) EZDEF_2(T0, T1) F(m0, m1); #define EZCALL_4(F, T0, T1, T2) EZDEF_3(T0, T1, T2) F(m0, m1, m2); #define EZCALL_5(F, T0, T1, T2, T3) EZDEF_4(T0, T1, T2, T3) F(m0, m1, m2, m3); #define EZCALL_6(F, T0, T1, T2, T3, T4) EZDEF_5(T0, T1, T2, T3, T4) F(m0, m1, m2, m3, m4); #define EZCALL_7(F, T0, T1, T2, T3, T4, T5) EZDEF_6(T0, T1, T2, T3, T4, T5) F(m0, m1, m2, m3, m4, m5); #define EZCALL_8(F, T0, T1, T2, T3, T4, T5, T6) EZDEF_7(T0, T1, T2, T3, T4, T5, T6) F(m0, m1, m2, m3, m4, m5, m6); #define EZCALL_9(F, T0, T1, T2, T3, T4, T5, T6, T7) EZDEF_8(T0, T1, T2, T3, T4, T5, T6, T7) F(m0, m1, m2, m3, m4, m5, m6, m7); #define EZCALL_10(F, T0, T1, T2, T3, T4, T5, T6, T7, T8) EZDEF_9(T0, T1, T2, T3, T4, T5, T6, T7, T8) F(m0, m1, m2, m3, m4, m5, m6, m7, m8); #define EZCALL_11(F, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) EZDEF_10(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9) F(m0, m1, m2, m3, m4, m5, m6, m7, m8, m9); //---- #define EZM_CALL_FUNC(...) \ LOL_CALL(LOL_CAT(EZCALL_, LOL_CALL(LOL_COUNT_TO_12, (__VA_ARGS__))), (__VA_ARGS__)) //----------------------------------------------------------------------------- void EasyMesh::ExecuteCmdStack(bool ExecAllStack) { #define DO_EXEC_CMD(MESH_CMD, FUNC_PARAMS) \ case EasyMeshCmdType::MESH_CMD: \ { EZM_CALL_FUNC FUNC_PARAMS; break; } BD()->Enable(MeshBuildOperation::CommandExecution); if (ExecAllStack) BD()->Cmdi() = 0; for (; BD()->Cmdi() < BD()->CmdStack().GetCmdNb() && BD()->CmdExecNb() != 0; ++BD()->Cmdi()) { if (BD()->CmdExecNb() > 0) --BD()->CmdExecNb(); switch (BD()->CmdStack().GetCmd(BD()->Cmdi())) { DO_EXEC_CMD(MeshCsg, (MeshCsg, CSGUsage)) DO_EXEC_CMD(LoopStart, (LoopStart, int)) DO_EXEC_CMD(LoopEnd, (LoopEnd)) DO_EXEC_CMD(OpenBrace, (OpenBrace)) DO_EXEC_CMD(CloseBrace, (CloseBrace)) DO_EXEC_CMD(ScaleWinding, (ToggleScaleWinding)) DO_EXEC_CMD(QuadWeighting, (ToggleQuadWeighting)) DO_EXEC_CMD(PostBuildNormal, (TogglePostBuildNormal)) DO_EXEC_CMD(PreventVertCleanup, (ToggleVerticeNoCleanup)) DO_EXEC_CMD(VerticesMerge, (VerticesMerge)) DO_EXEC_CMD(VerticesSeparate, (VerticesSeparate)) DO_EXEC_CMD(SetColorA, (SetCurColorA, vec4)) DO_EXEC_CMD(SetColorB, (SetCurColorB, vec4)) DO_EXEC_CMD(SetVertColor, (SetVertColor, vec4)) DO_EXEC_CMD(Translate, (Translate, vec3)) DO_EXEC_CMD(Rotate, (Rotate, float, vec3)) DO_EXEC_CMD(RadialJitter, (RadialJitter, float)) DO_EXEC_CMD(MeshTranform, (DoMeshTransform, MeshTransform, Axis, Axis, float, float, float, bool)) DO_EXEC_CMD(Scale, (Scale, vec3)) DO_EXEC_CMD(DupAndScale, (DupAndScale, vec3, bool)) DO_EXEC_CMD(Chamfer, (Chamfer, float)) DO_EXEC_CMD(SplitTriangles, (SplitTriangles, int)) DO_EXEC_CMD(SmoothMesh, (SmoothMesh, int, int, int)) DO_EXEC_CMD(AppendCylinder, (AppendCylinder, int, float, float, float, bool, bool, bool)) DO_EXEC_CMD(AppendCapsule, (AppendCapsule, int, float, float)) DO_EXEC_CMD(AppendTorus, (AppendTorus, int, float, float)) DO_EXEC_CMD(AppendBox, (AppendBox, vec3, float, bool)) DO_EXEC_CMD(AppendStar, (AppendStar, int, float, float, bool, bool)) DO_EXEC_CMD(AppendExpandedStar, (AppendExpandedStar, int, float, float, float)) DO_EXEC_CMD(AppendDisc, (AppendDisc, int, float, bool)) DO_EXEC_CMD(AppendSimpleTriangle, (AppendSimpleTriangle, float, bool)) DO_EXEC_CMD(AppendSimpleQuad, (AppendSimpleQuad, vec2, vec2, float, bool)) DO_EXEC_CMD(AppendCog, (AppendCog, int, float, float, float, float, float, float, float, float, bool)) default: ASSERT(0, "Unknown command pseudo bytecode"); } } BD()->Disable(MeshBuildOperation::CommandExecution); if (!BD()->IsEnabled(MeshBuildOperation::PreventVertCleanup)) VerticesCleanup(); if (BD()->IsEnabled(MeshBuildOperation::PostBuildComputeNormals)) ComputeNormals(0, m_indices.count()); BD()->Disable(MeshBuildOperation::PostBuildComputeNormals); BD()->Disable(MeshBuildOperation::PreventVertCleanup); if (BD()->CmdExecNb() > 0) BD()->CmdExecNb() = -1; }