diff --git a/src/Core/Crawl.qrc b/src/Core/Crawl.qrc index f13c238..49e3d61 100644 --- a/src/Core/Crawl.qrc +++ b/src/Core/Crawl.qrc @@ -13,5 +13,6 @@ CrawlModule/SelectLvlView.qml CrawlModule/DefaultMenu.qml CrawlModule/AbstractMenuView.qml + CrawlModule/Light.qml diff --git a/src/Core/Crawl/defaultlight.cpp b/src/Core/Crawl/defaultlight.cpp new file mode 100644 index 0000000..b307003 --- /dev/null +++ b/src/Core/Crawl/defaultlight.cpp @@ -0,0 +1,30 @@ +//# +//# Copyright (C) 2021-2021 QuasarApp. +//# Distributed under the GPLv3 software license, see the accompanying +//# Everyone is permitted to copy and distribute verbatim copies +//# of this license document, but changing it is not allowed. +//# + +#include "defaultlight.h" + +namespace CRAWL { + +DefaultLight::DefaultLight(): IWorldLight(AUTO_CLASS_NAME) { + setColor("#fff8e7"); + setposition({10000, 0, 10000}); + setRatation(QQuaternion::fromEulerAngles({0,0,-90})); + setLightForce(110); +} + +void DefaultLight::render(unsigned int) { + +} + +void DefaultLight::init() { + +} + +void DefaultLight::onIntersects(const IWorldItem *) { + +} +} diff --git a/src/Core/Crawl/defaultlight.h b/src/Core/Crawl/defaultlight.h new file mode 100644 index 0000000..4764537 --- /dev/null +++ b/src/Core/Crawl/defaultlight.h @@ -0,0 +1,34 @@ +//# +//# Copyright (C) 2021-2021 QuasarApp. +//# Distributed under the GPLv3 software license, see the accompanying +//# Everyone is permitted to copy and distribute verbatim copies +//# of this license document, but changing it is not allowed. +//# + + +#ifndef DEFAULTLIGHT_H +#define DEFAULTLIGHT_H + +#include "iworldlight.h" + +namespace CRAWL { + +/** + * @brief The DefaultLight class This is default implementation of the wirld light. + */ +class DefaultLight final: public IWorldLight +{ + Q_OBJECT +public: + DefaultLight(); + + void render(unsigned int tbfMsec) override; + void init() override; + + // IWorldItem interface +protected: + void onIntersects(const IWorldItem *item) override; +}; + +} +#endif // DEFAULTLIGHT_H diff --git a/src/Core/Crawl/groundclaster.cpp b/src/Core/Crawl/groundclaster.cpp index d2bc391..f559989 100644 --- a/src/Core/Crawl/groundclaster.cpp +++ b/src/Core/Crawl/groundclaster.cpp @@ -31,7 +31,7 @@ void GroundClaster::render(unsigned int ) { auto object = _itemsOrder.at(_index % _itemsOrder.size()); - if (playerObject->position().x() - object->position().x() > + if (playerObject->position().distanceToPoint(object->position()) > newObjectDistance()) { auto prewObject = _itemsOrder.at((_index - 1) % _itemsOrder.size()); diff --git a/src/Core/Crawl/iworld.h b/src/Core/Crawl/iworld.h index 3e22042..d6e0384 100644 --- a/src/Core/Crawl/iworld.h +++ b/src/Core/Crawl/iworld.h @@ -30,6 +30,7 @@ class IPlayer; class GroundClaster; class IControl; class IAI; +class IWorldLight; /** * @brief WorldObjects This is map list of the avalable objects and its count on a lvl-long point. diff --git a/src/Core/Crawl/iworlditem.cpp b/src/Core/Crawl/iworlditem.cpp index 05e2c98..e6a06f3 100644 --- a/src/Core/Crawl/iworlditem.cpp +++ b/src/Core/Crawl/iworlditem.cpp @@ -34,16 +34,16 @@ const IWorldItem *IWorldItem::getPlayer() const { } void IWorldItem::render(unsigned int) { - if (_playerObject->position().x() - _world->cameraReleativePosition().z() > - position().x()) { + if (_playerObject->position().distanceToPoint(position()) > + _world->cameraReleativePosition().z() * 2) { - float dX = _world->cameraReleativePosition().z() * 2 + + float dX = _world->cameraReleativePosition().z() + (rand() % static_cast(_world->cameraReleativePosition().z())); setX(_playerObject->position().x() + dX); - float dY = (rand() % static_cast(_world->cameraReleativePosition().z() * 4) - - _world->cameraReleativePosition().z() * 2); + float dY = (rand() % static_cast(_world->cameraReleativePosition().z() * 2) + - _world->cameraReleativePosition().z()); setY(_playerObject->position().y() + dY); } diff --git a/src/Core/Crawl/iworldlight.cpp b/src/Core/Crawl/iworldlight.cpp new file mode 100644 index 0000000..5a93306 --- /dev/null +++ b/src/Core/Crawl/iworldlight.cpp @@ -0,0 +1,84 @@ +//# +//# Copyright (C) 2021-2021 QuasarApp. +//# Distributed under the GPLv3 software license, see the accompanying +//# Everyone is permitted to copy and distribute verbatim copies +//# of this license document, but changing it is not allowed. +//# + +#include "iworldlight.h" +namespace CRAWL { + +IWorldLight::IWorldLight(const QString &name, + const QString &viewTempalte, + QObject *ptr): + IWorldItem(name, viewTempalte, ptr) { + +} + +int IWorldLight::lightForce() const { + return _lightForce; +} + +void IWorldLight::setLightForce(int newLightForce) { + if (_lightForce == newLightForce) + return; + _lightForce = newLightForce; + emit lightForceChanged(); +} + +bool IWorldLight::castsShadow() const { + return _castsShadow; +} + +void IWorldLight::setCastsShadow(bool newCastsShadow) { + if (_castsShadow == newCastsShadow) + return; + _castsShadow = newCastsShadow; + emit castsShadowChanged(); +} + +float IWorldLight::shadowFactor() const { + return _shadowFactor; +} + +void IWorldLight::setShadowFactor(float newShadowFactor) { + if (qFuzzyCompare(_shadowFactor, newShadowFactor)) + return; + _shadowFactor = newShadowFactor; + emit shadowFactorChanged(); +} + +float IWorldLight::shadowFilter() const { + return _shadowFilter; +} + +void IWorldLight::setShadowFilter(float newShadowFilter) { + if (qFuzzyCompare(_shadowFilter, newShadowFilter)) + return; + _shadowFilter = newShadowFilter; + emit shadowFilterChanged(); +} + +float IWorldLight::shadowMapFar() const { + return _shadowMapFar; +} + +void IWorldLight::setShadowMapFar(float newShadowMapFar) { + if (qFuzzyCompare(_shadowMapFar, newShadowMapFar)) + return; + _shadowMapFar = newShadowMapFar; + emit shadowMapFarChanged(); +} + +float IWorldLight::shadowBias() const { + return _shadowBias; +} + +void IWorldLight::setShadowBias(float newShadowBias) { + if (qFuzzyCompare(_shadowBias, newShadowBias)) + return; + _shadowBias = newShadowBias; + emit shadowBiasChanged(); +} + +} diff --git a/src/Core/Crawl/iworldlight.h b/src/Core/Crawl/iworldlight.h new file mode 100644 index 0000000..d520062 --- /dev/null +++ b/src/Core/Crawl/iworldlight.h @@ -0,0 +1,154 @@ +//# +//# Copyright (C) 2021-2021 QuasarApp. +//# Distributed under the GPLv3 software license, see the accompanying +//# Everyone is permitted to copy and distribute verbatim copies +//# of this license document, but changing it is not allowed. +//# + +#include "iworlditem.h" + +#ifndef IWORLDLIGHT_H +#define IWORLDLIGHT_H + +namespace CRAWL { + +/** + * @brief The IWorldLight class Is base interaface of the light object. + * Override this class for the create own light system for level. + * You need to create own qml file with light. + * + * @note If you wnat to create a new qml file the you need to inherit from the Light.qml file. + */ +class CRAWL_EXPORT IWorldLight: public IWorldItem +{ + Q_OBJECT + Q_PROPERTY(int lightForce READ lightForce WRITE setLightForce NOTIFY lightForceChanged) + Q_PROPERTY(bool castsShadow READ castsShadow WRITE setCastsShadow NOTIFY castsShadowChanged) + Q_PROPERTY(float shadowFactor READ shadowFactor WRITE setShadowFactor NOTIFY shadowFactorChanged) + Q_PROPERTY(float shadowFilter READ shadowFilter WRITE setShadowFilter NOTIFY shadowFilterChanged) + Q_PROPERTY(float shadowMapFar READ shadowMapFar WRITE setShadowMapFar NOTIFY shadowMapFarChanged) + Q_PROPERTY(float shadowBias READ shadowBias WRITE setShadowBias NOTIFY shadowBiasChanged) + +public: + IWorldLight(const QString& name, + const QString& viewTempalte = "qrc:/CrawlModule/Light.qml", + QObject *ptr = nullptr); + + /** + * @brief lightForce This method return light force + * @return light force value. + */ + int lightForce() const; + + /** + * @brief setLightForce This method sets new value for the light force. + * @param newLightForce this is new value of the light force. + */ + void setLightForce(int newLightForce); + + /** + * @brief castsShadow When this property is enabled, the light will cast shadows. The default value is false. + * @return current value of the castsShadow property. + */ + bool castsShadow() const; + + /** + * @brief setCastsShadow This method sets new value of the castsShadow property. for get more information see the castsShadow method. + * @param newCastsShadow this is new value of the castsShadow property. + */ + void setCastsShadow(bool newCastsShadow); + + /** + * @brief shadowFactor This property determines how dark the cast shadows should be. The value range is [0, 100], where 0 mean no shadows and 100 means the light is fully shadowed. The default value is 5. + * @return current value of the shadow factor + */ + float shadowFactor() const; + + /** + * @brief setShadowFactor This method return current value of the shadow factor. + * @param newShadowFactor This is new value of the shadow factor property. + * @note for get more information see the shadowFactor method. + */ + void setShadowFactor(float newShadowFactor); + + /** + * @brief shadowFilter This property sets how much blur is applied to the shadows. The default value is 5. + * @return current value of the shadow filter property. + */ + float shadowFilter() const; + + /** + * @brief setShadowFilter This method return current value of the shadow filter property. + * @param newShadowFilter This is new value of the shadow filter property. + * @note for get more information see the shadowFilter method. + */ + void setShadowFilter(float newShadowFilter); + + /** + * @brief shadowMapFar The property determines the maximum distance for the shadow map. Smaller values improve the precision and effects of the map. The default value is 5000. + * @return current value of the shadow map far property. + */ + float shadowMapFar() const; + + /** + * @brief setShadowMapFar This method return current value of the shadow map far property. + * @param newShadowMapFar This is new value of the shadow map far property. + * @note for get more information see the shadowMapFar method. + */ + void setShadowMapFar(float newShadowMapFar); + + /** + * @brief shadowBias This property is used to tweak the shadowing effect when when objects are casting shadows on themselves. The value range is [-1.0, 1.0]. Generally value inside [-0.1, 0.1] is sufficient. The default value is 0. + * @return current value of the shadow bias property. + */ + float shadowBias() const; + + /** + * @brief setShadowBias This method return current value of the shadow bias property. + * @param newShadowBias This is new value of the shadow bias property. + * @note for get more information see the shadowBias method. + */ + void setShadowBias(float newShadowBias); + +signals: + + /** + * @brief lightForceChanged This signal emits when light force has changed. + */ + void lightForceChanged(); + + /** + * @brief castsShadowChanged This signal emits when the castsShadow property has changed. + */ + void castsShadowChanged(); + + /** + * @brief shadowFactorChanged This signal emits when the shadowFactor propertye has changed. + */ + void shadowFactorChanged(); + + /** + * @brief shadowFilterChanged This signal emits when the shadowFilter propertye has changed. + */ + void shadowFilterChanged(); + + /** + * @brief shadowMapFarChanged This signal emits when the shadowMapFar propertye has changed. + */ + void shadowMapFarChanged(); + + /** + * @brief shadowBiasChanged This signal emits when the shadowBias propertye has changed. + */ + void shadowBiasChanged(); + +private: + int _lightForce = 100; + bool _castsShadow = false; + float _shadowFactor = 5; + float _shadowFilter = 5; + float _shadowMapFar = 5000; + float _shadowBias = 0; +}; +} +#endif // IWORLDLIGHT_H diff --git a/src/Core/CrawlModule/Light.qml b/src/Core/CrawlModule/Light.qml new file mode 100644 index 0000000..4310ef4 --- /dev/null +++ b/src/Core/CrawlModule/Light.qml @@ -0,0 +1,33 @@ +//# +//# Copyright (C) 2021-2021 QuasarApp. +//# Distributed under the GPLv3 software license, see the accompanying +//# Everyone is permitted to copy and distribute verbatim copies +//# of this license document, but changing it is not allowed. +//# + +import QtQuick 2.15 +import QtQuick3D 1.15 + +Node { + id: graphicItem + + property var model: null + property int guiId: (model) ? model.guiId : -1; + + DirectionalLight { + position: Qt.vector3d(0, 0, 0); + brightness: (model)? model.lightForce: 100 + color: (model)? model.color: "#ffffff" + castsShadow: (model)? model.castsShadow: 0 + shadowFactor: (model)? model.shadowFactor: 0 + shadowFilter: (model)? model.shadowFilter: 0 + shadowMapFar: (model)? model.shadowMapFar: 0 + shadowBias: (model)? model.shadowBias: 0 + + } + + rotation: (model)? model.ratation: Qt.quaternion(0, 0, 0, 0) + scale: (model)? model.size: Qt.vector3d(0, 0, 0); + position: (model) ? model.position: Qt.vector3d(0,0,0); + +} diff --git a/src/Core/CrawlModule/Scene.qml b/src/Core/CrawlModule/Scene.qml index 06db392..229cb0d 100644 --- a/src/Core/CrawlModule/Scene.qml +++ b/src/Core/CrawlModule/Scene.qml @@ -27,13 +27,6 @@ View3D { } - DirectionalLight { - position: Qt.vector3d(10000, 0, 10000); - rotation: camera.rotation - - brightness: 120 - } - environment: SceneEnvironment { id: background backgroundMode: SceneEnvironment.SkyBox diff --git a/src/CrawlTestLvl/private/world.cpp b/src/CrawlTestLvl/private/world.cpp index c8d4504..cd8438a 100644 --- a/src/CrawlTestLvl/private/world.cpp +++ b/src/CrawlTestLvl/private/world.cpp @@ -12,6 +12,7 @@ #include "world.h" #include #include "Crawl/iworlditem.h" +#include namespace TestLvl { @@ -24,7 +25,8 @@ World::World() { CRAWL::WorldRule *World::initWorldRules() { return new CRAWL::WorldRule { {0, {{registerObject(), 1000}, - {registerObject(), 1}}} + {registerObject(), 1}, + {registerObject(), 1}}} }; } diff --git a/src/JungleLvl/CrawlJungleLvlAssests b/src/JungleLvl/CrawlJungleLvlAssests index 858c0f9..9b108d2 160000 --- a/src/JungleLvl/CrawlJungleLvlAssests +++ b/src/JungleLvl/CrawlJungleLvlAssests @@ -1 +1 @@ -Subproject commit 858c0f949ac542d8a4c00b07bfb74ae5091d456c +Subproject commit 9b108d2698eda11bd7b263c2dd0a0d46cfa877d3 diff --git a/src/JungleLvl/private/world.cpp b/src/JungleLvl/private/world.cpp index 36891fd..dad93e1 100644 --- a/src/JungleLvl/private/world.cpp +++ b/src/JungleLvl/private/world.cpp @@ -20,6 +20,7 @@ #include "purpleegg.h" #include "blueegg.h" +#include #include namespace JungleLvl { @@ -31,14 +32,16 @@ World::World() { CRAWL::WorldRule *World::initWorldRules() { return new CRAWL::WorldRule { {0, { + {registerObject(), 1}, {registerObject(), 1}, {registerObject(), 500}, - {registerObject(), 100} + {registerObject(), 100}, } }, {1000, { + {registerObject(), 1}, {registerObject(), 1}, {registerObject(), 500}, {registerObject(), 100}, @@ -49,6 +52,7 @@ CRAWL::WorldRule *World::initWorldRules() { } }, {2000, { + {registerObject(), 1}, {registerObject(), 1}, {registerObject(), 500}, {registerObject(), 100},