#include "wiArchive.h" #include "wiResourceManager.h" #include "wiScene.h" #include "wiInitializer.h" #include "wiApplication.h" #include "wiECS.h" #include "wiRenderer.h" #include #include #include #include #include namespace py = pybind11; PYBIND11_MAKE_OPAQUE(wi::vector); PYBIND11_MAKE_OPAQUE(wi::vector); PYBIND11_MAKE_OPAQUE(wi::vector); PYBIND11_MAKE_OPAQUE(wi::vector); PYBIND11_MAKE_OPAQUE(wi::vector); PYBIND11_MAKE_OPAQUE(wi::vector); PYBIND11_MAKE_OPAQUE(wi::vector); PYBIND11_MAKE_OPAQUE(wi::scene::NameComponent); PYBIND11_MAKE_OPAQUE(wi::scene::MeshComponent); PYBIND11_MAKE_OPAQUE(wi::scene::MaterialComponent); PYBIND11_MAKE_OPAQUE(wi::scene::TransformComponent); PYBIND11_MAKE_OPAQUE(wi::scene::ObjectComponent); static wi::Application app; static sdl2::sdlsystem_ptr_t sdl_system { nullptr, nullptr }; static sdl2::window_ptr_t sdl_window { nullptr, nullptr }; void init_wicked(py::module_& mod) { static bool INIT_DONE = false; mod.def("init", []() { return; if (INIT_DONE) return; INIT_DONE = true; //TODO we can probably initialize less stuff sdl_system = sdl2::make_sdlsystem(SDL_INIT_VIDEO); if (!sdl_system) { throw sdl2::SDLError("Error creating SDL2 system"); } sdl_window = sdl2::make_window("WickedBlenderExporter", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 50, 50, SDL_WINDOW_HIDDEN | SDL_WINDOW_VULKAN); if (!sdl_window) { throw sdl2::SDLError("Error creating window"); } app.SetWindow(sdl_window.get()); wi::renderer::SetShaderSourcePath(std::string{WICKED_ROOT_DIR"/WickedEngine/shaders/"}); wi::renderer::SetShaderPath(std::string{WICKED_ROOT_DIR"/build/BlenderExporter/shaders/"}); //wi::initializer::InitializeComponentsImmediate(); app.Initialize(); }); mod.def("deinit", [](){ //TODO INIT_DONE = false; }); } void export_primitives(py::module_& mod) { py::class_(mod, "XMFLOAT2") .def(py::init<>()) .def(py::init()) ; py::class_(mod, "XMFLOAT3") .def(py::init<>()) .def(py::init()) ; py::class_(mod, "XMFLOAT4") .def(py::init<>()) .def(py::init()) ; py::class_(mod, "XMUINT4") .def(py::init<>()) .def(py::init()) ; py::bind_vector>(mod, "VectorXMFLOAT2"); py::bind_vector>(mod, "VectorXMFLOAT3"); py::bind_vector>(mod, "VectorXMFLOAT4"); py::bind_vector>(mod, "VectorXMUINT4"); py::bind_vector>(mod, "VectorU8"); py::bind_vector>(mod, "VectorU32"); py::bind_vector>(mod, "VectorMeshSubset"); } void export_resourcemanager(py::module_& mod) { py::enum_(mod, "ResourceManagerMode") .value("DISCARD_FILEDATA_AFTER_LOAD", wi::resourcemanager::Mode::DISCARD_FILEDATA_AFTER_LOAD) .value("ALLOW_RETAIN_FILEDATA", wi::resourcemanager::Mode::ALLOW_RETAIN_FILEDATA) .value("ALLOW_RETAIN_FILEDATA_BUT_DISABLE_EMBEDDING", wi::resourcemanager::Mode::ALLOW_RETAIN_FILEDATA_BUT_DISABLE_EMBEDDING) .export_values(); mod.def("resourcemanager_SetMode", &wi::resourcemanager::SetMode); } void export_Archive(py::module_& mod) { py::class_(mod, "Archive") .def(py::init<>()) .def(py::init()) .def("IsOpen", &wi::Archive::IsOpen) .def("Close", &wi::Archive::Close) .def("SaveFile", &wi::Archive::SaveFile) .def("SaveHeaderFile", &wi::Archive::SaveHeaderFile) ; } void export_Scene(py::module_& mod) { py::class_(mod, "Scene") .def(py::init<>()) //.def_readwrite("componentLibrary", &wi::scene::Scene::componentLibrary) .def("names", [](const wi::scene::Scene &_this){ return &_this.names; }) .def("meshes", [](const wi::scene::Scene &_this){ return &_this.meshes; }) .def("transforms", [](const wi::scene::Scene &_this){ return &_this.transforms; }) .def("materials", [](const wi::scene::Scene &_this){ return &_this.materials; }) .def("objects", [](const wi::scene::Scene &_this){ return &_this.objects; }) .def("Serialize", &wi::scene::Scene::Serialize) .def("Entity_CreateTransform", &wi::scene::Scene::Entity_CreateTransform) .def("Entity_CreateMaterial", &wi::scene::Scene::Entity_CreateMaterial) .def("Entity_CreateObject", &wi::scene::Scene::Entity_CreateObject) .def("Entity_CreateMesh", &wi::scene::Scene::Entity_CreateMesh) .def("Entity_CreateLight", &wi::scene::Scene::Entity_CreateLight) .def("Entity_CreateForce", &wi::scene::Scene::Entity_CreateForce) .def("Entity_CreateEnvironmentProbe", &wi::scene::Scene::Entity_CreateEnvironmentProbe) .def("Entity_CreateDecal", &wi::scene::Scene::Entity_CreateDecal) .def("Entity_CreateCamera", &wi::scene::Scene::Entity_CreateCamera) .def("Entity_CreateEmitter", &wi::scene::Scene::Entity_CreateEmitter) .def("Entity_CreateHair", &wi::scene::Scene::Entity_CreateHair) .def("Entity_CreateSound", &wi::scene::Scene::Entity_CreateSound) .def("Entity_CreateVideo", &wi::scene::Scene::Entity_CreateVideo) .def("Entity_CreateCube", &wi::scene::Scene::Entity_CreateCube) .def("Entity_CreatePlane", &wi::scene::Scene::Entity_CreatePlane) .def("Entity_CreateSphere", &wi::scene::Scene::Entity_CreateSphere) .def("Component_Attach", &wi::scene::Scene::Component_Attach) .def("Component_Attach", [](wi::scene::Scene& _this, wi::ecs::Entity entity, wi::ecs::Entity parent) { return _this.Component_Attach(entity, parent); }) .def("Component_Detach", &wi::scene::Scene::Component_Detach) .def("Component_DetachChildren", &wi::scene::Scene::Component_DetachChildren) .def("RunAnimationUpdateSystem", &wi::scene::Scene::RunAnimationUpdateSystem) .def("RunTransformUpdateSystem", &wi::scene::Scene::RunTransformUpdateSystem) .def("RunHierarchyUpdateSystem", &wi::scene::Scene::RunHierarchyUpdateSystem) .def("RunExpressionUpdateSystem", &wi::scene::Scene::RunExpressionUpdateSystem) .def("RunProceduralAnimationUpdateSystem", &wi::scene::Scene::RunProceduralAnimationUpdateSystem) .def("RunArmatureUpdateSystem", &wi::scene::Scene::RunArmatureUpdateSystem) .def("RunMeshUpdateSystem", &wi::scene::Scene::RunMeshUpdateSystem) .def("RunMaterialUpdateSystem", &wi::scene::Scene::RunMaterialUpdateSystem) .def("RunImpostorUpdateSystem", &wi::scene::Scene::RunImpostorUpdateSystem) .def("RunObjectUpdateSystem", &wi::scene::Scene::RunObjectUpdateSystem) .def("RunCameraUpdateSystem", &wi::scene::Scene::RunCameraUpdateSystem) .def("RunDecalUpdateSystem", &wi::scene::Scene::RunDecalUpdateSystem) .def("RunProbeUpdateSystem", &wi::scene::Scene::RunProbeUpdateSystem) .def("RunForceUpdateSystem", &wi::scene::Scene::RunForceUpdateSystem) .def("RunLightUpdateSystem", &wi::scene::Scene::RunLightUpdateSystem) .def("RunParticleUpdateSystem", &wi::scene::Scene::RunParticleUpdateSystem) .def("RunWeatherUpdateSystem", &wi::scene::Scene::RunWeatherUpdateSystem) .def("RunSoundUpdateSystem", &wi::scene::Scene::RunSoundUpdateSystem) .def("RunVideoUpdateSystem", &wi::scene::Scene::RunVideoUpdateSystem) .def("RunScriptUpdateSystem", &wi::scene::Scene::RunScriptUpdateSystem) .def("RunSpriteUpdateSystem", &wi::scene::Scene::RunSpriteUpdateSystem) .def("RunFontUpdateSystem", &wi::scene::Scene::RunFontUpdateSystem) ; } template void register_component_manager(py::module_& mod, const char* name) { typedef wi::ecs::ComponentManager Manager; py::class_>(mod, name) .def("Clear", &Manager::Clear) // .def("Copy", &Manager::Copy) // .def("Merge", &Manager::Merge) .def("Create", &Manager::Create) .def("Remove", &Manager::Remove) .def("MoveItem", &Manager::MoveItem) .def("Contains", &Manager::Contains) .def("GetComponent", [](Manager* _this, wi::ecs::Entity entity) { return static_cast(_this->GetComponent(entity)); }) .def("GetIndex", &Manager::GetIndex) .def("GetCount", [](const Manager* _this) { return _this->GetCount(); }) .def("GetEntity", &Manager::GetEntity) .def("GetEntityArray", &Manager::GetEntityArray) .def("GetComponentArray", &Manager::GetComponentArray) ; } void export_ECS(py::module_& mod) { using namespace wi::ecs; using namespace wi::scene; // py::class_(mod, "ComponentLibrary"); py::class_(mod, "Entity"); mod.def("CreateEntity", &CreateEntity); //maybe Components need to not handle memory by python // `std::unique_ptr` py::class_(mod, "MeshComponent_MeshSubset") .def(py::init<>()) .def_readwrite("materialID", &MeshComponent::MeshSubset::materialID) .def_readwrite("indexOffset", &MeshComponent::MeshSubset::indexOffset) .def_readwrite("indexCount", &MeshComponent::MeshSubset::indexCount) .def_readwrite("materialIndex", &MeshComponent::MeshSubset::materialIndex) ; py::class_>(mod, "NameComponent") .def_readwrite("name", &NameComponent::name) ; py::class_>(mod, "MeshComponent") .def_readwrite("vertex_positions", &MeshComponent::vertex_positions) .def_readwrite("vertex_normals", &MeshComponent::vertex_normals) .def_readwrite("vertex_tangents", &MeshComponent::vertex_tangents) .def_readwrite("vertex_uvset_0", &MeshComponent::vertex_uvset_0) .def_readwrite("vertex_uvset_1", &MeshComponent::vertex_uvset_1) .def_readwrite("vertex_boneindices", &MeshComponent::vertex_boneindices) .def_readwrite("vertex_boneweights", &MeshComponent::vertex_boneweights) .def_readwrite("vertex_atlas", &MeshComponent::vertex_atlas) .def_readwrite("vertex_colors", &MeshComponent::vertex_colors) .def_readwrite("vertex_windweights", &MeshComponent::vertex_windweights) .def_readwrite("indices", &MeshComponent::indices) .def_readwrite("subsets", &MeshComponent::subsets) .def_readwrite("tessellationFactor", &MeshComponent::tessellationFactor) .def_readwrite("armatureID", &MeshComponent::armatureID) .def("ComputeNormals", &MeshComponent::ComputeNormals) .def("ComputeNormals", &MeshComponent::CreateRenderData) ; py::enum_(mod, "MeshComponentComputeNormals") .value("HARD", MeshComponent::COMPUTE_NORMALS::COMPUTE_NORMALS_HARD) .value("SMOOTH", MeshComponent::COMPUTE_NORMALS::COMPUTE_NORMALS_SMOOTH) .value("SMOOTH_FAST", MeshComponent::COMPUTE_NORMALS::COMPUTE_NORMALS_SMOOTH_FAST) .export_values() ; py::class_(mod, "TransformComponent") .def(py::init<>()) .def_readwrite("scale_local", &TransformComponent::scale_local) .def_readwrite("rotation_local", &TransformComponent::rotation_local) .def_readwrite("translation_local", &TransformComponent::translation_local) .def_readwrite("world", &TransformComponent::world) .def("GetPosition", &TransformComponent::GetPosition) .def("GetRotation", &TransformComponent::GetRotation) .def("GetScale", &TransformComponent::GetScale) .def("GetPositionV", &TransformComponent::GetPositionV) .def("GetRotationV", &TransformComponent::GetRotationV) .def("GetScaleV", &TransformComponent::GetScaleV) .def("GetLocalMatrix", &TransformComponent::GetLocalMatrix) .def("UpdateTransform", &TransformComponent::UpdateTransform) .def("UpdateTransform_Parented", &TransformComponent::UpdateTransform_Parented) .def("ApplyTransform", &TransformComponent::ApplyTransform) .def("ClearTransform", &TransformComponent::ClearTransform) // .def("Translate", &TransformComponent::Translate) // .def("Translate", &TransformComponent::Translate) .def("RotateRollPitchYaw", &TransformComponent::RotateRollPitchYaw) // .def("Rotate", &TransformComponent::Rotate) // .def("Rotate", &TransformComponent::Rotate) // .def("Scale", &TransformComponent::Scale) // .def("Scale", &TransformComponent::Scale) // .def("MatrixTransform", &TransformComponent::MatrixTransform) // .def("MatrixTransform", &TransformComponent::MatrixTransform) .def("Lerp", &TransformComponent::Lerp) .def("CatmullRom", &TransformComponent::CatmullRom) ; py::enum_(mod, "MaterialComponent_SHADERTYPE") .value("PBR", MaterialComponent::SHADERTYPE::SHADERTYPE_PBR) .value("PBR_PLANARREFLECTION", MaterialComponent::SHADERTYPE_PBR_PLANARREFLECTION) .value("PBR_PARALLAXOCCLUSIONMAPPING", MaterialComponent::SHADERTYPE_PBR_PARALLAXOCCLUSIONMAPPING) .value("PBR_ANISOTROPIC", MaterialComponent::SHADERTYPE_PBR_ANISOTROPIC) .value("WATER", MaterialComponent::SHADERTYPE_WATER) .value("CARTOON", MaterialComponent::SHADERTYPE_CARTOON) .value("UNLIT", MaterialComponent::SHADERTYPE_UNLIT) .value("PBR_CLOTH", MaterialComponent::SHADERTYPE_PBR_CLOTH) .value("PBR_CLEARCOAT", MaterialComponent::SHADERTYPE_PBR_CLEARCOAT) .value("PBR_CLOTH_CLEARCOAT", MaterialComponent::SHADERTYPE_PBR_CLOTH_CLEARCOAT) //.value("COUNT", MaterialComponent::SHADERTYPE_COUNT) .export_values() ; py::class_>(mod, "MaterialComponent") .def_readwrite("shaderType", &MaterialComponent::shaderType) //wi::enums::STENCILREF engineStencilRef = wi::enums::STENCILREF_DEFAULT; //uint8_t userStencilRef = 0; //wi::enums::BLENDMODE userBlendMode = wi::enums::BLENDMODE_OPAQUE; .def_readwrite("baseColor", &MaterialComponent::baseColor) .def_readwrite("specularColor", &MaterialComponent::specularColor) .def_readwrite("emissiveColor", &MaterialComponent::emissiveColor) .def_readwrite("subsurfaceScattering", &MaterialComponent::subsurfaceScattering) .def_readwrite("texMulAdd", &MaterialComponent::texMulAdd) .def_readwrite("roughness", &MaterialComponent::roughness) .def_readwrite("reflectance", &MaterialComponent::reflectance) .def_readwrite("metalness", &MaterialComponent::metalness) .def_readwrite("normalMapStrength", &MaterialComponent::normalMapStrength) .def_readwrite("parallaxOcclusionMapping", &MaterialComponent::parallaxOcclusionMapping) .def_readwrite("displacementMapping", &MaterialComponent::displacementMapping) .def_readwrite("refraction", &MaterialComponent::refraction) .def_readwrite("transmission", &MaterialComponent::transmission) .def_readwrite("alphaRef", &MaterialComponent::alphaRef) .def_readwrite("anisotropy_strength", &MaterialComponent::anisotropy_strength) .def_readwrite("anisotropy_rotation", &MaterialComponent::anisotropy_rotation) .def_readwrite("sheenColor", &MaterialComponent::sheenColor) .def_readwrite("sheenRoughness", &MaterialComponent::sheenRoughness) .def_readwrite("clearcoat", &MaterialComponent::clearcoat) .def_readwrite("clearcoatRoughness", &MaterialComponent::clearcoatRoughness) //.def_readwrite("shadingRate", &MaterialComponent::shadingRate) //wi::graphics::ShadingRate .def_readwrite("texAnimDirection", &MaterialComponent::texAnimDirection) .def_readwrite("texAnimFrameRate", &MaterialComponent::texAnimFrameRate) .def_readwrite("texAnimElapsedTime", &MaterialComponent::texAnimElapsedTime) ; py::class_>(mod, "ObjectComponent") .def_readwrite("meshID", &ObjectComponent::meshID) .def_readwrite("cascadeMask", &ObjectComponent::cascadeMask) .def_readwrite("filterMask", &ObjectComponent::filterMask) .def_readwrite("color", &ObjectComponent::color) .def_readwrite("emissiveColor", &ObjectComponent::emissiveColor) .def_readwrite("userStencilRef", &ObjectComponent::userStencilRef) .def_readwrite("lod_distance_multiplier", &ObjectComponent::lod_distance_multiplier) .def_readwrite("draw_distance", &ObjectComponent::draw_distance) .def_readwrite("lightmapWidth", &ObjectComponent::lightmapWidth) .def_readwrite("lightmapHeight", &ObjectComponent::lightmapHeight) .def_readwrite("lightmapTextureData", &ObjectComponent::lightmapTextureData) .def_readwrite("sort_priority", &ObjectComponent::sort_priority) .def_readwrite("filterMaskDynamic", &ObjectComponent::filterMaskDynamic) .def_readwrite("lightmap", &ObjectComponent::lightmap) .def_readwrite("lightmapIterationCount", &ObjectComponent::lightmapIterationCount) .def_readwrite("center", &ObjectComponent::center) .def_readwrite("radius", &ObjectComponent::radius) .def_readwrite("fadeDistance", &ObjectComponent::fadeDistance) .def_readwrite("lod", &ObjectComponent::lod) .def_readwrite("mesh_index", &ObjectComponent::mesh_index) .def_readwrite("sort_bits", &ObjectComponent::sort_bits) ; // MANAGERS ------------------------------------------- register_component_manager(mod, "NameComponentManager"); register_component_manager(mod, "TransformComponentManager"); register_component_manager(mod, "MeshComponentManager"); register_component_manager(mod, "MaterialComponentManager"); register_component_manager(mod, "ObjectComponentManager"); } PYBIND11_MODULE(pywickedengine, mod) { init_wicked(mod); export_primitives(mod); export_resourcemanager(mod); export_ECS(mod); export_Archive(mod); export_Scene(mod); }