-
Hello everyone,
As I mentioned in the original LTBL thread, I am currently (finally) remaking LTBL with clean code, more features, higher performance, and greater ease of use. It now uses only SFML as a dependency.
New features include:
- Directional lights
- Codeless light types
- Antumbras
- Superior performance
- Transparency
Follow the repository here: https://github.com/222464/LTBL2 (https://github.com/222464/LTBL2)
Demo available here: https://drive.google.com/file/d/0B2btNvgW7MHUQ0JfQTQ4ZndmNHc/view?usp=sharing (https://drive.google.com/file/d/0B2btNvgW7MHUQ0JfQTQ4ZndmNHc/view?usp=sharing)
(http://i1218.photobucket.com/albums/dd401/222464/tmxltbl.png)
Here is an example of antumbra rendering so far (this was impossible in the original LTBL):
(http://i1218.photobucket.com/albums/dd401/222464/antumbra.png)
-
Looks great so far! Keep up the good work. :)
-
Looks great!
What is a Codeless light type? Is that a data-driven light, such as how you can load a hull from file in LTBL1?
-
Lolz, what are your thoughts on combining LTBL with a sprite per-pixel lighting shader (normal map), such as seen here: http://en.sfml-dev.org/forums/index.php?topic=16830.0
I can think of a few approaches.
1. LTBL only renders modulative shadows instead of additive lighting, and you render your sprites with a light shader.
2. LTBL renders exactly as it does now, the composition texture is applied to the ground / background texture to render shadows, and all other sprites are rendered with a light shader.
3. LTBL embeds light-direction data in the composition texture, and then the light shader can sample this composition texture to calculate the per-pixel lighting.
Thoughts?
-
Jabberwocky,
I have thought of doing that actually, specifically the last approach you suggested. I will add it, it shouldn't be too hard.
The codeless light types allow you to make things like spotlights and light beams and such without using code. It only requires texture work now. There are 2 kinds of emitters: Point and directional. From these you can make all the lights in the original LTBL quite easily and more.
Any other features you would like to see? I might actually run a kickstarter for this, depending on how many features I end up adding.
-
Progress shot of the day:
(http://i1218.photobucket.com/albums/dd401/222464/tmxltbl.png)
I used fallahn's tmx (Tiled) loader to load the map.
The tile set is from here: http://opengameart.org/content/platformer-tiles-4 (http://opengameart.org/content/platformer-tiles-4)
-
That's a very appealing demo you've got there! :D
Looking forward to toying with it.
-
I do not have words to describe the happiness that inspire this news for me. Thank you, lolz123!
DJuego
-
Holy hell man, that looks beautiful.
-
Just wondering if anyone is or has worked on a C# port of this wonderful lighting system? :)
-
It's neither finished nor released yet, how would someone work on a C# port already? :D
-
Jabberwocky,
I have thought of doing that actually, specifically the last approach you suggested. I will add it, it shouldn't be too hard.
Cool.
Would you need multiple composition textures to support multiple lights?
Any other features you would like to see? I might actually run a kickstarter for this, depending on how many features I end up adding.
My best guess, you are going to have 2 kinds of users:
1. Users who want per-pixel lighting with normal maps.
2. Users who don't.
I am (1), and I would happy contribute to a kickstarter for a project that supported this.
In case you need to generate some normal maps to test this functionality, I believe both CrazyBump (http://www.crazybump.com/) and PixPlant (http://www.pixplant.com/download.php) have 30-day free trials. Or you may just be able to find some free sample art from a google search. Let me know if I can help with any of that.
In case you decide not to run a kickstarter, I'd still be happy to contribute a donation directly, just let me know.
-
In case you need to generate some normal maps to test this functionality, I believe both CrazyBump and PixPlant have 30-day free trials. Or you may just be able to find some free sample art from a google search. Let me know if I can help with any of that.
Don't worry about that ;) I have my own self-made normal map generator. I used it for my 3D engine. Also Gimp has a plugin for it as well, and it is quite good.
-
This is great! For the game I've just started I was disappointed that LTBL wasn't updated, but here it is now. Thanks a lot for the hard work.
-
And God said, “Let there be light,” and there was light. God saw that the light was good, and he separated the light from the darkness. And our lord lolz123 spoke and he said, "Have a soley SFML dependent version of LTBL. I will cast out the evil dependencies and your programs will be blessed."
But seriously I've been waiting for this for a long time. Awesome work dude.
-
I want to try Kickstarter, it should be ready by tomorrow! Then I can spend time adding all the features you guys want ;)
Update screenshot:
(http://i1218.photobucket.com/albums/dd401/222464/ltblscreenshot2-1.png)
-
Looking good!
-
Are you sure about Kickstarter? I don't really see how such a project will do well over there...
What can you give in return to your backers? Is your target audience enough big? Do you have the time for all the paperwork and preparation? Etc.
Kickstarter isn't or at least shouldn't be something you can just try out. But well I'm not stopping you...
-
Looks great, lolz!
-
@Sub, Jabberwocky: Thanks!
@eXpl0it3r:
What can you give in return to your backers?
Other than the end result, I just have simple things planned, like animated gifs of names lit up by the lighting system.
Is your target audience enough big?
Well, if it isn't, then nothing is really lost, since it just falls through and nobody is charged. I also plan to add a lot more features then there currently are, hopefully making the project more attractive. Also keep in mind that I am not doing just the SFML version, but also a generic OpenGL version.
Do you have the time for all the paperwork and preparation?
Already done ;) It's not so bad really.
-
Another progress shot!
Two new features are shown here. One is the requested ability to render light over occluders properly, and the other is the use of custom light textures.
(http://i1218.photobucket.com/albums/dd401/222464/ltblspooky.png)
-
Again a fantastic job mate !
How hard would it be to convert the rendering code into a new platform, say raw OpenGL or some other wrapper around low level rendering API's?
-
@Grimshaw: A raw OpenGL version is planned!
-
Is open source?
-
I might integrate this into my game tools if it can be done seamlessly (aka able to integrate with my low level abstract renderer, which by itself can be DX/GL/Other).
You're really good at rendering man, you never fail to impress!
-
Definitely looking forward to LTBL2. I thought the this project was dead for sure.
Looks like it's time for me to start taking down LTBL1 ::)
-
I will keep posting updates here, the first version (2.0) should be done in about 3 days.
*cough*
-
Also, where's the kickstarter? :)
-
Maybe I should adopt the "when it's done™" ;)
The first version I have now is very basic, but still heaps better than the original. The Kickstarter will come! The verification process takes some time. Also I had to make enough demos for there to be something to show in the video ;D
I will upload it in the next 2 hours. For real!
-
Here it is! Keep in mind that it is NOT yet ready for use. But now you can see how it develops!
https://github.com/222464/LTBL2 (https://github.com/222464/LTBL2)
-
Cool! Great to see this committed to github, lolz.
-
is it possible to detect if an object is inside of the shadow? i have not played with this tool yet but i wanted to know before i get my hands dirty.
-
Yes, it is possible to detect if something is in the shadow.
-
Hey just out of curiosity, do know when you will release something we can experiment with?
-
This looks amazing! I messed around with LTBL1 when I was working in a top down shooter a few months back and I really liked it. Can't wait to see this improved version in action!
-
Might use this in my maze game when the first small release of code we can break turns up. :) Good work as usual too. :D
-
Hi. Nice that you're working on a new version. I'm using LTBL 1 right now and i like it alot. I've gotten it to work quite well but there are some bugs that you have to work around and it takes alot of testing to set it up correctly.
-
Did you try my version of LTBL (https://github.com/eXpl0it3r/LTBL)? Or better yet switch to LTBL2. ;)
-
Did you try my version of LTBL (https://github.com/eXpl0it3r/LTBL)? Or better yet switch to LTBL2. ;)
I didn't think LTBL2 is ready for use yet. I just saw the thread though. And no, i didn't try your version. Mine works, it's just a bit weird to get it to work, and there are no directional lights.
-
Just checked that github link. He hasn't updated it since he posted it 2 months ago and then he said that "It's NOT ready for use", so i guess i will wait until he develops it further.
-
Holy sh** this looks so nice.. I had never heard of LTBL before that post but damn it looks good.. Is there a "tech demo" available for download somewhere around here?
-
Wanna ask one question.
How to make everything on the window darkened except places with light? I have trouble with this..
-
Hello everyone,
I'm not dead! I have just been busy with some other things lately, but I decided to set aside some time to finish up LTBL2.
A "usable" version is now on GitHub. I haven't tested it extensively, but from the few tests that I did do it looked fine, minus some minor shadow bugs that should get fixed soon.
-
Hello, i try to compile your library with CMAKE but i run into std::make_unique error not defined. I did a bit
of research and it turned out that this is an upcoming c++14 function. Instead of injecting a template snippet in every *.h file is there an other way?
My OS is Win7 x64,
I tried with GCC 4.8.0 and 4.8.1.
Should i bother to try with 4.9.0?
Thanks :)
-
Use a compiler with C++14 support or just add your own implementation.
You can grab STL (http://nuwen.net/stl.html)'s implementation (which is what got adopted in C++14 IIRC) from N3656 (http://isocpp.org/files/papers/N3656.txt).
-
What flags and what executable i must use? With MinGW i just used mingw32-make on the bin folder of the project and i got it compiled. I searched a bit and found out i must provide the *.cpp files manualy?
Don't get me wrong, i don't want anybody to build it for me, i just want to learn how to do it.
Thanks :)
Edit: I got some progress but still.. Now i get undefined references to __gxx_personality and some other which means i use wrong exception handling DW/SJLJ or smth?
-
IIRC GCC 4.9.x supports std::make_unique. Thus you should get a newer MinGW version, I can recommend the MinGW Builds which are by now part of the MinGW-w64 project.
To use C++14 features you need to add -std=c++14 to the build command.
As for your error, if you don't get exactly the same compiler as your binaries are built with, you'll have to do a clean rebuild with the new compiler (e.g. recompile SFML).
-
I'm very happy to see you back lolz!
Your lighting stuff is great.
-
Hello everyone,
LTBL is now almost at what I would call version 2.0! Just looking to fix some minor bugs now and improve performance. I will update the repository again with proper instructions tomorrow, stay tuned!
Antumbras now function properly alongside umbras as well now ;)
For now, here is another beauty-shot :D
(http://i1218.photobucket.com/albums/dd401/222464/ltbl2spooky.png)
-
Uops!! Precisely yesterday I took a preliminary look and i tried the example: The application crashed in the wood bridge ;D
Actually, I miss documentation A documented API. :'(. At least, I think an exhaustive relation of features would be interesting. For example; does it cover all functionality of the original LTBL (1.5.1)?
In any case, I want you to know that this news has brightened my day a lot, 8) Thanks! lolz123
DJuego
-
New version with bug fixes and instructions is up! I will work on the instructions a bit more later, they are pretty basic right now. But hopefully they are enough to get started!
Also, a demo project is on the way!
-
Ok lolz123!
**************************************************************************************
First:
(building with mingw-builds gcc 4.9.2 sjlj)
cmake -G 'MSYS Makefiles' -D CMAKE_BUILD_TYPE=Debug -D CMAKE_INSTALL_PREFIX=$DIRECTORIO_LOCAL -D SFML_ROOT=$DIRECTORIO_LOCAL ../..
[...]
-- Detecting CXX compile features - done
-- Found SFML 2.2 in v:/MinGW-Builds/mingw32/msys/local/include
CMake Error at CMakeLists.txt:14 (target_link_libraries):
Cannot specify link libraries for target "LTBL2" which is not built by this
project.
-----------
(building with msvc 18.0.31101.0 )
cmake -G 'NMake Makefiles' -D CMAKE_BUILD_TYPE=Debug -D CMAKE_INSTALL_PREFIX=$DIRECTORIO_INSTALACION_LIBRERIA -D SFML_ROOT=$DIRECTORIO_INSTALACION/SFML ../..
-- Found SFML 2.2 in w:/Archivos_de_programa/MSVC2013/x32/SFML/include
CMake Error at CMakeLists.txt:14 (target_link_libraries):
Cannot specify link libraries for target "LTBL2" which is not built by this
project.
------
It requires to add_library. I had to modify the CMakeLists.txt file:
set( SOURCE_PATH "${PROJECT_SOURCE_DIR}/source" )
set( SOURCES
"${SOURCE_PATH}/ltbl/Math.h"
"${SOURCE_PATH}/ltbl/Math.cpp"
"${SOURCE_PATH}/ltbl/lighting/LightDirectionEmission.cpp"
"${SOURCE_PATH}/ltbl/lighting/LightDirectionEmission.h"
"${SOURCE_PATH}/ltbl/lighting/LightPointEmission.cpp"
"${SOURCE_PATH}/ltbl/lighting/LightPointEmission.h"
"${SOURCE_PATH}/ltbl/lighting/LightShape.cpp"
"${SOURCE_PATH}/ltbl/lighting/LightShape.h"
"${SOURCE_PATH}/ltbl/lighting/LightSystem.cpp"
"${SOURCE_PATH}/ltbl/lighting/LightSystem.h"
"${SOURCE_PATH}/ltbl/quadtree/DynamicQuadtree.cpp"
"${SOURCE_PATH}/ltbl/quadtree/DynamicQuadtree.h"
"${SOURCE_PATH}/ltbl/quadtree/Quadtree.cpp"
"${SOURCE_PATH}/ltbl/quadtree/Quadtree.h"
"${SOURCE_PATH}/ltbl/quadtree/QuadtreeNode.cpp"
"${SOURCE_PATH}/ltbl/quadtree/QuadtreeNode.h"
"${SOURCE_PATH}/ltbl/quadtree/QuadtreeOccupant.cpp"
"${SOURCE_PATH}/ltbl/quadtree/QuadtreeOccupant.h"
"${SOURCE_PATH}/ltbl/quadtree/StaticQuadtree.cpp"
"${SOURCE_PATH}/ltbl/quadtree/StaticQuadtree.h"
)
add_library( LTBL2 SHARED ${SOURCES} )
set_target_properties( LTBL2 PROPERTIES DEBUG_POSTFIX -d )
target_link_libraries(LTBL2 ${SFML_LIBRARIES})
*************************************************************************************
Second:
(building with mingw-builds gcc 4.9.2 sjlj)
[ 10%] Building CXX object CMakeFiles/LTBL2.dir/source/ltbl/Math.cpp.obj
p:/Plataformas/x32-x64/TRABAJO_MINGW_x32/LTBL2/LTBL2/source/ltbl/Math.cpp: In fu
nction 'float ltbl::vectorMagnitude(const Vector2f&)':
p:/Plataformas/x32-x64/TRABAJO_MINGW_x32/LTBL2/LTBL2/source/ltbl/Math.cpp:60:9:
error: 'sqrt' is not a member of 'std'
return std::sqrt(vector.x * vector.x + vector.y * vector.y);
^
It requires to modify Math.cpp.
#include <cmath>
*********************************************************************************
Third:
(building with mingw-builds gcc 4.9.2 sjlj)
[ 20%] Building CXX object CMakeFiles/LTBL2.dir/source/ltbl/lighting/LightDirect
ionEmission.cpp.obj
In file included from v:/MinGW-Builds/mingw32/i686-w64-mingw32/include/c++/array
:35:0,
from P:/Plataformas/x32-x64/TRABAJO_MINGW_x32/LTBL2/LTBL2/sourc
e/ltbl/quadtree/QuadtreeOccupant.h:9,
from P:/Plataformas/x32-x64/TRABAJO_MINGW_x32/LTBL2/LTBL2/sourc
e/ltbl/lighting/LightDirectionEmission.h:4,
from p:/Plataformas/x32-x64/TRABAJO_MINGW_x32/LTBL2/LTBL2/sourc
e/ltbl/lighting/LightDirectionEmission.cpp:1:
v:/MinGW-Builds/mingw32/i686-w64-mingw32/include/c++/bits/c++0x_warning.h:32:2:
error: #error This file requires compiler and library support for the ISO C++ 20
11 standard. This support is currently experimental, and must be enabled with th
e -std=c++11 or -std=gnu++11 compiler options.
#error This file requires compiler and library support for the \
^
It requires to modify CMakeLists.txt.
# Compiler-specific flags and definitions
if(CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1y")
endif()
*******************************************************************************
Fourth:
(building with mingw-builds gcc 4.9.2 sjlj)
(building with msvc 18.0.31101.0) <- No import libs unfortunately. :-| Will we have official solution in the future?
(SHARED libraries) - Success!!!
Thanks lolz123!
DJuego
-
Thanks DJuego!
I'll admit, I was packaging up the library in a hurry yesterday, it was 3AM ::) (edit - err, today ;) )
I will fix up the build!
-
Hello!
I created a little demo for LTBL2!
Controls:
QWOP: move
Space: sprint
There is no goal, it's just a simple environment with some lighting to look at.
https://drive.google.com/file/d/0B2btNvgW7MHUQ0JfQTQ4ZndmNHc/view?usp=sharing (https://drive.google.com/file/d/0B2btNvgW7MHUQ0JfQTQ4ZndmNHc/view?usp=sharing)
-
Does anyone here already build LTBL2 under Linux? After succesfull cmake, during "make" i have this error:
[size=10pt]Scanning dependencies of target LTBL2
[ 10%] Building CXX object CMakeFiles/LTBL2.dir/source/ltbl/Math.cpp.o
[ 20%] Building CXX object CMakeFiles/LTBL2.dir/source/ltbl/lighting/LightDirectionEmission.cpp.o
In file included from /home/lord/dev/SFM_THOR_BOX2D/LTBL2-master/LTBL2/source/ltbl/lighting/LightSystem.h:3:0,
from /home/lord/dev/SFM_THOR_BOX2D/LTBL2-master/LTBL2/source/ltbl/lighting/LightDirectionEmission.cpp:5:
/home/lord/dev/SFM_THOR_BOX2D/LTBL2-master/LTBL2/source/ltbl/quadtree/DynamicQuadtree.h:3:36: fatal error: ltbl/Quadtree/Quadtree.h: Nie ma takiego pliku ani katalogu // mean no such file or directory
#include <ltbl/Quadtree/Quadtree.h>
^
compilation terminated.
make[2]: *** [CMakeFiles/LTBL2.dir/source/ltbl/lighting/LightDirectionEmission.cpp.o] Błąd 1 // mean error1
make[1]: *** [CMakeFiles/LTBL2.dir/all] Błąd 2 // mean error 2
make: *** [all] Błąd 2 //mean error 2 [/size]
thank you in advance :)
-
Looks like a Windows "case does not matter" vs Unix "case does matter" issue to me.
Take a look at the folder name in "#include <ltbl/Quadtree/Quadtree.h>" and compare it to the folder name in ".../ltbl/quadtree/DynamicQuadtree.h:3:36". :)
Make the 'Q' a 'q' in the #include line, and it should be fixed!
-
Thanks, but unfortunately no :-\
But I find something interesting. My folders CMakeFiles/LTBL2.dir/source/ltbl/lighting and CMakeFiles/LTBL2.dir/source/ltbl/Quadtree are empty. Maybe this is the problem, now, how to fix it.
-
Download the source again or if you used git, you can just go to the base directory and use git checkout ./
-
I had the same problem.
The cause was Quadtree/quadtree (case sensitive). So i changed the include-tags and everything worked.
But that was a few month ago.
-
I download the code again, then in C::B change 'Q' and 'q', solve some problems with c++14 standard, and now everything work. Thanks to all!
Ps. If anyone have any exemple code, maybe send me via priv/mail or paste here. It will be propably more helpful than "quick start" on github.
-
Hey lolz123, nice demo! I would like to use this for my game, I was able to compile and add to my project but I'm having some troubles:
This is my code for the creation of a light (to test):
// lights setup
sf::Shader unshadowShader;
sf::Shader lightOverShapeShader;
unshadowShader.loadFromFile("resources/unshadowShader.vert", "resources/unshadowShader.frag");
lightOverShapeShader.loadFromFile("resources/lightOverShapeShader.vert", "resources/lightOverShapeShader.frag");
sf::Texture penumbraTexture;
penumbraTexture.loadFromFile("resources/penumbraTexture.png");
penumbraTexture.setSmooth(true);
ltbl::LightSystem ls;
ls.create(sf::FloatRect(-1000.0f, -1000.0f, 1000.0f, 1000.0f), Game::GetWindow().getSize(), penumbraTexture, unshadowShader, lightOverShapeShader);
std::shared_ptr<ltbl::LightDirectionEmission> light = std::make_shared<ltbl::LightDirectionEmission>();
light->_emissionSprite.setTexture(penumbraTexture);
light->_castDirection = sf::Vector2f(25.f, 25.f);
ls.addLight(light);
That's all I do and the light won't show, am I missing something? Maybe a call to draw every frame to show the light?
I followed your quick start (https://github.com/222464/LTBL2), I don't understand which texture I have to use in this line "light->_emissionSprite.setTexture(penumbraTexture);" one of your textures?
-
The textures are also in the github repository, where you found the quick start guide.
https://github.com/222464/LTBL2/tree/master/LTBL2/resources (https://github.com/222464/LTBL2/tree/master/LTBL2/resources)
-
Thanks Glosa, I'm using those textures but still not showing any light.
Lolz, it would be nice to see the source code of the demo so we can see how exactly to use this. I'm creating light and then drawing it with Nrender but nothing happens :-\
Cmake generated without errors, the sln compiled without problems and this is my code:
Sector.h:
...
#include <ltbl/lighting/LightSystem.h>
class Sector
{
public:
Sector(int mapNumber, int sectorNumber);
~Sector();
...
private:
...
ltbl::LightSystem ls;
sf::Shader unshadowShader;
sf::Shader lightOverShapeShader;
};
Sector.cpp (Constructor):
Sector::Sector(int mapNumber, int sectorNumber)
: static_objects_counter(0), enemies_counter(0), pickup_counter(0), _name(NumberToStr(sectorNumber))
{
belongsToMapNumber = mapNumber;
enemies.clear();
enemiesToRemove.clear();
unshadowShader.loadFromFile("resources/unshadowShader.vert", "resources/unshadowShader.frag");
lightOverShapeShader.loadFromFile("resources/lightOverShapeShader.vert", "resources/lightOverShapeShader.frag");
sf::Texture penumbraTexture;
penumbraTexture.loadFromFile("resources/penumbraTexture.png");
penumbraTexture.setSmooth(true);
ls.create(sf::FloatRect(-1000.0f, -1000.0f, 1000.0f, 1000.0f), Game::GetWindow().getSize(), penumbraTexture, unshadowShader, lightOverShapeShader);
// Below is an example for creating one point light and one directional light:
std::shared_ptr<ltbl::LightPointEmission> plight = std::make_shared<ltbl::LightPointEmission>();
sf::Texture pointLightTexture;
pointLightTexture.loadFromFile("resources/pointLightTexture.png");
pointLightTexture.setSmooth(true);
plight->_emissionSprite.setOrigin(sf::Vector2f(0.f, 0.f));
plight->_emissionSprite.setTexture(pointLightTexture);
plight->_emissionSprite.setColor(sf::Color::Blue);
plight->_emissionSprite.setPosition(sf::Vector2f(100, 100));
plight->_localCastCenter = sf::Vector2f(0.f, 0.f); // This is where the shadows emanate from relative to the sprite
ls.addLight(plight);
std::shared_ptr<ltbl::LightDirectionEmission> dlight = std::make_shared<ltbl::LightDirectionEmission>();
sf::Texture directionLightTexture;
directionLightTexture.loadFromFile("resources/directionLightTexture.png");
directionLightTexture.setSmooth(true);
dlight->_emissionSprite.setTexture(directionLightTexture);
dlight->_castDirection = sf::Vector2f(10.f, 10.f);
ls.addLight(dlight);
}
Sector.cpp (update):
void Sector::update(sf::Time timeElapsedSinceLastUpdate)
{
...
ls.render(Game::GetWindow().getView(), unshadowShader, lightOverShapeShader);
}
Textures and shaders load fine (I checked), update is called, render is called, I'm not drawing the map over the lights, so I don't know what is the problem, any ideas?
-
Thank you sooooo much for this project, it's really great!
I have a few questions, though:
To keep track of which lights and occluders belong to which object i not only use the "lightsystem.addLight(<light>)" to put a shared_ptr into the lightsystem but i also put shared_ptr of that same light in certain objects. For example for the flashlight of my player i currently have it like that:
class Player {
std::shared_ptr<ltbl::LightPointEmission> flashlight;
}
And when creating the light i put a shared_ptr in both the LTBL2 lightsystem object aswell as my player flashlight pointer, like that:
Player::Player() {
this->flashlight = std::make_shared<ltbl::LightPointEmission>();
...
this->game->getLightsystem().addLight(light);
}
Effectively both the player and the light system have now each a shared_ptr that point to the light object.
The problem is now: how do i actually delete/deactivate/turn off the lights (for example turn off a flashlight or turn off a light in a room)? For example if i want to switch the flashlight off with a toggleFlashlight method, how would i do that?
This doesn't work (in Player.cpp):
void Player::toggleFlashlight() {
this->game->getLightsystem().removeLight(this->flashlight);
}
because the shared_ptr from the player and the shared_ptr in the lightsystem are different, and the "removeLight()" method, as far as i can understand it, only checks for equality of the pointer (which isn't true, since the flashlight pointer of the player and the flashlight pointer in the light system have different adresses), not the actual light object that these pointers point to.
Do you have any suggestions how one could make lights that can be toggled on/off, and suggestions how to make object keep track of lights which belong to them while also being able to remove them at any time?
The only quick, but probably not smart, solution i found right now while writing this would be to set the scale to "0 ,0"
this->flashlight->_emissionSprite.setScale(0,0);
This causes the light sprite to be too small to be rendered, virtually making it invisible and thus "turn off", and then, when "turning the light back on", i would turn the scale back to what it was.
But that seems kinda silly, since then i'd have to keep track of the original sprite scale and still have many lights that still need to be calculated, just with a (0,0) scale.
Another wierd alternative would be, instead of turning the scale to (0,0), to set the sprite color to sf::Color::Transparent, in order to make the sprite invisible, and then sf::Color::White to make the light visible again.
Do you have any suggestions which one to choose, or even alternatives for turning lights on/off?
In addition to that, may i suggest an "setActive(bool)" method, similar to Box2Ds system, for lights and occluders?
In Box2d you can set bodies to active or inactive, and if they're set to "setActive(false)" then these bodies won't be used for almost any calculation.
Could maybe something similar be done with LTBL2, where we can toggle lights and occluders on and off via "setActive(bool)" method, and inactive lights won't be drawn/inactive occluders won't make any shadows?
This could give us more control over the lights while also possibly saving performance by ignoring inactive lights/occluders in the render/quadtree calculations?
This is a really great project.
Again, thank you so much for creating it! I hope you will continue working on it.
-
Dear,
First of all, thank you so much for sharing your code and hard work!
I would like to ask a question though, which has been asked before.
I do everything stated in the documentation, but no light seems to appear when I run my application.
I have an easy test project setup so I'll post the code I'm using at the moment.
This is the initialization of everything.
Game::Game() :
window(), ls(), unshadowShader(), lightOverShapeShader(), view()
{
sf::ContextSettings settings = sf::ContextSettings();
settings.antialiasingLevel = 8;
window.create(sf::VideoMode(windowWidth, windowHeight), "Test game", sf::Style::Default, settings);
sf::Vector2u windowSize(window.getSize());
view.setSize(sf::Vector2f(static_cast<float>(windowSize.x), static_cast<float>(windowSize.y)));
view.setCenter(view.getSize() / 2.0f);
unshadowShader.loadFromFile("resources/unshadowShader.vert", "resources/unshadowShader.frag");
lightOverShapeShader.loadFromFile("resources/lightOverShapeShader.vert", "resources/lightOverShapeShader.frag");
sf::Texture penumbraTexture;
penumbraTexture.loadFromFile("resources/penumbraTexture.png");
penumbraTexture.setSmooth(true);
//ltbl::LightSystem ls;
ls.create(sf::FloatRect(-1000.0f, -1000.0f, 1000.0f, 1000.0f), window.getSize(), penumbraTexture, unshadowShader, lightOverShapeShader);
std::shared_ptr<ltbl::LightPointEmission> pointLight = std::make_shared<ltbl::LightPointEmission>();
pointLight->_emissionSprite.setOrigin(0, 0);
sf::Texture pointTexture;
pointTexture.loadFromFile("resources/pointLightTexture.png");
pointTexture.setSmooth(true);
pointLight->_emissionSprite.setTexture(pointTexture, true);
pointLight->_emissionSprite.setColor(sf::Color::Cyan);
pointLight->_emissionSprite.setPosition(50, 50);
pointLight->_localCastCenter = sf::Vector2f(70.f, 70.f); // This is where the shadows emanate from relative to the sprite
std::shared_ptr<ltbl::LightDirectionEmission> directionLight = std::make_shared<ltbl::LightDirectionEmission>();
sf::Texture directionTexture;
directionTexture.loadFromFile("resources/directionLightTexture.png");
directionTexture.setSmooth(true);
directionLight->_emissionSprite.setTexture(directionTexture);
directionLight->_castDirection = sf::Vector2f(200.f, 200.f);
std::shared_ptr<ltbl::LightShape> lightShape = std::make_shared<ltbl::LightShape>();
lightShape->_shape.setPointCount(3);
const int arraySize = 4;
sf::Vector2f fixedPoints[arraySize] = { sf::Vector2f(0.f, 0.f), sf::Vector2f(0.f, 0.f), sf::Vector2f(0.f, 0.f), sf::Vector2f(0.f, 0.f) };
fixedPoints[0] = sf::Vector2f(20.f, 20.f);
fixedPoints[1] = sf::Vector2f(20.f, 30.f);
fixedPoints[2] = sf::Vector2f(25.f, 40.f);
fixedPoints[3] = sf::Vector2f(50.f, 30.f);
for (int j = 0; j < arraySize - 1; j++)
lightShape->_shape.setPoint(j, fixedPoints[j]);
lightShape->_shape.setPosition(100.f, 100.f);
ls.addShape(lightShape);
ls.addLight(directionLight);
ls.addLight(pointLight);
}
The lights should be rendered here:
void Game::render()
{
window.clear();
window.setView(view);
ls.render(view, unshadowShader, lightOverShapeShader);
//window.draw();
window.display();
}
I am looking forward to your answer!
Thanks in advance.
-
Hello,
Calling ls.render only renders the lights to an internal texture. You must then render the internal texture after calling ls.render. You can do this with ls.getLightingTexture. Make sure that the blending is set to multiplicative before you draw it on top of your scene!
-
lolz123 Happy to read you this way again!
Your work has been VERY useful for me. SFML, Thor and LTBL2 are my Holy Trinity ;D
Frankly, I am eager about new things in the LTBL2 project. ;D Please! please! please!.
A humble and very briefly explained tribute:
A multimedia application: Virtual ants in a virtual environment expel a pheromone trail in order that robotic ants follow it in a physic environment.
The virtual environment (tcp/ip-and-bluetooth server view) is a representation of physic environment The multiple ants are controlled by human "players" in a local network. LTBL2 plays an important role here. Thanks again!
(http://i.imgur.com/4Up8OHxl.jpg)
The physic environment (global view). The robotic ants request info (bluetooth) to server about the amount of pheromone in a ground cell. Pheromone weakens with time. The pheromone only is visible in the virtual environment. In fact it was implemented with the particle system of Thor (Thanks Nexus;D).
(http://i.imgur.com/AIenoQpl.jpg)
The physic environment with the ant hole in foreground. Multiple robotic ants transport food to the anthill simultaneously (stigmergic behavior (https://en.wikipedia.org/wiki/Stigmergy)).
(http://i.imgur.com/4U5oQDnl.jpg)
Sorry for my English!
[And of course MANY thanks to the SFML Team :-* but this was a tribute for lolz123 :P]
DJuego
-
Hello,
Calling ls.render only renders the lights to an internal texture. You must then render the internal texture after calling ls.render. You can do this with ls.getLightingTexture. Make sure that the blending is set to multiplicative before you draw it on top of your scene!
Hey Lolz, thanks for the answer, I've been able to render lights like this:
lightSystem.render(Game::GetWindow().getView(), unshadowShader, lightOverShapeShader);
lightsSprite.setTexture(lightSystem.getLightingTexture());
Game::GetWindow().draw(lightsSprite, sf::BlendMultiply);
and works good except it doesn't update the view when I move my player (even when I'm passing it to the render()), you can see this on the right of the screen capture attached (don't mind the crappy graphics, they are temporary :P).
Am I missing something?
-
Am I missing something?
You need to set the position of lightSprite when you move the camera. lightSprite.setPosition(view.getCenter());
You will also need to set the sprite's origin so that the center of the sprite matches the center of he view.lightSprite.setOrigin(view.getSize().x / 2.0f, view.getSize().y / 2.0f);
Do this before running the game.
-
Hey can anyone help me figure out why my programs don't compile even after successfully building with CMake on Visual Studio 2013?
I do the whole CMake thing, it compiles just fine with these settings:
Where is the source code: C:/Users/Me/Desktop/Main/LTBL2-master/LTBL2
Where to build the binaries: C:/Users/Me/Desktop/Main/LTBL2-master/LTBL2
I add the SFML_ROOT entry and point it to C:/SFML/SFML-2.2.
I specify the generator as Visual Studio 12 2013, after configuring I hit generate and it completes with no errors at all.
Then I go into a Visual Studio project that I know works with SFML 2.2 as I test opening a window.
I add these to the properties:
> C/C++
>General
> Additional Include Directories: C:\Users\Me\Desktop\Main\LTBL2-master\LTBL2\source\
> Linker
>General
> Additional Library Directories: C:\Users\Me\Desktop\Main\LTBL2-master\LTBL2\source\
After all that I finally make paste this simple piece of code into the Main.cpp file:
#include <SFML/Graphics.hpp>
#include <ltbl/lighting/LightSystem.h>
int main()
{
sf::RenderWindow window(sf::VideoMode(600, 600), "SFML works!");
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
window.display();
}
return 0;
}
And this code compiles just fine. However, if I add any type of ltbl object (such as ltbl::LightSystem) anywhere in the code, the compiler just gives me three LNK2001 errors.
How do I fix this?
-
You set an additional library directory to the linker, so that it will know where to find the library, but you don't add the library itself (Linker > Input > Additional libraries).
-
Thanks. I think I understand what you mean Laurent, however I don't see how I'm meant to actually include the library itself. There isn't a "Additional Libraries" section in the that section of the properties either.
-
It was "Additional dependencies".
-
I still don't know what to do to fix the bug, cant find any files that I believe would make sense going into additional dependencies.
-
If you are using Visual Studio, you may have to set your startup project to the ERL project, and you may have to add the source files to the project.
Have you added the LTBL2 .cpp files to your project? Unfortunately there are not .lib files for LTBL2 in Visual Studio( :-[)
DJuego
-
I still don't know what to do to fix the bug, cant find any files that I believe would make sense going into additional dependencies.
I didn't use CMake at all. Just added the source files to my project. Edited some of the #includes because visual studio was complaining. Then compiled. Pretty simple.
-
Am I missing something?
You need to set the position of lightSprite when you move the camera. lightSprite.setPosition(view.getCenter());
You will also need to set the sprite's origin so that the center of the sprite matches the center of he view.lightSprite.setOrigin(view.getSize().x / 2.0f, view.getSize().y / 2.0f);
Do this before running the game.
Thanks! It is working now. LTBL2 is great :D
And this code compiles just fine. However, if I add any type of ltbl object (such as ltbl::LightSystem) anywhere in the code, the compiler just gives me three LNK2001 errors.
How do I fix this?
You need to add all cpp files of LTBL2 (those on /lighting, those on /quadtree and Math.cpp) to your project, you don't need to add anything to the Linker part, just to the C/C++ part "Additional Include Directories: C:\Users\Me\Desktop\Main\LTBL2-master\LTBL2\source\" as you did.
-
Thanks guys. It's working great now after following all your advice :)
-
I have an interesting problem. Normally lights is falling into obiect from side. In side-scroller it's perfect, but how to make a sun light in a top-down game, something like that :
(http://i39.photobucket.com/albums/e168/CZorg/screenshot100-4.jpg)
not like that:
(http://iv.pl/images/78774434301012634995.png)
Illusion of light from above, without this long penubra shadow. Any ideas?
-
The main part of the shadow seems to be exactly what you were aiming for but you have a faint shadow extending from it. You could try increasing the size of the light (or using many, multiple lights, probably in a circle) and/or increasing the strength of the lights.
-
I just make two light systems, first is normal, second is with modified penubra texture (i just cut out this bright part :D ). But, i don't know how it will be works with more lights on scene (performance).
Especially, that i can't remove lights (don't know why, just removeLight() not working), so i holding pretty lot of them at once.
-
I don't know how LTBL works. Does it provide you with a greyscale channel to multiply over the scene? If so, you can use adjustment on the channel to 'bump up' the light greys to white, thus removing all of the slight lighting.
-
I think that this can make shadows very low intense and deformed. 2 light systems will be enought with posibility of deleting unusable lights.
This is my main problem. Does anyone know how to delete light and light Shape? In my opinion there is properly implemented remove function in code, but does nothing, or in some cases there is an error somewhere in QuadTree. Maybe just use ltbl 1.5?
-
Sorry for showing up here so rarely, I have been very busy lately (with AI related things! Info here for those interested: https://cireneikual.wordpress.com/2015/09/03/htsl2-evolving-the-neocortex-and-human-like-reinforcement-learning/ (https://cireneikual.wordpress.com/2015/09/03/htsl2-evolving-the-neocortex-and-human-like-reinforcement-learning/)).
I have hopefully fixed the removal bug. I also merged eXpl0it3r's changes (thanks for the help :) ).
Try pulling the latest!
-
I'm trying to spawn a light for testing purposes, but i'm just seeing a hard rectangle shape instead of a smooth light. The rectangle is the same color as the light is supposed to be, but i only see the rectangle if i clear with white instead of standard black clear color.
This is the code i'm using:
#include <memory>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <SFML/System.hpp>
#include <ltbl/lighting/lightSystem.h>
using namespace std;
int main(){
sf::ContextSettings Settings;
Settings.depthBits = 24; // Request a 24 bits depth buffer
Settings.stencilBits = 8; // Request a 8 bits stencil buffer
Settings.antialiasingLevel = 0; // Request 2 levels of antialiasing
// Set Screen Size
sf::Vector2<double> screenSize;
screenSize.x = 1000;
screenSize.y = 800;
//Create the Window
sf::RenderWindow App(sf::VideoMode(screenSize.x, screenSize.y, 32), "Test LTBL2", sf::Style::Close, Settings);
//Frame Limit
App.setFramerateLimit(0);
//Vertical sync
App.setVerticalSyncEnabled(true);
// lights setup
sf::Texture pointLightTexture;
if (!pointLightTexture.loadFromFile("resources/directionLightTexture.png"));
pointLightTexture.setSmooth(true);
sf::Texture penumbraTexture;
if (!penumbraTexture.loadFromFile("resources/penumbraTexture.png"));
penumbraTexture.setSmooth(true);
ltbl::LightSystem ls;
sf::Shader unshadowShader;
sf::Shader lightOverShapeShader;
if (!unshadowShader.loadFromFile("resources/unshadowShader.vert", "resources/unshadowShader.frag"));
if (!lightOverShapeShader.loadFromFile("resources/lightOverShapeShader.vert", "resources/lightOverShapeShader.frag"));
ls.create(ltbl::rectFromBounds(sf::Vector2f(-1000.0f, -1000.0f), sf::Vector2f(1000.0f, 1000.0f)), App.getSize(), penumbraTexture, unshadowShader, lightOverShapeShader);
std::shared_ptr<ltbl::LightPointEmission> light = std::make_shared<ltbl::LightPointEmission>();
light->_emissionSprite.setOrigin(sf::Vector2f(pointLightTexture.getSize().x * 0.5f, pointLightTexture.getSize().y * 0.5f));
light->_emissionSprite.setTexture(pointLightTexture);
light->_emissionSprite.setScale(sf::Vector2f(1.0f, 1.0f));
light->_emissionSprite.setColor(sf::Color(255, 230, 200));
light->_emissionSprite.setPosition(sf::Vector2f(500, 400));
ls.addLight(light);
while (App.isOpen()){
sf::Event Event;
while (App.pollEvent(Event)){
// Window closed
if (Event.type == sf::Event::Closed){
App.close();
}
// Key Pressed
if (Event.type == sf::Event::KeyPressed){
//Quit
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)){
App.close();
}
}
if (Event.type == sf::Event::KeyReleased){
}
}
App.clear(sf::Color(255,255,255));
ls.render(App.getDefaultView(), unshadowShader, lightOverShapeShader);
sf::Sprite sprite;
sprite.setTexture(ls.getLightingTexture());
sf::RenderStates lightRenderStates;
lightRenderStates.blendMode = sf::BlendMultiply;
App.draw(sprite, lightRenderStates);
App.display();
}
return 0;
}
-
Hello Voroz,
It seems like you are loading the directional light texture instead of the point light one ;)
-
Hello Voroz,
It seems like you are loading the directional light texture instead of the point light one ;)
woah, that was a fast reply :). Yeah you're right, now it works :D.
-
In your example of using directional light i got the same result with the rectangle light btw. This is from your example:
sf::Texture pointLightTexture;
pointLightTexture.loadFromFile("resources/directionLightTexture.png");
pointLightTexture.setSmooth(true);
sf::Texture penumbraTexture;
penumbraTexture.loadFromFile("resources/penumbraTexture.png");
penumbraTexture.setSmooth(true);
ltbl::LightSystem ls;
sf::Shader unshadowShader;
unshadowShader.loadFromFile("resources/unshadowShader.vert", "resources/unshadowShader.frag");
ls.create(ltbl::rectFromBounds(sf::Vector2f(-1000.0f, -1000.0f), sf::Vector2f(1000.0f, 1000.0f)), window.getSize(), penumbraTexture, unshadowShader);
std::shared_ptr<ltbl::LightDirectionEmission> light = std::make_shared<ltbl::LightDirectionEmission>();
light->_emissionSprite.setOrigin(sf::Vector2f(pointLightTexture.getSize().x * 0.5f, pointLightTexture.getSize().y * 0.5f));
light->_emissionSprite.setTexture(pointLightTexture);
light->_emissionSprite.setScale(sf::Vector2f(6.0f, 6.0f));
light->_emissionSprite.setColor(sf::Color(255, 230, 200));
light->_emissionSprite.setPosition(sf::Vector2f(0.0f, 0.0f));
light->_castDirection = ltbl::vectorNormalize(sf::Vector2f(-0.1f, 0.6f));
ls.addLight(light);
-
I seem to have trouble with the directional light. This code is following your example and i only get a rectangle:
#include <memory>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <SFML/System.hpp>
#include <ltbl/lighting/lightSystem.h>
using namespace std;
int main(){
sf::ContextSettings Settings;
Settings.depthBits = 24; // Request a 24 bits depth buffer
Settings.stencilBits = 8; // Request a 8 bits stencil buffer
Settings.antialiasingLevel = 0; // Request 2 levels of antialiasing
// Set Screen Size
sf::Vector2<double> screenSize;
screenSize.x = 1000;
screenSize.y = 800;
//Create the Window
sf::RenderWindow App(sf::VideoMode(screenSize.x, screenSize.y, 32), "Test LTBL2", sf::Style::Close, Settings);
//Frame Limit
App.setFramerateLimit(0);
//Vertical sync
App.setVerticalSyncEnabled(true);
// lights setup
sf::Texture directionLightTexture;
if (!directionLightTexture.loadFromFile("resources/directionLightTexture.png"));
directionLightTexture.setSmooth(true);
sf::Texture penumbraTexture;
if (!penumbraTexture.loadFromFile("resources/penumbraTexture.png"));
penumbraTexture.setSmooth(true);
ltbl::LightSystem ls;
sf::Shader unshadowShader;
sf::Shader lightOverShapeShader;
if (!unshadowShader.loadFromFile("resources/unshadowShader.vert", "resources/unshadowShader.frag"));
if (!lightOverShapeShader.loadFromFile("resources/lightOverShapeShader.vert", "resources/lightOverShapeShader.frag"));
ls.create(ltbl::rectFromBounds(sf::Vector2f(-1000.0f, -1000.0f), sf::Vector2f(1000.0f, 1000.0f)), App.getSize(), penumbraTexture, unshadowShader, lightOverShapeShader);
std::shared_ptr<ltbl::LightDirectionEmission> light = std::make_shared<ltbl::LightDirectionEmission>();
light->_emissionSprite.setOrigin(sf::Vector2f(directionLightTexture.getSize().x * 0.5f, directionLightTexture.getSize().y * 0.5f));
light->_emissionSprite.setTexture(directionLightTexture);
light->_emissionSprite.setScale(sf::Vector2f(1.0f, 1.0f));
light->_emissionSprite.setColor(sf::Color(255, 230, 200));
light->_emissionSprite.setPosition(sf::Vector2f(500, 400));
light->_castDirection = ltbl::vectorNormalize(sf::Vector2f(-0.1f, 0.6f));
ls.addLight(light);
while (App.isOpen()){
sf::Event Event;
while (App.pollEvent(Event)){
// Window closed
if (Event.type == sf::Event::Closed){
App.close();
}
// Key Pressed
if (Event.type == sf::Event::KeyPressed){
//Quit
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)){
App.close();
}
}
if (Event.type == sf::Event::KeyReleased){
}
}
App.clear(sf::Color(255,255,255));
ls.render(App.getDefaultView(), unshadowShader, lightOverShapeShader);
sf::Sprite sprite;
sprite.setTexture(ls.getLightingTexture());
sf::RenderStates lightRenderStates;
lightRenderStates.blendMode = sf::BlendMultiply;
App.draw(sprite, lightRenderStates);
App.display();
}
return 0;
}
-
The sprite (the rectangle) should cover the screen. Try setting the dimensions to the screen size and positioning it so that it is centered on the screen.
-
The sprite (the rectangle) should cover the screen. Try setting the dimensions to the screen size and positioning it so that it is centered on the screen.
okay, but it's still just a giant square covering the screen. I thought it was supposed to be a directional light?
-
Directional light is like sunlight. So if you don't have any occluders, all you will see is a white screen ;)
-
ah ok, i thought it was supposed to be a light like from a flashlight :)
-
Btw, i notice the light system eats alot of fps. Does it take more fps than LTBL1 or is it around the same? And what are the advantages of LTBL2 compared to the first LTBL?
I'm using the first one in my game right now together with box2d, but i'm getting occasional stuttering which seems to be the cause of LTBL1.
It could also be from Box2d but i don't see any stuttering when i remove the light system, but that might be because i have 2000 fps instead of 800 fps when i remove LTBL1 so if the cause of stuttering is from box2d it might not show at that high fps.
-
Why on earrh don't you limit the framerate to something sensible - like 60 or 75?
Why waste power rendering frames the users eyes cannot percieve?
-
Why on earrh don't you limit the framerate to something sensible - like 60 or 75?
Why waste power rendering frames the users eyes cannot percieve?
I do limit the framerate to 60 fps, but it's good to unlimit it to check your performance and how much computing power certain things take. Someone with a worse computer might not even get 60 fps if you don't care about looking how fast your app actually can run and optimizing it. Also your fps might drop from 800 fps to a much lower fps briefly (stuttering), which is my problem.
-
I hope lolz123 does not mind me posting this here:
For those interested in better LTBL2 performance and lights that can be switched on/off:
I've made a few small changes in the LTBL2 code by adding two boolean member variables (_isAwake and _isTurnedOn) aswell as appropiate get/set/toggle methods to the QuadtreeOccupant object.
Both the occluders aswell as the lights are initialized as both awake and on by default (so nothing changed in the behaviour of LTBL2 unless you manually switch them off/make them sleep).
namespace ltbl {
class QuadtreeOccupant {
public:
bool _isAwake;
bool _isTurnedOn;
QuadtreeOccupant()
: _pQuadtreeNode(nullptr), _pQuadtree(nullptr), _isAwake(true), _isTurnedOn(true)
{}
bool isAwake();
void setAwake(bool);
void toggleAwake();
void setTurnedOn(bool);
bool isTurnedOn();
void toggleTurnedOn();
};
}
And then each time in the code when i found LTBL2 looping through all the Quadtree occupants (occluders and light objects) to do shadow/light calculations or rendering i inserted a single if-statement that first checks if the occluder/lightobject is actually active AND switched on before actually doing AABB-checks, any shadow calculations or any rendering.
Example in the render method:
void LightDirectionEmission::render(const sf::View &view, sf::RenderTexture &lightTempTexture, sf::RenderTexture &antumbraTempTexture, const std::vector<QuadtreeOccupant*> &shapes, sf::Shader &unshadowShader, float shadowExtension) {
lightTempTexture.setView(view);
LightSystem::clear(lightTempTexture, sf::Color::White);
// Mask off light shape (over-masking - mask too much, reveal penumbra/antumbra afterwards)
for (int i = 0; i < shapes.size(); i++) {
LightShape* pLightShape = static_cast<LightShape*>(shapes[i]);
//Check if Light is awake and turned on
if (pLightShape->isAwake() && pLightShape->isTurnedOn()) {
//...
// Down here comes all the calculate/render stuff, which only gets done if light is awake and on
//...
What's the advantage?
Turning lights/shadows on and off
Well, first of all you can turn lights and occluders(and thus shadows) on and off by using the
void setTurnedOn(bool);
void toggleTurnedOn();
methods, without having to delete the lights/occluders just to turn the light off or remove the shadow casting occluder. You can use for example light switches in your game that have a pointer/reference to the light object and by activating the switch you invoke the toggleTurnedOn() method of the pointed-to light.
Performance boost by putting offscreen/not-in-same-room LTBL2-objects to sleep
In addition to that, you can put your lights and occluders to sleep (similar to sleep/awake in Box2d) by using the
void setAwake(bool);
void toggleAwake();.
methods.
These methods allow LTBL2 to skip calculations for the light/occluder without modifying whether the light/shadow, from the game world perspective, is switched on or off (by a light switch in the level, for example).
How would we use that?
Lets say you have a game with several rooms or zones, which all have light objects. It'd be very inefficient if the game calculates and AABB-checks all the lights of your loaded level if you are not in the same room/zone of the light/occluder, regardless whether they are switched on or off (by switches in the level).
For that there is the "setAwake(bool)" method:
If you leave a room or zone then, on room/zone change, you could invoke a method that loops through all the lights/occluders in said room/zone and setAwake(false) for each of it. In the now new entered room/zone you would then loop through all occluders/lights and invoke setAwake(true) on each.
That way only the lights/occluders that are in the players zone/room get calculated/AABB-checked/rendered.
Example code:
Lets say we have another class (Lightswitch) with a pointer to a LTBL2 light, then we can use it light this
// creates a light, by default it's on and awake
ltbl::LightPointEmission* light1 = new ltbl::LightPointEmission(); // creates a light
//create a lightswitch and make it point to the light
Lightswitch switch1;
switch1.pointedToLight = light1;
//now we can turn it on and off
switch1.pointedToLight->toggleTurnedOn();
//lets say we have a room or zone object that has a vector of LTBL2-lights
//when we leave the room/zone we can put them all to sleep
for (ltbl::LightPointEmission* light : getCurrentRoom()->getLights()) {
light->setAwake(false);
}
In short:
By using these modifications your game
-allows turning on/off of lights/occluders without having to constantly create/delete them
-the game keeps memorized which lights are turned on and off, since you don't create/destroy them all the time but just turn them off/on
-can get a huge performance boost by putting out-of-zone/out-of-room LTBL2 objects to sleep via setAwake(false) and only setAwake(true) if they are near the player/in the same zone or room as the player.
You can download the modified version here
https://www.dropbox.com/s/amk8v17btth6lmq/ltbl2_toggleable.zip?dl=0
Feel free to leave feedback or any errors (i couldn't find any, it's only about 15~20 lines of code that i added).
-
Why not make a pull request? ;)
-
Why not make a pull request? ;)
Good idea, for some reason i didn't think about that option, thank you.
I'll do it later after work (and a bit of code cleanup, i accidently forgot to remove some unneccessary commented out code).
-
Your contribution seems promising! Thanks! Let's hope that lolz123 can evaluate it soon. :)
DJuego
P.S: a powerful post, Sayuri ;D
-
I'm using VS2015 and i cant get it to work :( I made with Cmake and compilator dll file. Then in my project I linked to source folder in C++/Include Directory. I add every file into my project and i get this error:
LightSystem.obj : error LNK2019: unresolved external symbol "public: __thiscall ltbl::QuadtreeNode::QuadtreeNode(class sf::Rect<float> const &,int,class ltbl::QuadtreeNode *,class ltbl::Quadtree *)" (??0QuadtreeNode@ltbl@@QAE@ABV?$Rect@M@sf@@HPAV01@PAVQuadtree@1@@Z) referenced in function "class std::unique_ptr<class ltbl::QuadtreeNode,struct std::default_delete<class ltbl::QuadtreeNode> > __cdecl std::make_unique<class ltbl::QuadtreeNode,class sf::Rect<float> const &,int,std::nullptr_t,class ltbl::DynamicQuadtree * const>(class sf::Rect<float> const &,int &&,ltbl::$T$$QBQAVDynamicQuadtree &&)" (??$make_unique@VQuadtreeNode@ltbl@@ABV?$Rect@M@sf@@H$$TQAVDynamicQuadtree@2@@std@@YA?AV?$unique_ptr@VQuadtreeNode@ltbl@@U?$default_delete@VQuadtreeNode@ltbl@@@std@@@0@ABV?$Rect@M@sf@@$$QAH$$QA$$T$$QBQAVDynamicQuadtree@ltbl@@@Z)
1>DynamicQuadtree.obj : error LNK2001: unresolved external symbol "public: __thiscall ltbl::QuadtreeNode::QuadtreeNode(class sf::Rect<float> const &,int,class ltbl::QuadtreeNode *,class ltbl::Quadtree *)" (??0QuadtreeNode@ltbl@@QAE@ABV?$Rect@M@sf@@HPAV01@PAVQuadtree@1@@Z)
1>DynamicQuadtree.obj : error LNK2019: unresolved external symbol "private: void __thiscall ltbl::QuadtreeNode::removeForDeletion(class std::unordered_set<class ltbl::QuadtreeOccupant *,struct std::hash<class ltbl::QuadtreeOccupant *>,struct std::equal_to<class ltbl::QuadtreeOccupant *>,class std::allocator<class ltbl::QuadtreeOccupant *> > &)" (?removeForDeletion@QuadtreeNode@ltbl@@AAEXAAV?$unordered_set@PAVQuadtreeOccupant@ltbl@@U?$hash@PAVQuadtreeOccupant@ltbl@@@std@@U?$equal_to@PAVQuadtreeOccupant@ltbl@@@4@V?$allocator@PAVQuadtreeOccupant@ltbl@@@4@@std@@@Z) referenced in function "private: void __thiscall ltbl::DynamicQuadtree::contract(void)" (?contract@DynamicQuadtree@ltbl@@AAEXXZ)
1>DynamicQuadtree.obj : error LNK2019: unresolved external symbol "public: void __thiscall ltbl::QuadtreeNode::add(class ltbl::QuadtreeOccupant *)" (?add@QuadtreeNode@ltbl@@QAEXPAVQuadtreeOccupant@2@@Z) referenced in function "public: virtual void __thiscall ltbl::DynamicQuadtree::add(class ltbl::QuadtreeOccupant *)" (?add@DynamicQuadtree@ltbl@@UAEXPAVQuadtreeOccupant@2@@Z)
1>StaticQuadtree.obj : error LNK2001: unresolved external symbol "public: void __thiscall ltbl::QuadtreeNode::add(class ltbl::QuadtreeOccupant *)" (?add@QuadtreeNode@ltbl@@QAEXPAVQuadtreeOccupant@2@@Z)
1>Quadtree.obj : error LNK2019: unresolved external symbol "public: void __thiscall ltbl::QuadtreeNode::pruneDeadReferences(void)" (?pruneDeadReferences@QuadtreeNode@ltbl@@QAEXXZ) referenced in function "public: void __thiscall ltbl::Quadtree::pruneDeadReferences(void)" (?pruneDeadReferences@Quadtree@ltbl@@QAEXXZ)
1>QuadtreeOccupant.obj : error LNK2019: unresolved external symbol "private: void __thiscall ltbl::QuadtreeNode::update(class ltbl::QuadtreeOccupant *)" (?update@QuadtreeNode@ltbl@@AAEXPAVQuadtreeOccupant@2@@Z) referenced in function "public: void __thiscall ltbl::QuadtreeOccupant::quadtreeUpdate(void)" (?quadtreeUpdate@QuadtreeOccupant@ltbl@@QAEXXZ)
1>QuadtreeOccupant.obj : error LNK2019: unresolved external symbol "private: void __thiscall ltbl::QuadtreeNode::remove(class ltbl::QuadtreeOccupant *)" (?remove@QuadtreeNode@ltbl@@AAEXPAVQuadtreeOccupant@2@@Z) referenced in function "public: void __thiscall ltbl::QuadtreeOccupant::quadtreeRemove(void)" (?quadtreeRemove@QuadtreeOccupant@ltbl@@QAEXXZ)
1>MapLoaderPrivate.obj : error LNK2019: unresolved external symbol __imp__inflate referenced in function "private: bool __thiscall tmx::MapLoader::Decompress(char const *,class std::vector<unsigned char,class std::allocator<unsigned char> > &,int,int)" (?Decompress@MapLoader@tmx@@AAE_NPBDAAV?$vector@EV?$allocator@E@std@@@std@@HH@Z)
1>MapLoaderPrivate.obj : error LNK2019: unresolved external symbol __imp__inflateEnd referenced in function "private: bool __thiscall tmx::MapLoader::Decompress(char const *,class std::vector<unsigned char,class std::allocator<unsigned char> > &,int,int)" (?Decompress@MapLoader@tmx@@AAE_NPBDAAV?$vector@EV?$allocator@E@std@@@std@@HH@Z)
1>MapLoaderPrivate.obj : error LNK2019: unresolved external symbol __imp__inflateInit2_ referenced in function "private: bool __thiscall tmx::MapLoader::Decompress(char const *,class std::vector<unsigned char,class std::allocator<unsigned char> > &,int,int)" (?Decompress@MapLoader@tmx@@AAE_NPBDAAV?$vector@EV?$allocator@E@std@@@std@@HH@Z)
1>c:\users\wolv\desktop\Projekty\MapLoader\Debug\MapLoader.exe : fatal error LNK1120: 9 unresolved externals
-
From LTBL2 README
If you are using Visual Studio, you may have to set your startup project to the ERL project, and you may have to add the source files to the project.
So there are not ltbl2 libs for Visual Studio at the moment. :-/ Sorry.
DJuego
-
For some reason this code:
vector<sf::Vector2f> points;
points.push_back(sf::Vector2f(0, 0));
points.push_back(sf::Vector2f(0, 100));
points.push_back(sf::Vector2f(100, 100));
points.push_back(sf::Vector2f(100, 0));
std::shared_ptr<ltbl::LightShape> lightShape = std::make_shared<ltbl::LightShape>();
lightShape->_shape.setPointCount(points.size());
for(int j = 0; j < points.size(); j++)
lightShape->_shape.setPoint(j, (points[j]));
lightShape->_shape.setPosition(Simple2D::b2ToSf(Vec2(3,3)));
ls.addShape(lightShape);
produces a backwards occluder. I tried defining them CCW also. (http://s1.postimg.org/8k7t5519b/thing.png)
Edit: I just realized, is this the intended functionality? How could I just make a line segment that blocks light?
-
@Strikerklm96: This is intentional. If you want to make the inside of the occluder dark, change the occluder's _renderLightOverShape property to false.
Also you should be able to make a line segment with a thin box. I am not sure why you would want it though.
-
I successfully port LTBL2 on Android, it works but not fine.
What's the problem? The lights and occluders works well but the lightRender blinks (in dark) , i tried a lot of thinks to fix it but all failed.
I have to say that all workarounds that i made work fine on PC (windows) without any problems.
I tested the .apk on a Xperia E3 and a Samsung Galaxy tab 4. In both present the same problem.
I will attach a set of images from my Xperia.
http://s000.tinyupload.com/index.php?file_id=05700573672291255943 (http://s000.tinyupload.com/index.php?file_id=05700573672291255943)
-
Anybody run into this problem?
(https://i.imgur.com/aW5Nvni.png)
This is a trace over where the occluders are. The only light source is the red square.
(https://i.imgur.com/zWRGn1R.png)
The first occluder (the yellow line directly above the red square) is not stopping the light. It still does this if I make the light smaller (half the size). As long as the edge of the light gets past the opening, light shows through.
I also just noticed you can see occluders through other occluders when renderLightOverShape is set to true (https://i.imgur.com/dvoFIIN.png)
-
Hi everyone,
I noticed there was no change to 222464's repository of LBTL2 for the last few months and that none of the pull requests were accepted.
So I decided to fork LTBL2 in order to improve it.
This message is for any developer who wants to help the project to grow a little bit faster:
https://github.com/JumpingToasts/LTBL2 (https://github.com/JumpingToasts/LTBL2)
My main concerns are:
- Speed. I'm starting to improve the overall performance even if it requires to change the library interface. My aims are better data locality and as much as precomputing we can so that the render() loop can be the lightest of all. I think this is critical for games to run smoothly.
- Abilities. I'm really interested about what can LTBL offer to the user. Today, I added a feature to handle normal maps. An example can be found in the example folder.
- Interface. I was not really a big fan of original LTBL2 interface, as shared pointers add some computing penalty and no (easy) precise control of memory. I'm fully open to suggestions in order to improve the user experience.
I'll be glad to receive suggestions or (even better) pull requests via the repository issue system.
Please note that this version is in active development, and really not ready for use.
Thank you for reading.
-
Hi everyone,
I noticed there was no change to 222464's repository of LBTL2 for the last few months and that none of the pull requests were accepted.
So I decided to fork LTBL2 in order to improve it.
This message is for any developer who wants to help the project to grow a little bit faster:
https://github.com/JumpingToasts/LTBL2 (https://github.com/JumpingToasts/LTBL2)
My main concerns are:
- Speed. I'm starting to improve the overall performance even if it requires to change the library interface. My aims are better data locality and as much as precomputing we can so that the render() loop can be the lightest of all. I think this is critical for games to run smoothly.
- Abilities. I'm really interested about what can LTBL offer to the user. Today, I added a feature to handle normal maps. An example can be found in the example folder.
- Interface. I was not really a big fan of original LTBL2 interface, as shared pointers add some computing penalty and no (easy) precise control of memory. I'm fully open to suggestions in order to improve the user experience.
I'll be glad to receive suggestions or (even better) pull requests via the repository issue system.
Please note that this version is in active development, and really not ready for use.
Thank you for reading.
Really happy to hear (see) this.
I use LTBL/LTBL2 on my projects. If i can contribute in something let me know.
-
Cool stuff, Breush!
I'd be interested to hear about any ongoing work you do, and really appreciate you sharing.
-
Cool stuff, Breush!
I'd be interested to hear about any ongoing work you do, and really appreciate you sharing.
Thanks Jabberwocky and DarkRoku.
Here's a quick sum-up of my thoughts:
- A small thing I'm doing is getting rid of std::shared_ptr<> in the interface, as the shared pointer is not stored internally in the library, I really don't get why there is this restriction. Doing so, I'm using offering a way to let LTBL manage the lights memory for the user, using some pre-allocated memory pool.
- I added a way to have the light react to normals, but one can imagine more (specularity/depth maps). And I've been doing so just for point lights, it needs to be extended to directional lights.
- I am not an expert in that domain, but I was wondering if I could compute some parts of the code in parallel.
Finally, for people who want to help but don't want to get their hands too dirty (@DarkRoku), I guess one thing you can do is to create a tricky example and try if things goes wrong. And if so, report an issue (and try debug it yourself if you can).
I also wanted to add a small SFML sandbox application to make test things quickly. (For instance, a right click creates a box you can resize, a left click creates a light, and you can drag'n drop things around.) But, I don't think I will do it right now, but I'll be glad to see someone doing that for the project. :)
But I don't have so much time right now, so it has been basic changes so far.
(I'll soon launch a Greenlight trailer for the game I'm developing, hopefully LTBL will make it shine! :)) )
Afterwards, I will surely add a clear TODO list.
-
people who want to help but don't want to get their hands too dirty (@DarkRoku)
I´m re-mastering my game engine, and i had implement LTBL1 and LTBL2 (yes both), i will hard test your implementation.
I´m very insterested on the speed and interface part.
Hope you get all the success.
-
A small thing I'm doing is getting rid of std::shared_ptr<> in the interface, as the shared pointer is not stored internally in the library, I really don't get why there is this restriction. Doing so, I'm using offering a way to let LTBL manage the lights memory for the user, using some pre-allocated memory pool.
I got rid of the shared_pointers in the interface, too.
I added a way to have the light react to normals, but one can imagine more (specularity/depth maps). And I've been doing so just for point lights, it needs to be extended to directional lights.
This is an interesting one. I've been considering doing the same thing.
Since LTBL just spits out a texture you overlay onto the scene, I'd be interested how you accomplished this. Do you output a second texture of light direction, which can be used in a shader to combine with the normals? The only problem there is that you couldn't combine these textures in the same way LTBL combines its light textures into a composite overlay texture.
I am not an expert in that domain, but I was wondering if I could compute some parts of the code in parallel.
Neither am I. Although it does seem like the kind of code which could be run in parallel.
There's no doubt LTBL has a significant impact on performance. Although I haven't measured whether that performance is primarily CPU or GPU (in which case running the code in parallel wouldn't matter).
I'll soon launch a Greenlight trailer for the game I'm developing, hopefully LTBL will make it shine! :)
Awesome, and good luck! Make sure you post a link here so we can upvote.
-
I added a way to have the light react to normals, but one can imagine more (specularity/depth maps). And I've been doing so just for point lights, it needs to be extended to directional lights.
This is an interesting one. I've been considering doing the same thing.
Since LTBL just spits out a texture you overlay onto the scene, I'd be interested how you accomplished this. Do you output a second texture of light direction, which can be used in a shader to combine with the normals? The only problem there is that you couldn't combine these textures in the same way LTBL combines its light textures into a composite overlay texture.
There is a dedicated example in the repository.
I do have a separate RenderTexture for the normals.
The idea is that each time you draw something,you also draw the normals version of it to the normals texture:
head.setTexture(headTexture);
window.draw(head);
head.setTexture(headNormalsTexture);
ls.normalsTargetDraw(head);
That way, whatever your scene graph is, you'll get a full representation of your scene in normals.
I think this is flexible enough to adapt to each system.
Afterwards, when the light system renders its lights, it will use the full normals texture for each composite part.
And you get the usual LTBL light texture to add to your scene (but with normals matching your scene!).
-
There is a dedicated example in the repository.
I do have a separate RenderTexture for the normals.
The idea is that each time you draw something,you also draw the normals version of it to the normals texture:
head.setTexture(headTexture);
window.draw(head);
head.setTexture(headNormalsTexture);
ls.normalsTargetDraw(head);
That way, whatever your scene graph is, you'll get a full representation of your scene in normals.
I think this is flexible enough to adapt to each system.
Afterwards, when the light system renders its lights, it will use the full normals texture for each composite part.
And you get the usual LTBL light texture to add to your scene (but with normals matching your scene!).
Ahh, right, that totally makes sense.
I was thinking about it in the wrong way (storing the light direction in a texture, not the scene normals). It kind of works like a 3D deferred rendering pipeline.
Cool!
-
If anything, I just want to be able to build this for windows; last time I checked it didn't work well and my only option was to add the files to my project. Which got clustered quickly. Anywho, I guess it's cool someone picked up the project.
-
A lot of cheers and luck with your initiative, Breush!
I also am very interested in a ultimate 2D lighting system! ;D
DJuego
-
If anything, I just want to be able to build this for windows; last time I checked it didn't work well and my only option was to add the files to my project. Which got clustered quickly. Anywho, I guess it's cool someone picked up the project.
I checked on Windows with MinGW32 and it did not worked. But I just fixed it.
The fact is that the compiler was confused because of the name Math.h, which it believed to be the standard include <math.h>. Strange but hey...
I don't have Visual Studio to test, but I know you'd need a recent version in order to have decent C++11 features.
-
If anything, I just want to be able to build this for windows; last time I checked it didn't work well and my only option was to add the files to my project. Which got clustered quickly. Anywho, I guess it's cool someone picked up the project.
I checked on Windows with MinGW32 and it did not worked. But I just fixed it.
The fact is that the compiler was confused because of the name Math.h, which it believed to be the standard include <math.h>. Strange but hey...
I don't have Visual Studio to test, but I know you'd need a recent version in order to have decent C++11 features.
I can test it on Visual Studio 2013.
Want to i tried it know or better wait some days?
-
If you allow me, I will partner with you in this beautiful purpose.
I can test it on Visual Studio 2015 when Breush considers the moment has come.
DJuego
-
I can test it on Visual Studio 2013.
Want to i tried it know or better wait some days?
If you allow me, I will partner with you in this beautiful purpose.
I can test it on Visual Studio 2015 when Breush considers the moment has come.
Well, even if the project is not ready for release, I think the sooner, the better.
Because if there are some things I have to be careful about when coding, I'd like to know right now.
The repository has a CMake. It should be easy for you guys to test.
Let me know via an issue on GitHub or a pull request if you can fix it.
Thanks.
-
I can test it on Visual Studio 2013.
Want to i tried it know or better wait some days?
If you allow me, I will partner with you in this beautiful purpose.
I can test it on Visual Studio 2015 when Breush considers the moment has come.
Well, even if the project is not ready for release, I think the sooner, the better.
Because if there are some things I have to be careful about when coding, I'd like to know right now.
The repository has a CMake. It should be easy for you guys to test.
Let me know via an issue on GitHub or a pull request if you can fix it.
Thanks.
I patched the sf::Color( r , g , b , a ) paramter. VS++ gime and error for requering narrowing conversion.
Also noexcept with
#ifndef _MSC_VER
#define NOEXCEPT noexcept
#else
#define NOEXCEPT
#endif
But, there are no __declspec(dllexport) to create shared libraries. The compiler (VS2013) only generates the .dll, cause there is no exports, .lib archive is not generated.
-
#if !defined(_MSC_VER) || _MSC_VER >= 1900
#define NOEXCEPT noexcept
#else
#define NOEXCEPT
#endif
-
Well. I tested with Microsoft Visual Studio 2015 (x64) and MinGW ( x86-64-win32-seh-rev0 gcc 5.3.0). Both attempts failed. :-[
My system is Windows 10. It was used the last SFML (from git repository).
I attached the nmake and make outputs.
DJuego
-
My system is Windows 10. It was used the last SFML (from git repository).
I attached the nmake and make outputs.
This just look like SFML not being linked in the program you're running.
Can you try with the option SFML_STATIC_LIBS set to true?
-
My apologies, I could have informed you that it was the lack of __declspec(dllexport). The only problems I had when building LTBL2 was the .lib was never built.
-
But, there are no __declspec(dllexport) to create shared libraries. The compiler (VS2013) only generates the .dll, cause there is no exports, .lib archive is not generated.
My apologies, I could have informed you that it was the lack of __declspec(dllexport). The only problems I had when building LTBL2 was the .lib was never built.
OK, I'm really not used to Windows environments.
Can either of you do a pull request or send me (via PM) a diff (git diff or svn diff)?
-
Hi, just found this and it looks amazing! I want to try and implement LTBL2 into a game im working on. Can anyone explain to me how i include it it my project? I know i can include the directory directly in my project but is there a way to include it as a library / additional include ?
When I just add the files to my project I have to change #include <LTBL\xxxxx> to #"include <LTBL\xxxxx>"
I am using VS btw.
-
1>Math.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall sf::ConvexShape::ConvexShape(class sf::ConvexShape &&)" (__imp_??0ConvexShape@sf@@QAE@$$QAV01@@Z) referenced in function "class sf::ConvexShape __cdecl ltbl::shapeFromRect(class sf::Rect<float> &)" (?shapeFromRect@ltbl@@YA?AVConvexShape@sf@@AAV?$Rect@M@3@@Z)
I get this when i try to compile in VS 2015
-
Is there any way to use LTBL with vs 2015?
im trying to get it to work since some time. without any success. the .lib file wont generate & including all the source files into the project didnt work for me either :/
-
Is there any way to use LTBL with vs 2015?
im trying to get it to work since some time. without any success. the .lib file wont generate & including all the source files into the project didnt work for me either :/
It won't make windows files correctly, not sure why; including source files is your only option. We need to know what errors you are getting not "Didn't work for me either :/". What didn't work
-
Is there any way to use LTBL with vs 2015?
im trying to get it to work since some time. without any success. the .lib file wont generate & including all the source files into the project didnt work for me either :/
We need to know what errors you are getting not "Didn't work for me either :/". What didn't work
You mean like "It won't make windows files correctly, not sure why"?
-
You mean like "It won't make windows files correctly, not sure why"?
I am not asking for help, he is. I have my version working.
-
Hey ! you have done a really great job, i want to use it in my game engine but when compiling in VS2015 i got weird errors
Debug Win32:
G:\Projets\Node\Repository\external\LTBL2-master\LTBL2\source\ltbl\quadtree\QuadtreeOccupant.cpp(15): error C2248: 'ltbl::Quadtree::_outsideRoot' : impossible d'accéder à protected membre déclaré(e) dans la classe 'ltbl::Quadtree'
G:\Projets\Node\Repository\external\LTBL2-master\LTBL2\source\ltbl\quadtree\QuadtreeOccupant.cpp(25): error C2248: 'ltbl::Quadtree::_outsideRoot' : impossible d'accéder à protected membre déclaré(e) dans la classe 'ltbl::Quadtree'
this lines say "impossible to reach protected member in class ltbl::QuadTree" from QuadtreeOccupant.cpp(15 and 25)
EDIT: Solved but i had to edit l 54 of Quadtree.h and add "friend class QuadtreeOccupant;"
Anyway great work keep on !
-
Hi !
While working on my engine I wanted to improve as much as possible LTBL2.
I forked the main repository and reviewed ALL the code.
Changes (compared to the actual version) :
- Light management : use create...() to create your light and add it to the system (no shared pointers used)
- No more public variables access
- Quadtree : rebuilt entirely
- LightSystem : simplified render call and minor performance improvements
- LightShape & LightPointEmission are updated with the quadtree
- LightDirectionEmission has been simplified
- Some performance improvements, based on Sayuri suggestion here : http://fr.sfml-dev.org/forums/index.php?topic=16895.msg138669#msg138669
- Add resources direclty in C++ (PenumbraTexture, UnshadowShader & LightOverShapeShader)
- Documentation : https://cmdu76.github.com/LTBL2
- Two-files version, just add LetThereBeLight.cpp and LetThereBeLight.hpp
Here is the repository :
https://github.com/Cmdu76/LTBL2
Feel free to suggest or pull request
(The next feature I might add is normals)
If lolz123 can see this, can you tell me if I need to make a pull request ? As it changes almost all files, I wasn't sure you'll accept it..
-
Thank you so much for your work Cmdu76 !!!
I'm speaking in the name of all our dev team here, we were looking forward to the implementation of the Sayuri awake/turned on system within the LTBL because we couldn't figure out how to do it by ourselves...And it's also a very good news that you got rid of the shared pointers !
Hopefully this will help us resolve our performance issues haha !
Thanks again !
-
Yes. Thanks Cmdu76. Thanks. Thanks. Thanks! Any evolution of this extension is a great news.
In my opinion LTBL2 is one of the more interesting projects in the SFML cosmos (yes thor too :P). Damn! It is one of the more interesting projects in the 2D graphics universe (!). :D
Your changes seem fantastic. I will try to test them so soon be possible for me in Mingw-builgs gcc 6.2.0 and Visual Studio 2015.
I like very much the header-only proposal but if you need to add the LetThereBeLight.hpp & LetThereBeLight.cpp... is it header-only? ??? Anyway i am happy. This is the joy of the day for me. 8)
DJuego
-
I worked using VS2015 and I haven't tested it elsewhere yet.
Okay that is not really header-only, I read that having .cpp is better for compilation time.
I hope people will test it and give me some feedback.
I'm also working on the normals, I'm getting inspired by the implementation of Breush, here : https://github.com/JumpingToasts/LTBL2
The normals aren't in the two files, yet. I'm waiting a good implementation for normals
-
Thanks Cmdu76! I've been using LTBL2 for some time now ( video: https://youtu.be/CPy467vARa4 [EDIT: new better video] ) It's great, the main problem I have is the performance though. I'm going to try your version and give you some feedback.
-
Today, I added my version of LTBL2 in my engine.
The previous version of a demo game using the main version of LTBL2 was running at 45 FPS,
The new version of this demo game using my version of LTBL2 is running at 55 FPS.
That is a small improvement but still good anyway. (+22%)
There is still something uncool with it, I was working on normals, but I'm not a graphical expert. I haven't succeed in adding that functionnality.
I added some code an interface to provide it but there is still a problem somewhere that don't render the normals...
It would be so great if anyone can help there :D
-
First off: Thank you Cmdu76 for picking this project up!
Secondly, maybe this has been mentioned before, and there is probably a simple answer for it, but shouldn't the light be blocked by the side of the object that is facing it? I took some screenshots to help explain that. Look at the following.
(http://i66.tinypic.com/2qn00eh.png)
Everything looks fine when you draw whatever is blocking the light. Check out what happens when you don't though.
(http://i68.tinypic.com/6thb4p.png)
The side of the box opposite to the light is blocking the light.. For most people this probably isn't a problem; however, in my project, I don't plan to draw the light blockers. Maybe this is intentional, I'm not sure, maybe you could look at it Cmdu76?
To further explain what I mean, I edited the second image to produce what I would expect the result to be.
(Or similar to this)
(http://i65.tinypic.com/4jrxhv.png)
EDIT::
To, again, further explain, I would expect the result to be the above because we are lighting in a 2D world, meaning the side of the block facing us could have any depth, in a 2D world that wouldn't be measure. For the light to shine on the side of the block facing the player we would have to assume the light is 3D, that is, it has enough depth to light the top of the block, and it is also positioned closer the the player, meaning it is on a different plane that the object it is shining light on.
-
lolz123 added this functionnality but as the project wasn't documented most people doesn't noticed it.
You can use :
shape->setRenderLightOver(true); // If you use my version
shape->_renderLightOverShape = true; // If you use lolz123 version's
Edit : I tested it, and the result wasn't what I expected, I'll take look...
-
I simulated the effect I wanted simply by setting the objects color to the light systems ambient color. Works unless you use alpha.
-
Is it possible to use it with the isometric tiled maps?
-
@R23MJ
I hadn't the time to really look at it...
But you can try something like that :
sf::RectangleShape shape;
shape.setSize({ 200.f, 50.f });
shape.setPosition({ 500.f, 300.f });
shape.setFillColor(lightSystem.getAmbientColor());
lightSystem.createLightShape(shape);
And then draw your shape
@Ezhoikam
Isometric usually divide y-axis length by 2, but I suggest you to try. The effect might be good depending on the render you want.
-
Cmdu76 I'm trying to use your version but I'm getting these errors:
1>------ Build started: Project: lbtltest, Configuration: Debug Win32 ------
1> main.cpp
1> main-cmdu76.cpp
1> LetThereBeLight.cpp
1> Generating Code...
1>main-cmdu76.obj : error LNK2005: "public: void __thiscall ltbl::priv::BaseLight::toggleTurnedOn(void)" (?toggleTurnedOn@BaseLight@priv@ltbl@@QAEXXZ) already defined in LetThereBeLight.obj
1>main-cmdu76.obj : error LNK2019: unresolved external symbol "public: __thiscall ltbl::Sprite::Sprite(void)" (??0Sprite@ltbl@@QAE@XZ) referenced in function _main
1>main-cmdu76.obj : error LNK2019: unresolved external symbol "public: void __thiscall ltbl::Sprite::setTexture(class sf::Texture &,bool)" (?setTexture@Sprite@ltbl@@QAEXAAVTexture@sf@@_N@Z) referenced in function _main
1>main-cmdu76.obj : error LNK2019: unresolved external symbol "public: void __thiscall ltbl::Sprite::setNormalsTexture(class sf::Texture &)" (?setNormalsTexture@Sprite@ltbl@@QAEXAAVTexture@sf@@@Z) referenced in function _main
1>main-cmdu76.obj : error LNK2019: unresolved external symbol "public: void __thiscall ltbl::Sprite::render(class sf::RenderTarget &,class sf::RenderStates)" (?render@Sprite@ltbl@@QAEXAAVRenderTarget@sf@@VRenderStates@4@@Z) referenced in function _main
1>main-cmdu76.obj : error LNK2019: unresolved external symbol "public: __thiscall ltbl::LightSystem::LightSystem(bool)" (??0LightSystem@ltbl@@QAE@_N@Z) referenced in function _main
1>main-cmdu76.obj : error LNK2019: unresolved external symbol "public: void __thiscall ltbl::LightSystem::addSprite(class ltbl::Sprite &)" (?addSprite@LightSystem@ltbl@@QAEXAAVSprite@2@@Z) referenced in function _main
1>c:\users\admin\documents\visual studio 2012\Projects\lbtltest\Debug\lbtltest.exe : fatal error LNK1120: 6 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
What do I have to do? :/
I also tried the original version but I can't compile that one either because make_unique and other c++14 stuff isn't supported on my compiler
edit: yeah it was due to old files it's fixed now thank you!
-
Why are you using VS2012?
-
Cmdu76 I'm trying to use your version but I'm getting these errors:
1>------ Build started: Project: lbtltest, Configuration: Debug Win32 ------
1> main.cpp
1> main-cmdu76.cpp
1> LetThereBeLight.cpp
1> Generating Code...
1>main-cmdu76.obj : error LNK2005: "public: void __thiscall ltbl::priv::BaseLight::toggleTurnedOn(void)" (?toggleTurnedOn@BaseLight@priv@ltbl@@QAEXXZ) already defined in LetThereBeLight.obj
1>main-cmdu76.obj : error LNK2019: unresolved external symbol "public: __thiscall ltbl::Sprite::Sprite(void)" (??0Sprite@ltbl@@QAE@XZ) referenced in function _main
1>main-cmdu76.obj : error LNK2019: unresolved external symbol "public: void __thiscall ltbl::Sprite::setTexture(class sf::Texture &,bool)" (?setTexture@Sprite@ltbl@@QAEXAAVTexture@sf@@_N@Z) referenced in function _main
1>main-cmdu76.obj : error LNK2019: unresolved external symbol "public: void __thiscall ltbl::Sprite::setNormalsTexture(class sf::Texture &)" (?setNormalsTexture@Sprite@ltbl@@QAEXAAVTexture@sf@@@Z) referenced in function _main
1>main-cmdu76.obj : error LNK2019: unresolved external symbol "public: void __thiscall ltbl::Sprite::render(class sf::RenderTarget &,class sf::RenderStates)" (?render@Sprite@ltbl@@QAEXAAVRenderTarget@sf@@VRenderStates@4@@Z) referenced in function _main
1>main-cmdu76.obj : error LNK2019: unresolved external symbol "public: __thiscall ltbl::LightSystem::LightSystem(bool)" (??0LightSystem@ltbl@@QAE@_N@Z) referenced in function _main
1>main-cmdu76.obj : error LNK2019: unresolved external symbol "public: void __thiscall ltbl::LightSystem::addSprite(class ltbl::Sprite &)" (?addSprite@LightSystem@ltbl@@QAEXAAVSprite@2@@Z) referenced in function _main
1>c:\users\admin\documents\visual studio 2012\Projects\lbtltest\Debug\lbtltest.exe : fatal error LNK1120: 6 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
What do I have to do? :/
I also tried the original version but I can't compile that one either because make_unique and other c++14 stuff isn't supported on my compiler
Maybe you should rebuild the entire solution, VS might not have recognized that you changed some files.
-
Hey, I'm having trouble getting this effect: I need occluders to cast shadows over other occluders like this:
(http://i63.tinypic.com/msbtvp.png)
I need the box on the bottom to be affected by the box on the top (meaning: be in the dark), like the player is.
In (1) player and grey box are visible and on (2) only the player is in the dark while the grey box isn't affected by the shadow of the big box.
Any idea on how to achieve this?
-
Hey, I'm having trouble getting this effect: I need occluders to cast shadows over other occluders like this:
(http://i63.tinypic.com/msbtvp.png)
I need the box on the bottom to be affected by the box on the top (meaning: be in the dark), like the player is.
In (1) player and grey box are visible and on (2) only the player is in the dark while the grey box isn't affected by the shadow of the big box.
Any idea on how to achieve this?
I was messing with this severals months ago, i couldn't reach a reliable way to solve this issue, but you can try the method "renderLightOverShape"
-
I use ltbl2 in my game "Last of the Ambaras" now :) Just wanted to share some impressions. I refactored the framework to support my own quad-tree and modified the interface. I didnt see ltbl2 in a top-down-game before, so I guess some of you might be interested in how it could look.
(https://media.giphy.com/media/l0ExiU81D6ucRQqNa/source.gif)
-
Looks nice! Do you have your changes to LTBL2 online somewhere?
-
Uploaded it here: https://github.com/Ung0d/light_ungod/tree/master
However, its fully integrated in my engine (uses my quad-tree, depends on my signal system to emit signals when a light of an entity is changed, depends on my logger ect...) so this is not intended to compile in any way. I dont want to make my whole engine open source, hope you understand :)
I merged the things together I liked most of the different reimplementations of LTBL2 posted in this thread and added the stuff I usually have in systems in my engine (component-support, signals ect). I biggest changes I made are:
1) I introduced LightAffectors. Thats basically a std::function-wrapper that refers to a specific PointLight. The affector code is called every frame. Maybe its note noticeable in the gif, but you can realize light-flickering and other neat stuff this way. See LightSystem::update and LightAffector class
2) In (I think) all other versions of ltbl, a Light and a LightCollider were rendered (and all heavy calculations were computed) even if their bounding boxes did not collide and thus the light was not affected by the collider at all. I changed that behavior. Now the LightSystem checks for collision of the bounding boxes (which is cheap in compare) and light-colliders that do not collide with a light are ignored. See LightSystem::renderLight
-
I currently work on a "small" game framework using SFML and LTBL2.
Starting out with the version of Cmdu76, I modified it a bit further.
In addition to normal maps, I implemented specular maps, the ability for occluders to cast shadows on other occluders and also added a little pseudo-bloom shader.
The pseudo bloom isn't embedded in LTBL2 (yet?) but sits in a wrapper class of mine.
(http://i.imgur.com/v1UTHB4.gif) (http://sharex.flatspot.pictures/sfml/2017-03-16_0005.mp4)
Click the gif for a higher quality window
-
Nice ! I'm glad it helped you !
Do the modifications you made are open source somewhere ?
-
Sure! There (https://github.com/Alia5/FSE) you go. :)
It's not a separate LTBL2 repo, though, as I have it merged into my framework.
Edit:
It's worth noting that I didn't implement normal/specular maps for directional lights yet.
Also, I changed LTBLs sprites to require a separate call for drawing the regular texture, normals and specular, which kinda defeats the point a bit, but makes it overall more flexible.
-
Any update about this? It is a pity that there is no a lighting extension for SFML alive and happy. :-|
DJuego
-
Hey, it is possible to disable the shadow "system", and keep the image light effect and mostly the occluders effect ?
-
I guess you wouldn't need such a complex library for that.
Just draw your "lights" to some renderTexture, draw black shapes for your occluders, and finally blend that render texture additively ;)
-
to sum it up:
let there be light (https://github.com/eXpl0it3r/LTBL)
let there be light 2 (https://github.com/222464/LTBL2)
let there be light 2 by Cmdu76 (https://github.com/Cmdu76/LTBL2)
let there be light 2 by Alia5 (https://github.com/Alia5/FSE/tree/master/LTBL2)
I did notice that Alia5 did further improve Cmdu76's version of LTBL2, for example ltbl::LightSystem::create now deletes existing objects (marked as TODO in Cmdu76 version), BaseLight in Utils.hpp got a virtual Destructor which is important to prevent object slicing when inherited objects are deleted and so forth...
It seems advisable to use Alia5's version of LTBL2.
-
Thank you for the LTBL2 compilation, Grundkurs
Well. I wish so much that this project had a more updated and powerful successor ...
DJuego
-
Hey while using Cmdu76's version of the library I am getting a segfault in the LightSystem::Update(sf::Vector2u const& size) function at mEmissionTempTexture.create(size.x, size.y); while running the example project (https://github.com/Cmdu76/LTBL2/blob/master/examples/main.cpp).
Here is the backtrace:
#0 0x00007ffff7b94ed4 in sf::RenderTarget::initialize (this=0x7fffffffd628) at /SFML/Graphics/RenderTarget.cpp:545
#1 0x00007ffff7b933d4 in sf::RenderTexture::create (this=0x7fffffffd628, width=800, height=600, settings=...) at SFML/Graphics/RenderTexture.cpp:92
#2 0x00007ffff7b93264 in sf::RenderTexture::create (this=0x7fffffffd628, width=800, height=600, depthBuffer=false) at SFML/Graphics/RenderTexture.cpp:54
#3 0x000000000041ac01 in ltbl::LightSystem::update (this=0x7fffffffd070, size=...) at LTBL/LightSystem.cpp:330
#4 0x0000000000418ff3 in ltbl::LightSystem::create (this=0x7fffffffd070, rootRegion=..., imageSize=...) at LTBL/LightSystem.cpp:44
#5 0x0000000000406e87 in main () at main.cpp:43
And here's some screenshots of the output:
(https://i.imgur.com/bqQFzxl.png)
(https://i.imgur.com/pwOQ7OW.png)
Anybody see what I'm doing wrong?
-
@Alia5: i tried your LTBL2 implementation, however a minimal example already produced a strange result.
I cannot set the Origin of a LightPointEmission-Object to the center without the Light-Point getting "spliced".
I did use the common "pointLightTexture.png", which is round.
#include "LTBL2/LightSystem.hpp"
#include <SFML/Graphics/RenderTexture.hpp>
#include <SFML/Graphics/RenderWindow.hpp>
int main() {
sf::RenderTexture normal_texture_;
sf::RenderTexture specular_texture_;
sf::RenderWindow window{sf::VideoMode{800,600}, "LightShow"};
ltbl::LightSystem lightSystem{normal_texture_,specular_texture_,true};
lightSystem.create({ -1000.f, -1000.f, 2000.f, 2000.f }, window.getSize());
sf::Texture pointLightTexture;
pointLightTexture.loadFromFile("../examples/pointLightTexture.png");
pointLightTexture.setSmooth(true);
auto* light = lightSystem.createLightPointEmission();
light->setTexture(pointLightTexture);
light->setOrigin(pointLightTexture.getSize().x / 2.f, pointLightTexture.getSize().y / 2.f);
light->setScale(10.f,10.f);
while (window.isOpen()) {
sf::Event event;
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed) {
window.close();
}
}
sf::Vector2f pos(sf::Mouse::getPosition(window));
light->setPosition(pos);
window.clear(sf::Color::White);
lightSystem.render(window);
window.display();
}
return 0;
}
This produces this Lightpoint:
(https://c1.staticflickr.com/5/4862/45013972764_2166a2feec.jpg)
The white dot marks the position of the mouse (the mouse cursor does not get captured when taking screenshots).
-
@Grundkurs
I haven't worked on anything the last half a year or something, but I don't think my mods to LTBL2 work really well for a standalone implementation outside of FSE. (Hence it's not a fork but directly baked into the repo)
For reference you can look at:
https://github.com/Alia5/FSE/blob/master/FSE/Lights/FSELightWorld.cpp (https://github.com/Alia5/FSE/blob/master/FSE/Lights/FSELightWorld.cpp)
Edit: I might decouple them somewhat one day, but when and if that day ever comes remains to be seen
-
I've been trying to fiddle with this for a bit.
So after a long and hair pulling process, I managed to generate a .lib (I think)
Now that my project builds yet again, I'm trying to add some lights but since there is no documentation, I'm having a rough time.
Would anyone be able to shine some light for me? (Sorry for the bad pun) :-X
Any help would be appreciated!
Edit: spelling
-
Hi, I hope this is not dead ??? I'm still using LTBL2 , it's great!
For performance issues I wanted to use 2 diferent ltbl::LightSystem(), one for static lights (render once, draw every frame) and another one for dynamic lights (render and draw every frame).
The issue I'm having is that when drawing both lightSystems everything is really dark, I guess the not lighted parts are being drawn twice, thus turning everything dark.
Is there a way to only draw the lights for each lightSystem and not the dark parts? :o
Or maybe there is another way instead of using 2 light systems, I need to render only the lights that change and not the static ones, BUT I need to draw every light, every frame.
-
Is there a way to only draw the lights for each lightSystem and not the dark parts? :o
You could try drawing the second one using an additive blend mode.
See BlendMode documentation (https://www.sfml-dev.org/documentation/2.5.1/structsf_1_1BlendMode.php).
-
Thanks for the answer, but that didn't work, it still draws the dark parts twice and the lights very strong, that's not the result I want.
Maybe I need to create other sprites (penumbraTexture.png, etc.) with the dark parts as transparent for the second lightsystem. I don't know how to do that but I'll mess around with GIMP and see what's the result.
If lolz or someone has another easy answer for using 2 light systems it would be great.
-
Hello, I've been using SFML for quite a while, but stumbled upon this gem of a library a few days ago.
I have successfully integrated Alia5's version of LTBL2 and I am VERY pleased with it but there's 1 thing missing for me to achive what I want:
I'd love to have a directional light source to interact with normal/specular maps - a way to lit the surface of every object drawn to normal map buffer from given angle, a kind of global light source.
I suspect it can be done after every other light source is drawn with slight modification of existing shaders, but currently it's beyond me. If I'll manage to do it I'll post it here, but feel free to be first if it's no biggie to you :-*
Many thanks to everyone involved in this project and SFML itself.
-
As I said, there it is:
Shader to add global directional lighting, every pixel is lit from given direction vector without cosidering the distance (slightly modified version of the one included in the library, I only use it to draw light with additive blending):
uniform sampler2D normalTexture;
uniform sampler2D specularTexture;
uniform float lightPower;
uniform vec3 lightColor;
uniform vec3 lightDirection;
uniform vec2 targetSize;
void main()
{
vec2 coord = gl_TexCoord[0].xy;
vec4 specMap = texture2D(specularTexture, gl_FragCoord.xy / targetSize, 1.0);
vec3 normalColor = texture2D(normalTexture, gl_FragCoord.xy / targetSize).rgb;
vec3 normal = normalize(normalColor * 2.0 - 1.0);
vec3 lightDir = normalize(lightDirection);
float colorIntensity = max(dot(normal, lightDir), 0.0);
vec4 specular = vec4(0.0);
float lightSpecPower = (specMap.r + specMap.g + specMap.b) * lightPower;
vec4 lightSpecColor = vec4(vec4(lightColor, 1.0) * specMap);
if (colorIntensity > 0.0)
{
vec4 specColor = specMap;
vec3 reflectDir = reflect(-lightDir, normal);
float specModifier = max(dot(reflectDir, lightDir), 0.0);
specular = pow(specModifier, lightSpecPower) * specColor * lightSpecColor;
specular.a = 1.0;
}
gl_FragColor = clamp(specular, 0.0, 1.0);
}
Also, I needed a shader to correct rotated normal maps of the sprites so there it is:
#version 120
uniform sampler2D texture;
const float TAU = 6.28318530718;
void main()
{
float angle = gl_Color.b * TAU;
vec2 rotation = vec2(cos(angle), sin(angle));
mat3x3 rot_matrix = mat3x3(vec3(rotation.x, -rotation.y, 0.0), vec3(rotation.y, rotation.x, 0.0), vec3(0.0, 0.0, 1.0));
vec4 normalsColor = texture2D(texture, gl_TexCoord[0].xy);
if (gl_Color.r < 1.0)
normalsColor.r = 1.0 - normalsColor.r;
if (gl_Color.g < 1.0)
normalsColor.g = 1.0 - normalsColor.g;
vec3 normals = normalize(normalsColor.rgb * 2.0 - 1.0);
normals = normals * rot_matrix;
vec4 result = vec4((normals.rgb + 1.0) * 0.5, normalsColor.a);
gl_FragColor = clamp(result, 0.0, 1.0);
}
As you can see, it uses vertex color channels to represent rotation and flipping, so you dont have to set any uniforms while drawing - useful for collective VertexArrays
Red color - if lower than 1.0 (or 255 in sf::Color) flips the normal map horizontally
Green color - if lower than 1.0 (or 255 in sf::Color) flips the normal map vertically
Blue color - is angle in radians divided by Tau (2 * Pi)
Simply use it to draw normal maps
-
Hello
I have problem thats my light point emmision is only a half of circle and i dont know how to fix it :/
I use fallowing code with Alia5 LTBL2:
#include "ltbl/lighting/LightSystem.hpp"
#include <SFML/Graphics.hpp>
#include <iostream>
int main() {
sf::RenderTexture normal_texture_;
sf::RenderTexture specular_texture_;
sf::RenderWindow window{sf::VideoMode{800,600}, "LightShow"};
ltbl::LightSystem lightSystem{normal_texture_,specular_texture_,true};
lightSystem.create({ -1000.f, -1000.f, 1000.f, 1000.f }, window.getSize());
sf::Texture pointLightTexture;
pointLightTexture.loadFromFile("resources/pointLightTexture.png");
pointLightTexture.setSmooth(true);
auto* light = lightSystem.createLightPointEmission();
light->setTexture(pointLightTexture);
light->setOrigin(pointLightTexture.getSize().x / 2.f, pointLightTexture.getSize().y / 2.f);
light->setScale(10.f,10.f);
while (window.isOpen()) {
sf::Event event;
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed) {
window.close();
}
}
sf::Vector2f pos(sf::Mouse::getPosition(window));
light->setPosition(pos);
window.clear(sf::Color::White);
lightSystem.render(window);
window.display();
}
return 0;
}
any tips?
edit: dummy me
ltbl::LightSystem lightSystem{normal_texture_,specular_texture_,FALSE};