Commit for 2021.03.12.7z

This commit is contained in:
mrq 2021-03-12 00:00:00 -06:00
parent 7b7d26a494
commit 63ab2a5584
12 changed files with 71 additions and 50 deletions

View File

@ -39,7 +39,7 @@ INCS += -I$(ENGINE_INC_DIR) -I$(INC_DIR) -I$(VULKAN_SDK_PATH)/include -I/mi
LIBS += -L$(ENGINE_LIB_DIR) -L$(LIB_DIR) -L$(LIB_DIR)/$(PREFIX) -L$(VULKAN_SDK_PATH)/Lib LIBS += -L$(ENGINE_LIB_DIR) -L$(LIB_DIR) -L$(LIB_DIR)/$(PREFIX) -L$(VULKAN_SDK_PATH)/Lib
ifneq (,$(findstring win64,$(ARCH))) ifneq (,$(findstring win64,$(ARCH)))
REQ_DEPS += opengl json:nlohmann png openal ogg freetype ncurses curl luajit bullet meshoptimizer xatlas # draco discord REQ_DEPS += vulkan json:nlohmann png openal ogg freetype ncurses curl luajit bullet meshoptimizer xatlas # draco discord
FLAGS += FLAGS +=
DEPS += -lgdi32 DEPS += -lgdi32
else ifneq (,$(findstring dreamcast,$(ARCH))) else ifneq (,$(findstring dreamcast,$(ARCH)))

View File

@ -250,20 +250,20 @@ float random(vec3 seed, int i){
return fract(sin(dot_product) * 43758.5453); return fract(sin(dot_product) * 43758.5453);
} }
float shadowFactor( Light light, uint shadowMap, float def ) { float shadowFactor( Light light, uint shadowMap ) {
vec4 positionClip = light.projection * light.view * vec4(position.world, 1.0); vec4 positionClip = light.projection * light.view * vec4(position.world, 1.0);
positionClip.xyz /= positionClip.w; positionClip.xyz /= positionClip.w;
if ( positionClip.x < -1 || positionClip.x >= 1 ) return def; if ( positionClip.x < -1 || positionClip.x >= 1 ) return 0.0;
if ( positionClip.y < -1 || positionClip.y >= 1 ) return def; if ( positionClip.y < -1 || positionClip.y >= 1 ) return 0.0;
if ( positionClip.z <= 0 || positionClip.z >= 1 ) return def; if ( positionClip.z <= 0 || positionClip.z >= 1 ) return 0.0;
float factor = 1.0; float factor = 1.0;
// spot light // spot light
if ( light.type == 2 || light.type == 3 ) { if ( light.type == 2 || light.type == 3 ) {
float dist = length( positionClip.xy ); float dist = length( positionClip.xy );
if ( dist > 0.5 ) return def; if ( dist > 0.5 ) return 0.0;
// spot light with attenuation // spot light with attenuation
if ( light.type == 3 ) { if ( light.type == 3 ) {
@ -273,6 +273,14 @@ float shadowFactor( Light light, uint shadowMap, float def ) {
vec2 uv = positionClip.xy * 0.5 + 0.5; vec2 uv = positionClip.xy * 0.5 + 0.5;
float bias = light.depthBias; float bias = light.depthBias;
/*
if ( true ) {
float cosTheta = clamp(dot(normal.eye, normalize(light.position.xyz - position.eye)), 0, 1);
bias = clamp(bias * tan(acos(cosTheta)), 0, 0.01);
} else if ( true ) {
bias = max(bias * 10 * (1.0 - dot(normal.eye, normalize(light.position.xyz - position.eye))), bias);
}
*/
float eyeDepth = positionClip.z; float eyeDepth = positionClip.z;
@ -281,13 +289,14 @@ float shadowFactor( Light light, uint shadowMap, float def ) {
return eyeDepth < texture(samplerTextures[shadowMap], uv).r - bias ? 0.0 : factor; return eyeDepth < texture(samplerTextures[shadowMap], uv).r - bias ? 0.0 : factor;
} }
for ( int i = 0; i < samples; ++i ) { for ( int i = 0; i < samples; ++i ) {
// int index = i;
// int index = int( float(samples) * random(gl_FragCoord.xyy, i) ) % samples;
int index = int( float(samples) * random(floor(position.world.xyz * 1000.0), i)) % samples; int index = int( float(samples) * random(floor(position.world.xyz * 1000.0), i)) % samples;
float lightDepth = texture(samplerTextures[shadowMap], uv + poissonDisk[index] / 700.0 ).r; float lightDepth = texture(samplerTextures[shadowMap], uv + poissonDisk[index] / 700.0 ).r;
if ( eyeDepth < lightDepth - bias ) factor -= 1.0 / samples; if ( eyeDepth < lightDepth - bias ) factor -= 1.0 / samples;
} }
return factor; return factor;
} }
vec3 hslToRgb(vec3 HSL) { vec3 hslToRgb(vec3 HSL) {
vec3 RGB; { vec3 RGB; {
float H = HSL.x; float H = HSL.x;
@ -722,7 +731,7 @@ void main() {
light.position.xyz = vec3(ubo.matrices.view[inPushConstantPass] * vec4(light.position.xyz, 1)); light.position.xyz = vec3(ubo.matrices.view[inPushConstantPass] * vec4(light.position.xyz, 1));
if ( validTextureIndex(light.mapIndex) ) { if ( validTextureIndex(light.mapIndex) ) {
float factor = shadowFactor( light, light.mapIndex, 0.0 ); float factor = shadowFactor( light, light.mapIndex );
light.power *= factor; light.power *= factor;
litFactor += light.power; litFactor += light.power;
} }

View File

@ -112,6 +112,7 @@ void main() {
} }
if ( C.a == 0 ) discard; if ( C.a == 0 ) discard;
} }
#if 0
if ( validTextureIndex( material.indexLightmap ) ) { if ( validTextureIndex( material.indexLightmap ) ) {
#if UF_DEFERRED_SAMPLING #if UF_DEFERRED_SAMPLING
outUvs = inSt; outUvs = inSt;
@ -121,6 +122,7 @@ void main() {
#endif #endif
} }
#endif #endif
#endif
#if !UF_DEFERRED_SAMPLING #if !UF_DEFERRED_SAMPLING
// sample normal // sample normal
if ( validTextureIndex( material.indexNormal ) ) { if ( validTextureIndex( material.indexNormal ) ) {

View File

@ -52,12 +52,12 @@ int main(int argc, char** argv){
uf::hooks.call(hook, json); uf::hooks.call(hook, json);
} }
#if UF_ENV_DREAMCAST #if UF_ENV_DREAMCAST
UF_TIMER_MULTITRACE_START("==== START FRAME ===="); // UF_TIMER_MULTITRACE_START("==== START FRAME ====");
ext::render(); ext::render();
UF_TIMER_MULTITRACE("RENDER"); // UF_TIMER_MULTITRACE("RENDER");
ext::tick(); ext::tick();
UF_TIMER_MULTITRACE("TICK"); // UF_TIMER_MULTITRACE("TICK");
UF_TIMER_MULTITRACE_END("==== END FRAME ===="); // UF_TIMER_MULTITRACE_END("==== END FRAME ====");
#else #else
client::render(); client::render();
ext::render(); ext::render();

View File

@ -56,3 +56,11 @@
GL_VALIDATION_MESSAGE("[Validation Error] " << #f << ": " << errorString); \ GL_VALIDATION_MESSAGE("[Validation Error] " << #f << ": " << errorString); \
} \ } \
} }
#if 0
#define GL_MUTEX_LOCK() ext::opengl::mutex.lock();
#define GL_MUTEX_UNLOCK() ext::opengl::mutex.unlock();
#else
#define GL_MUTEX_LOCK();
#define GL_MUTEX_UNLOCK();
#endif

View File

@ -245,7 +245,7 @@ void ext::opengl::CommandBuffer::submit() {
GL_ERROR_CHECK(glClearColor(info->color[0], info->color[1], info->color[2], info->color[3])); GL_ERROR_CHECK(glClearColor(info->color[0], info->color[1], info->color[2], info->color[3]));
GL_ERROR_CHECK(glClearDepth(info->depth)); GL_ERROR_CHECK(glClearDepth(info->depth));
GL_ERROR_CHECK(glClear(info->bits)); GL_ERROR_CHECK(glClear(info->bits));
GL_ERROR_CHECK(glLightModelfv(GL_LIGHT_MODEL_AMBIENT, &info->color[0])); // GL_ERROR_CHECK(glLightModelfv(GL_LIGHT_MODEL_AMBIENT, &info->color[0]));
} break; } break;
case ext::opengl::enums::Command::VIEWPORT: { case ext::opengl::enums::Command::VIEWPORT: {
InfoViewport* info = (InfoViewport*) header; InfoViewport* info = (InfoViewport*) header;

View File

@ -1402,7 +1402,7 @@ void ext::opengl::Graphic::record( CommandBuffer& commandBuffer, GraphicDescript
for ( auto& attribute : descriptor.geometry.attributes.descriptor ) { for ( auto& attribute : descriptor.geometry.attributes.descriptor ) {
if ( attribute.name == "position" ) vertexAttributePosition = attribute; if ( attribute.name == "position" ) vertexAttributePosition = attribute;
else if ( attribute.name == "normal" ) vertexAttributeNormal = attribute; // else if ( attribute.name == "normal" ) vertexAttributeNormal = attribute;
else if ( attribute.name == "color" ) vertexAttributeColor = attribute; else if ( attribute.name == "color" ) vertexAttributeColor = attribute;
else if ( attribute.name == "uv" ) vertexAttributeUv = attribute; else if ( attribute.name == "uv" ) vertexAttributeUv = attribute;
else if ( attribute.name == "st" ) vertexAttributeSt = attribute; else if ( attribute.name == "st" ) vertexAttributeSt = attribute;

View File

@ -142,10 +142,16 @@ void UF_API ext::opengl::removeRenderMode( ext::opengl::RenderMode* mode, bool f
void UF_API ext::opengl::initialize() { void UF_API ext::opengl::initialize() {
device.initialize(); device.initialize();
// swapchain.initialize( device ); // swapchain.initialize( device );
if ( 0 ) { {
std::vector<uint8_t> pixels = { std::vector<uint8_t> pixels = {
255, 0, 255, 255, 0, 0, 0, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255,
0, 0, 0, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255,
255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255,
255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255,
0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255,
0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255,
0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255,
0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255,
}; };
Texture2D::empty.sampler.descriptor.filter.min = uf::renderer::enums::Filter::NEAREST; Texture2D::empty.sampler.descriptor.filter.min = uf::renderer::enums::Filter::NEAREST;
Texture2D::empty.sampler.descriptor.filter.mag = uf::renderer::enums::Filter::NEAREST; Texture2D::empty.sampler.descriptor.filter.mag = uf::renderer::enums::Filter::NEAREST;
@ -301,7 +307,6 @@ void UF_API ext::opengl::tick(){
if ( ext::opengl::states::resized || ext::opengl::settings::experimental::rebuildOnTickBegin ) { if ( ext::opengl::states::resized || ext::opengl::settings::experimental::rebuildOnTickBegin ) {
ext::opengl::states::rebuild = true; ext::opengl::states::rebuild = true;
} }
if ( uf::scene::useGraph ) {
auto graph = uf::scene::generateGraph(); auto graph = uf::scene::generateGraph();
for ( auto entity : graph ) { for ( auto entity : graph ) {
if ( !entity->hasComponent<uf::Graphic>() ) continue; if ( !entity->hasComponent<uf::Graphic>() ) continue;
@ -310,18 +315,6 @@ if ( uf::scene::useGraph ) {
graphic.initializePipeline(); graphic.initializePipeline();
ext::opengl::states::rebuild = true; ext::opengl::states::rebuild = true;
} }
} else {
for ( uf::Scene* scene : uf::scene::scenes ) {
if ( !scene ) continue;
scene->process([&]( uf::Entity* entity ) {
if ( !entity->hasComponent<uf::Graphic>() ) return;
ext::opengl::Graphic& graphic = entity->getComponent<uf::Graphic>();
if ( graphic.initialized || !graphic.process || graphic.initialized ) return;
graphic.initializePipeline();
ext::opengl::states::rebuild = true;
});
}
}
for ( auto& renderMode : renderModes ) { for ( auto& renderMode : renderModes ) {
if ( !renderMode ) continue; if ( !renderMode ) continue;
if ( !renderMode->device ) { if ( !renderMode->device ) {
@ -391,23 +384,12 @@ void UF_API ext::opengl::destroy() {
synchronize(); synchronize();
Texture2D::empty.destroy(); Texture2D::empty.destroy();
if ( uf::scene::useGraph ) {
auto graph = uf::scene::generateGraph(); auto graph = uf::scene::generateGraph();
for ( auto entity : graph ) { for ( auto entity : graph ) {
if ( !entity->hasComponent<uf::Graphic>() ) continue; if ( !entity->hasComponent<uf::Graphic>() ) continue;
uf::Graphic& graphic = entity->getComponent<uf::Graphic>(); uf::Graphic& graphic = entity->getComponent<uf::Graphic>();
graphic.destroy(); graphic.destroy();
} }
} else {
for ( uf::Scene* scene : uf::scene::scenes ) {
if ( !scene ) continue;
scene->process([&]( uf::Entity* entity ) {
if ( !entity->hasComponent<uf::Graphic>() ) return;
uf::Graphic& graphic = entity->getComponent<uf::Graphic>();
graphic.destroy();
});
}
}
for ( auto& renderMode : renderModes ) { for ( auto& renderMode : renderModes ) {
if ( !renderMode ) continue; if ( !renderMode ) continue;
renderMode->destroy(); renderMode->destroy();

View File

@ -1,5 +1,6 @@
#if UF_USE_OPENGL #if UF_USE_OPENGL
#include <uf/ext/opengl/ogl.h>
#include <uf/ext/opengl/opengl.h> #include <uf/ext/opengl/opengl.h>
#include <uf/ext/opengl/rendermode.h> #include <uf/ext/opengl/rendermode.h>
#include <uf/ext/opengl/initializers.h> #include <uf/ext/opengl/initializers.h>
@ -146,6 +147,7 @@ void ext::opengl::RenderMode::render() {
//UF_TIMER_TRACE_INIT(); //UF_TIMER_TRACE_INIT();
#if UF_USE_OPENGL_GLDC #if UF_USE_OPENGL_GLDC
glKosSwapBuffers(); glKosSwapBuffers();
// profiler_print_stats();
#else #else
glutSwapBuffers(); glutSwapBuffers();
#endif #endif

View File

@ -73,17 +73,19 @@ void ext::opengl::BaseRenderMode::initialize( Device& device ) {
GL_ERROR_CHECK(glEnable(GL_BLEND)); GL_ERROR_CHECK(glEnable(GL_BLEND));
GL_ERROR_CHECK(glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); GL_ERROR_CHECK(glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
GL_ERROR_CHECK(glEnable(GL_LIGHTING)); // GL_ERROR_CHECK(glEnable(GL_LIGHTING));
// GL_ERROR_CHECK(glEnable(GL_NORMALIZE)); // GL_ERROR_CHECK(glEnable(GL_NORMALIZE));
GL_ERROR_CHECK(glEnable(GL_COLOR_MATERIAL)); // GL_ERROR_CHECK(glEnable(GL_COLOR_MATERIAL));
GL_ERROR_CHECK(glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE)); // GL_ERROR_CHECK(glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE));
GL_ERROR_CHECK(glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR)); // GL_ERROR_CHECK(glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR));
#if UF_USE_DREAMCAST #if UF_USE_DREAMCAST
GL_ERROR_CHECK(glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 0)); //profiler_enable();
GL_ERROR_CHECK(glShadeModel(GL_SMOOTH)); GL_ERROR_CHECK(glEnable(GL_NEARZ_CLIPPING_KOS));
// GL_ERROR_CHECK(glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 0));
// GL_ERROR_CHECK(glShadeModel(GL_SMOOTH));
#else #else
GL_ERROR_CHECK(glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1)); // GL_ERROR_CHECK(glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1));
GL_ERROR_CHECK(glShadeModel(GL_SMOOTH)); // GL_ERROR_CHECK(glShadeModel(GL_SMOOTH));
#endif #endif
ext::opengl::RenderMode::initialize( device ); ext::opengl::RenderMode::initialize( device );

View File

@ -67,7 +67,11 @@ bool ext::opengl::Texture::generated() const {
} }
void ext::opengl::Texture::destroy() { void ext::opengl::Texture::destroy() {
if ( !device ) return; if ( !device ) return;
if ( generated() ) GL_ERROR_CHECK(glDeleteTextures(1, &image)); if ( generated() ) {
GL_MUTEX_LOCK();
GL_ERROR_CHECK(glDeleteTextures(1, &image));
GL_MUTEX_UNLOCK();
}
image = GL_NULL_HANDLE; image = GL_NULL_HANDLE;
} }
void ext::opengl::Texture::loadFromFile( void ext::opengl::Texture::loadFromFile(
@ -210,11 +214,13 @@ void ext::opengl::Texture::fromBuffers(
this->updateDescriptors(); this->updateDescriptors();
if ( data ) this->update( data, bufferSize, 0 ); if ( data ) this->update( data, bufferSize, 0 );
#else #else
GL_MUTEX_LOCK();
GL_ERROR_CHECK(glGenTextures(1, &image)); GL_ERROR_CHECK(glGenTextures(1, &image));
GL_ERROR_CHECK(glBindTexture(viewType, image)); GL_ERROR_CHECK(glBindTexture(viewType, image));
GL_ERROR_CHECK(glTexParameteri(viewType, GL_TEXTURE_MIN_FILTER, sampler.descriptor.filter.min)); GL_ERROR_CHECK(glTexParameteri(viewType, GL_TEXTURE_MIN_FILTER, sampler.descriptor.filter.min));
GL_ERROR_CHECK(glTexParameteri(viewType, GL_TEXTURE_MAG_FILTER, sampler.descriptor.filter.mag)); GL_ERROR_CHECK(glTexParameteri(viewType, GL_TEXTURE_MAG_FILTER, sampler.descriptor.filter.mag));
GL_ERROR_CHECK(glBindTexture(viewType, 0)); GL_ERROR_CHECK(glBindTexture(viewType, 0));
GL_MUTEX_UNLOCK();
if ( data ) this->update( data, bufferSize, 0 ); if ( data ) this->update( data, bufferSize, 0 );
this->updateDescriptors(); this->updateDescriptors();
#endif #endif
@ -244,9 +250,11 @@ void ext::opengl::Texture::update( uf::Image& image, uint32_t layer ) {
void ext::opengl::Texture::update( void* data, size_t bufferSize, uint32_t layer ) { void ext::opengl::Texture::update( void* data, size_t bufferSize, uint32_t layer ) {
#if UF_ENV_DREAMCAST #if UF_ENV_DREAMCAST
if ( internalFormat > 0 ) { if ( internalFormat > 0 ) {
GL_MUTEX_LOCK();
GL_ERROR_CHECK(glBindTexture(viewType, image)); GL_ERROR_CHECK(glBindTexture(viewType, image));
GL_ERROR_CHECK(glCompressedTexImage2DARB( viewType, 0, internalFormat, width, height, 0, bufferSize, data)); GL_ERROR_CHECK(glCompressedTexImage2DARB( viewType, 0, internalFormat, width, height, 0, bufferSize, data));
GL_ERROR_CHECK(glBindTexture(viewType, 0)); GL_ERROR_CHECK(glBindTexture(viewType, 0));
GL_MUTEX_UNLOCK();
return; return;
} }
#endif #endif
@ -274,6 +282,7 @@ void ext::opengl::Texture::update( void* data, size_t bufferSize, uint32_t layer
format = GL_RGBA; format = GL_RGBA;
break; break;
} }
GL_MUTEX_LOCK();
GL_ERROR_CHECK(glBindTexture(viewType, image)); GL_ERROR_CHECK(glBindTexture(viewType, image));
switch ( viewType ) { switch ( viewType ) {
case enums::Image::VIEW_TYPE_2D: { GL_ERROR_CHECK(glTexImage2D(viewType, 0, format, width, height, 0, format, type, data)); } break; case enums::Image::VIEW_TYPE_2D: { GL_ERROR_CHECK(glTexImage2D(viewType, 0, format, width, height, 0, format, type, data)); } break;
@ -282,6 +291,7 @@ void ext::opengl::Texture::update( void* data, size_t bufferSize, uint32_t layer
#endif #endif
} }
GL_ERROR_CHECK(glBindTexture(viewType, 0)); GL_ERROR_CHECK(glBindTexture(viewType, 0));
GL_MUTEX_UNLOCK();
} }
void ext::opengl::Texture::generateMipmaps( uint32_t layer ) { void ext::opengl::Texture::generateMipmaps( uint32_t layer ) {

View File

@ -708,6 +708,12 @@ void EXT_API ext::tick() {
TIMER( every ) { TIMER( every ) {
// UF_DEBUG_MSG("Framerate: " << (1.0/times.deltaTime) << " FPS | Frametime: " << (times.deltaTime * 1000) << "ms"); // UF_DEBUG_MSG("Framerate: " << (1.0/times.deltaTime) << " FPS | Frametime: " << (times.deltaTime * 1000) << "ms");
UF_DEBUG_MSG("System: " << (every * 1000.0/::times.frames) << " ms/frame | Time: " << time << " | Frames: " << ::times.frames << " | FPS: " << ::times.frames / time); UF_DEBUG_MSG("System: " << (every * 1000.0/::times.frames) << " ms/frame | Time: " << time << " | Frames: " << ::times.frames << " | FPS: " << ::times.frames / time);
#if UF_ENV_DREAMCAST
// pvr_stats_t stats;
// pvr_get_stats(&stats);
// UF_DEBUG_MSG("PVR stats: " << stats.frame_last_time << " ms | " << stats.frame_rate << " fps | " << stats.reg_last_time << " ms | " << stats.rnd_last_time << " ms | " << stats.vtx_buffer_used << " bytes | " << stats.vtx_buffer_used_max << " bytes | " << stats.buf_last_time << " ms" );
#endif
::times.frames = 0; ::times.frames = 0;
} }
} }