#################################################################################
#   The MIT License
#   
#   Tempest Renderer
#   Copyright (c) 2010-2014 Zdravko Velinov
#   
#   Permission is hereby granted, free of charge, to any person obtaining a copy
#   of this software and associated documentation files (the "Software"), to deal
#   in the Software without restriction, including without limitation the rights
#   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
#   copies of the Software, and to permit persons to whom the Software is
#   furnished to do so, subject to the following conditions:
#
#   The above copyright notice and this permission notice shall be included in
#   all copies or substantial portions of the Software.
#
#   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
#   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
#   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
#   THE SOFTWARE.
##################################################################################

IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/nda-build.cmake)
	INCLUDE(nda-build.cmake)
    SET(TEMPEST_NDA_CMAKE nda-build.cmake)
    SET(TEMPEST_NDA_APIS on PARENT_SCOPE)
    SET(TEMPEST_NDA_INCLUDE_DIRS ${TEMPEST_NDA_INCLUDE_DIRS} PARENT_SCOPE)
ENDIF()

ADD_DEFINITIONS(${PNG_DEFINITIONS}
                ${SIMD_FLAGS}
                -DTEMPEST_LIBRARY_BUILD=1)

IF(WIN32)
    SET(PLATFORM_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/include/tempest/utils/w32)
ENDIF()

INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include
                    ${CMAKE_BINARY_DIR}/include
                    ${CMAKE_SOURCE_DIR}/external
                    ${CMAKE_SOURCE_DIR}/external/libvpx
                    #${FLEX_INCLUDE_DIRS}
                    # ${PNG_INCLUDE_DIRS}
                    ${EMBREE_INCLUDE_DIR}
                    ${PLATFORM_INCLUDE_DIRS}
                    ${CMAKE_CURRENT_BINARY_DIR}
                    ${CMAKE_CURRENT_SOURCE_DIR}
                    ${WINDOW_SYSTEM_INCLUDE_DIR}
                    ${TEMPEST_NDA_INCLUDE_DIRS}
                    ${CMAKE_SOURCE_DIR}/external/kissfft
                    ${CMAKE_SOURCE_DIR}/external/glslang
                    )

SET(TEMPEST_UTILS_INC
    ${CMAKE_SOURCE_DIR}/include/tempest/utils/assert.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/utils/file-system.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/utils/interleave-vertices.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/utils/library.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/utils/logging.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/utils/macros.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/utils/memory.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/utils/parse-command-line.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/utils/patterns.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/utils/testing.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/utils/display-image.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/utils/refractive-indices.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/utils/threads.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/utils/video-encode.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/utils/config.hh.in
    ${CMAKE_SOURCE_DIR}/include/tempest/utils/viewer.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/utils/codec.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/utils/linear-allocator.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/utils/zip.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/utils/condor-wrapper.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/utils/event-record.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/utils/line-project.hh
   )

IF(WIN32)
	SET(TEMPEST_PLATFORM_UTILS_SRC utils/misc-w32.cc)
ENDIF()

SET(TEMPEST_UTILS_SRC
    ${TEMPEST_PLATFORM_UTILS_SRC}
    utils/assert.cc
    utils/memory.cc
    utils/parse-command-line.cc
    utils/logging.cc
    utils/library.cc
    utils/file-system.cc
    utils/threads.cc
    utils/interleave-vertices.cc
    utils/video-encode.cc
    utils/viewer.cc
    utils/zip.cc
    utils/condor-wrapper.cc
    utils/refractive-indices.cc
    utils/event-record.cc
    utils/line-project.cc
   )

IF(UNIX)
    SET(TEMPEST_GL_PLATFORM_SPECIFIC_SRC
        graphics/opengl-backend/gl-window-x11.cc
        graphics/os-window-x11.cc)
ELSEIF(WIN32)
	SET(TEMPEST_GL_PLATFORM_SPECIFIC_SRC
		graphics/opengl-backend/gl-window-w32.cc
		graphics/os-window-w32.cc)
ENDIF()

SET(TEMPEST_SHADING_SRC
    ${CMAKE_SOURCE_DIR}/shading/blinn-phong.tfx
    ${CMAKE_SOURCE_DIR}/shading/deferred-material-pass.tfx
    ${CMAKE_SOURCE_DIR}/shading/fps.tfx
    ${CMAKE_SOURCE_DIR}/shading/mesh-gbuffer.tfx
    ${CMAKE_SOURCE_DIR}/shading/blit.tfx
    ${CMAKE_SOURCE_DIR}/shading/tone-mapping.tfx
    ${CMAKE_SOURCE_DIR}/shading/mesh-shadow.tfx
    ${CMAKE_SOURCE_DIR}/shading/mesh-light.tfx)

SET(TEMPEST_GRAPHICS_GL_SRC
    ${TEMPEST_GL_PLATFORM_SPECIFIC_SRC}
    graphics/opengl-backend/gl-library.cc
    graphics/opengl-backend/gl-backend.cc
    graphics/opengl-backend/gl-command-buffer.cc
    graphics/opengl-backend/gl-compiler.cc
    graphics/opengl-backend/gl-shader.cc
    graphics/opengl-backend/gl-buffer.cc
    graphics/opengl-backend/gl-input-layout.cc
    graphics/opengl-backend/gl-texture.cc
    graphics/opengl-backend/gl-state-object.cc
    graphics/opengl-backend/gl-storage.cc
    graphics/opengl-backend/gl-io-command-buffer.cc
    graphics/opengl-backend/gl-framebuffer.cc
    )

SET(TEMPEST_GRAPHICS_GL_INC
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/opengl-backend/gl-all.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/opengl-backend/gl-backend.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/opengl-backend/gl-buffer.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/opengl-backend/gl-command-buffer.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/opengl-backend/gl-compiler.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/opengl-backend/gl-convenience.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/opengl-backend/gl-input-layout.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/opengl-backend/gl-input-layout.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/opengl-backend/gl-library.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/opengl-backend/gl-shader.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/opengl-backend/gl-texture.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/opengl-backend/gl-utils.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/opengl-backend/gl-window.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/opengl-backend/gl-state-object.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/opengl-backend/gl-storage.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/opengl-backend/gl-io-command-buffer.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/opengl-backend/gl-framebuffer.hh
    )

IF(NOT DISABLE_VULKAN)
    SET(TEMPEST_GRAPHICS_VULKAN_SRC
        graphics/vulkan-backend/vulkan-window.cc
        graphics/vulkan-backend/vulkan-library.cc
        graphics/vulkan-backend/vulkan-backend.cc
        graphics/vulkan-backend/vulkan-compiler.cc
        graphics/vulkan-backend/vulkan-render-pass.cc
        graphics/vulkan-backend/vulkan-framebuffer.cc
        graphics/vulkan-backend/vulkan-command-buffer.cc
        graphics/vulkan-backend/vulkan-shader.cc
        graphics/vulkan-backend/vulkan-buffer.cc
        graphics/vulkan-backend/vulkan-state-object.cc
        graphics/vulkan-backend/vulkan-upload-heap.cc
        graphics/vulkan-backend/vulkan-texture.cc
        graphics/vulkan-backend/vulkan-sampler.cc
        graphics/vulkan-backend/vulkan-bind-point-layout.cc
        graphics/vulkan-backend/vulkan-io-command-buffer.cc
        graphics/vulkan-backend/vulkan-storage.cc
        )

    SET(TEMPEST_GRAPHICS_VULKAN_INC
        ${CMAKE_SOURCE_DIR}/include/tempest/graphics/vulkan-backend/vulkan-library.hh
        ${CMAKE_SOURCE_DIR}/include/tempest/graphics/vulkan-backend/vulkan-backend.hh
        ${CMAKE_SOURCE_DIR}/include/tempest/graphics/vulkan-backend/vulkan-compiler.hh
        ${CMAKE_SOURCE_DIR}/include/tempest/graphics/vulkan-backend/vulkan-convenience.hh
        ${CMAKE_SOURCE_DIR}/include/tempest/graphics/vulkan-backend/vulkan-window.hh
        ${CMAKE_SOURCE_DIR}/include/tempest/graphics/vulkan-backend/vulkan-all.hh
        ${CMAKE_SOURCE_DIR}/include/tempest/graphics/vulkan-backend/vulkan-render-pass.hh
        ${CMAKE_SOURCE_DIR}/include/tempest/graphics/vulkan-backend/vulkan-framebuffer.hh
        ${CMAKE_SOURCE_DIR}/include/tempest/graphics/vulkan-backend/vulkan-common.hh
        ${CMAKE_SOURCE_DIR}/include/tempest/graphics/vulkan-backend/vulkan-command-buffer.hh
        ${CMAKE_SOURCE_DIR}/include/tempest/graphics/vulkan-backend/vulkan-shader.hh
        ${CMAKE_SOURCE_DIR}/include/tempest/graphics/vulkan-backend/vulkan-buffer.hh
        ${CMAKE_SOURCE_DIR}/include/tempest/graphics/vulkan-backend/vulkan-state-object.hh
        ${CMAKE_SOURCE_DIR}/include/tempest/graphics/vulkan-backend/vulkan-upload-heap.hh
        ${CMAKE_SOURCE_DIR}/include/tempest/graphics/vulkan-backend/vulkan-texture.hh
        ${CMAKE_SOURCE_DIR}/include/tempest/graphics/vulkan-backend/vulkan-sampler.hh
        ${CMAKE_SOURCE_DIR}/include/tempest/graphics/vulkan-backend/vulkan-bind-point-layout.hh
        ${CMAKE_SOURCE_DIR}/include/tempest/graphics/vulkan-backend/vulkan-io-command-buffer.hh
        ${CMAKE_SOURCE_DIR}/include/tempest/graphics/vulkan-backend/vulkan-storage.hh
        ${CMAKE_SOURCE_DIR}/include/tempest/graphics/vulkan-backend/vulkan-functions.hh
        )
ENDIF()

SET(TEMPEST_GRAPHICS_MODELS_SRC
    graphics/ray-tracing/models.cc
    )

SET(TEMPEST_GRAPHICS_MAIN_SRC
	${TEMPEST_NDA_GRAPHICS_SRC}
    ${TEMPEST_GRAPHICS_MODELS_MAIN_SRC}
    graphics/ray-tracing/models-impl.cc
    graphics/equirectangular-map.cc
    graphics/rendering-convenience.cc
    graphics/rendering-definitions.cc
    graphics/texture.cc
    graphics/ray-tracing/ray-tracing.cc
    graphics/ray-tracing/ray-tracing-system.cc
    graphics/cube-map.cc
    graphics/scratch-texture.cc
    graphics/scene-rasterizer.cc
    graphics/scene-rasterizer-system.cc
    graphics/precompute.cc
   )

SET(TEMPEST_GRAPHICS_SRC
    ${TEMPEST_GRAPHICS_MAIN_SRC}
    ${TEMPEST_GRAPHICS_GL_SRC}
    ${TEMPEST_GRAPHICS_VULKAN_SRC}
   )

SET(TEMPEST_GRAPHICS_REFLECTANCE_MODELS_INC
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/ray-tracing/ggx-models-impl.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/ray-tracing/beckmann-models-impl.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/ray-tracing/diffractive-scratches-impl.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/ray-tracing/btf-models-impl.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/ray-tracing/misc-models-impl.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/ray-tracing/ggx-models.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/ray-tracing/beckmann-models.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/ray-tracing/diffractive-scratches-models.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/ray-tracing/btf-models.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/ray-tracing/misc-models.hh)

SET(TEMPEST_GRAPHICS_MAIN_INC
    ${TEMPEST_NDA_GRAPHICS_INC}
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/api-all.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/os-window.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/rendering-backend.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/rendering-convenience.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/rendering-definitions.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/state-object.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/texture.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/cube-map.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/shader.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/ray-tracing/ray-tracing.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/ray-tracing/ray-tracing-common.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/ray-tracing/ray-tracing-system.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/ray-tracing/illumination-models.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/ray-tracing/illumination-models-impl.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/ray-tracing/microfacet-common.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/software-rasterizer.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/sampling-wrapper.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/custom-samplers.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/equirectangular-map.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/scratch-texture.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/scratch-texture.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/scene-rasterizer.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/scene-rasterizer-system.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/ray-tracing-cpu.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/graphics/precompute.hh
	${CMAKE_SOURCE_DIR}/include/tempest/graphics/command-buffer.hh
   )

SET(TEMPEST_GRAPHICS_INC
    ${TEMPEST_GRAPHICS_MAIN_INC}
    ${TEMPEST_GRAPHICS_REFLECTANCE_MODELS_INC}
    ${TEMPEST_GRAPHICS_GL_INC}
    ${TEMPEST_GRAPHICS_VULKAN_INC}
    )

SET(TEMPEST_IMAGE_INC
    ${CMAKE_SOURCE_DIR}/include/tempest/image/btf.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/image/image.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/image/label.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/image/image-utils.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/image/tga-image.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/image/png-image.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/image/stb-image.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/image/exr-image.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/image/bpr-image.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/image/eps-draw.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/image/image-process.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/image/hough-transform.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/image/plot.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/image/vector-draw-common.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/image/svg-draw.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/image/nef-image.hh
   )

SET(TEMPEST_IMAGE_SRC
    ${CMAKE_SOURCE_DIR}/src/image/btf.cc
    ${CMAKE_SOURCE_DIR}/src/image/image.cc
    ${CMAKE_SOURCE_DIR}/src/image/label.cc
    ${CMAKE_SOURCE_DIR}/src/image/image-utils.cc
    ${CMAKE_SOURCE_DIR}/src/image/tga-image.cc
    ${CMAKE_SOURCE_DIR}/src/image/png-image.cc
    ${CMAKE_SOURCE_DIR}/src/image/stb-image.cc
    ${CMAKE_SOURCE_DIR}/src/image/exr-image.cc
    ${CMAKE_SOURCE_DIR}/src/image/bpr-image.cc
    ${CMAKE_SOURCE_DIR}/src/image/dds-image.cc
    ${CMAKE_SOURCE_DIR}/src/image/eps-draw.cc
    ${CMAKE_SOURCE_DIR}/src/image/svg-draw.cc
    ${CMAKE_SOURCE_DIR}/src/image/image-process.cc
    ${CMAKE_SOURCE_DIR}/src/image/hough-transform.cc
    ${CMAKE_SOURCE_DIR}/src/image/nef-image.cc
   )

SET(TEMPEST_TEXTURE_INC
    ${CMAKE_SOURCE_DIR}/include/tempest/texture/texture-table.hh
   )

SET(TEMPEST_TEXTURE_SRC
    ${CMAKE_SOURCE_DIR}/src/texture/texture-table.cc
   )

IF(UNIX)
	SET(TEMPEST_INPUT_SRC
        input/controller-linux.cc
	   )
ELSEIF(WIN32)
	SET(TEMPEST_INPUT_SRC
        input/controller-xinput.cc
	   )
ENDIF()

SET(TEMPEST_INPUT_INC
    ${CMAKE_SOURCE_DIR}/include/tempest/input/controller.hh
   )

SET(TEMPEST_VOLUME_INC
    ${CMAKE_SOURCE_DIR}/include/tempest/volume/volume.hh
   )

SET(TEMPEST_VOLUME_SRC
    volume/volume.cc
   )

FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/shader)

IF(FLEX_FOUND)
    IF(WIN32)
        FLEX_TARGET(TempestScanner "${CMAKE_CURRENT_SOURCE_DIR}/shader/shader-lexer.l"
                    "${CMAKE_CURRENT_SOURCE_DIR}/shader/shader-lexer.cc"
                    COMPILE_FLAGS "-L -Pshader_")
    ELSE()
        FLEX_TARGET(TempestScanner "${CMAKE_CURRENT_SOURCE_DIR}/shader/shader-lexer.l"
                    "${CMAKE_CURRENT_BINARY_DIR}/shader/shader-lexer.cc"
                    COMPILE_FLAGS "-Pshader_")
    ENDIF()
ELSE()
    SET(FLEX_TempestScanner_OUTPUTS "${CMAKE_CURRENT_SOURCE_DIR}/shader/shader-lexer.cc")
ENDIF()

SET(TEMPEST_SHADER_SRC
    shader/shader-lexer.l
    shader/dx-shader-generator.cc
    shader/gl-shader-generator.cc
    shader/shader-convert-common.cc
    shader/shader-common.cc
    shader/shader-driver.cc
    shader/shader-ast.cc
    shader/shader-parser.cc
    ${FLEX_TempestScanner_OUTPUTS}
   )

SET(TEMPEST_SHADER_INC
    ${CMAKE_SOURCE_DIR}/include/tempest/shader/dx-shader-generator.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/shader/gl-shader-generator.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/shader/shader-convert-common.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/shader/shader-common.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/shader/shader-driver.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/shader/shader-parser.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/shader/shader-ast.hh
   )

SET(TEMPEST_PARSER_SRC
    parser/ast.cc
    parser/driver-base.cpp
   ) 

SET(TEMPEST_PARSER_INC
    ${CMAKE_SOURCE_DIR}/include/tempest/parser/ast.hh
   )

SET(TEMPEST_MATH_SRC
    math/matrix4.cc
    math/dual-quaternion.cc
    math/spectrum.cc
    math/triangle.cc
    math/intersect.cc
    math/hdr.cc
    math/vector-variadic.cc
    math/matrix-variadic-advanced.cc
    math/matrix-variadic.cc
    math/pca.cc
    math/simd.cc
	math/sampling3.cc
   )

SET(TEMPEST_MATH_INC
    ${CMAKE_SOURCE_DIR}/include/tempest/math/quaternion.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/matrix4.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/vector4.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/vector3.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/vector2.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/shapes.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/sampling1.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/sampling2.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/sampling3.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/matrix3.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/matrix2.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/curves.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/spectrum.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/intersect.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/functions.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/functions-meta.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/windowing.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/matrix2.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/shape-split.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/numerical-methods.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/hdr.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/triangle.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/matrix-variadic.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/gabor-noise.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/point2.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/simple-basis.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/pca.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/sequence.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/mips.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/vector-spectrum.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/math/simd.hh
   )

SET(TEMPEST_DEBUG_SRC
    debug/fps-counter.cc
   )

SET(TEMPEST_DEBUG_INC
    ${CMAKE_SOURCE_DIR}/include/tempest/debug/fps-counter.hh
   )
   
FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/mesh/obj-loader)
FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/mesh/obj-mtl-loader)

IF(FLEX_FOUND)
    IF(WIN32)
        FLEX_TARGET(ObjScanner "${CMAKE_CURRENT_SOURCE_DIR}/mesh/obj-loader.l"
                    "${CMAKE_CURRENT_SOURCE_DIR}/mesh/obj-loader-lexer.cc"
                    COMPILE_FLAGS "-L -Pobj_loader_")

        FLEX_TARGET(ObjMtlScanner "${CMAKE_CURRENT_SOURCE_DIR}/mesh/obj-mtl-loader.l"
                    "${CMAKE_CURRENT_SOURCE_DIR}/mesh/obj-mtl-loader-lexer.cc"
                    COMPILE_FLAGS "-L -Pobj_mtl_loader_")
    ELSE()
        FLEX_TARGET(ObjScanner "${CMAKE_CURRENT_SOURCE_DIR}/mesh/obj-loader.l"
                    "${CMAKE_CURRENT_BINARY_DIR}/mesh/obj-loader-lexer.cc"
                    COMPILE_FLAGS "-Pobj_loader_")

        FLEX_TARGET(ObjMtlScanner "${CMAKE_CURRENT_SOURCE_DIR}/mesh/obj-mtl-loader.l"
                    "${CMAKE_CURRENT_BINARY_DIR}/mesh/obj-mtl-loader-lexer.cc"
                    COMPILE_FLAGS "-Pobj_mtl_loader_")
    ENDIF()
ELSE()
    SET(FLEX_ObjScanner_OUTPUTS "${CMAKE_CURRENT_SOURCE_DIR}/mesh/obj-loader-lexer.cc")
    SET(FLEX_ObjMtlScanner_OUTPUTS "${CMAKE_CURRENT_SOURCE_DIR}/mesh/obj-mtl-loader-lexer.cc")
ENDIF()

SET(TEMPEST_MESH_SRC
    mesh/lbvh2.cc
    mesh/sslbvh2.cc
    mesh/tbvh.cc
    mesh/obj-loader.l
    mesh/obj-loader.cc
    mesh/obj-loader-driver.cc
    mesh/obj-loader-parser.cc
    mesh/obj-mtl-loader.l
    mesh/obj-mtl-parser.cc
    mesh/octree.cc
    mesh/tessellation.cc
    ${FLEX_ObjScanner_OUTPUTS}
    ${FLEX_ObjMtlScanner_OUTPUTS}
   )

SET(TEMPEST_MESH_INC
   ${CMAKE_SOURCE_DIR}/include/tempest/mesh/bvh-common.hh
   ${CMAKE_SOURCE_DIR}/include/tempest/mesh/bvh-intersect-leaf.hh
   ${CMAKE_SOURCE_DIR}/include/tempest/mesh/lbvh2.hh
   ${CMAKE_SOURCE_DIR}/include/tempest/mesh/tbvh.hh
   ${CMAKE_SOURCE_DIR}/include/tempest/mesh/sslbvh2.hh
   ${CMAKE_SOURCE_DIR}/include/tempest/mesh/octree.hh
   ${CMAKE_SOURCE_DIR}/include/tempest/mesh/obj-loader.hh
   ${CMAKE_SOURCE_DIR}/include/tempest/mesh/obj-loader-parser.hh
   ${CMAKE_SOURCE_DIR}/include/tempest/mesh/obj-mtl-loader.hh
   ${CMAKE_SOURCE_DIR}/include/tempest/mesh/obj-loader-driver.hh
   ${CMAKE_SOURCE_DIR}/include/tempest/mesh/obj-mtl-loader-driver.hh
   ${CMAKE_SOURCE_DIR}/include/tempest/mesh/tessellation.hh
   )

SET(TEMPEST_SYSTEM_INC
    ${CMAKE_SOURCE_DIR}/include/tempest/utils/profiler.hh
    ${CMAKE_SOURCE_DIR}/include/tempest/utils/system.hh
    )

SET(TEMPEST_SYSTEM_SRC
    utils/system.cc
    utils/profiler.cc
    )

SET(TEMPEST_LIBRARY_FILES
    ${TEMPEST_NDA_CMAKE}
    ${TEMPEST_UTILS_INC}
    ${TEMPEST_UTILS_SRC}
    ${TEMPEST_GRAPHICS_SRC}
    ${TEMPEST_GRAPHICS_INC}
    ${TEMPEST_PARSER_SRC}
    ${TEMPEST_PARSER_INC}
    ${TEMPEST_IMAGE_SRC}
    ${TEMPEST_IMAGE_INC}
    ${TEMPEST_INPUT_SRC}
    ${TEMPEST_INPUT_INC}
    ${TEMPEST_MATH_SRC}
    ${TEMPEST_MATH_INC}
    ${TEMPEST_SHADER_SRC}
    ${TEMPEST_SHADER_INC}
    ${TEMPEST_MESH_SRC}
    ${TEMPEST_MESH_INC}
    ${TEMPEST_TEXTURE_SRC}
    ${TEMPEST_TEXTURE_INC}
    ${TEMPEST_VOLUME_SRC}
    ${TEMPEST_VOLUME_INC}
    ${TEMPEST_DEBUG_SRC}
    ${TEMPEST_DEBUG_INC}
    ${TEMPEST_SYSTEM_SRC}
    ${TEMPEST_SYSTEM_INC}
    ${TEMPEST_SHADING_SRC}
    ${CMAKE_SOURCE_DIR}/include/tempest/utils/pchheader.hh
    utils/pchheader.cc
   )

SOURCE_GROUP("Utility functions" FILES ${TEMPEST_UTILS_INC}
									   ${TEMPEST_UTILS_SRC})
SOURCE_GROUP("Graphics" FILES ${TEMPEST_GRAPHICS_MAIN_SRC}
							  ${TEMPEST_GRAPHICS_MAIN_INC})
SOURCE_GROUP(Graphics\\Vulkan FILES ${TEMPEST_GRAPHICS_VULKAN_SRC}
                                    ${TEMPEST_GRAPHICS_VULKAN_INC})
SOURCE_GROUP(Graphics\\Models FILES ${TEMPEST_GRAPHICS_REFLECTANCE_MODELS_INC})
SOURCE_GROUP(Graphics\\OpenGL FILES ${TEMPEST_GRAPHICS_GL_SRC}
                                    ${TEMPEST_GRAPHICS_GL_INC})
SOURCE_GROUP("File parser" FILES ${TEMPEST_PARSER_SRC}
								 ${TEMPEST_PARSER_INC})
SOURCE_GROUP("Image loader" FILES ${TEMPEST_IMAGE_SRC}
								  ${TEMPEST_IMAGE_INC})
SOURCE_GROUP("Input" FILES ${TEMPEST_INPUT_SRC}
						   ${TEMPEST_INPUT_INC})
SOURCE_GROUP("Math" FILES ${TEMPEST_MATH_SRC}
						  ${TEMPEST_MATH_INC})
SOURCE_GROUP("Shader parser" FILES ${TEMPEST_SHADER_SRC}
                                   ${TEMPEST_SHADER_INC})
SOURCE_GROUP("Mesh" FILES ${TEMPEST_MESH_SRC}
                          ${TEMPEST_MESH_INC}
                          ${TEMPEST_VOLUME_SRC}
                          ${TEMPEST_VOLUME_INC})
SOURCE_GROUP("YAML" FILES ${TEMPEST_YAML_SRC}
                          ${TEMPEST_YAML_INC})
SOURCE_GROUP("Shading" FILES ${TEMPEST_SHADING_SRC})
SOURCE_GROUP("Debug" FILES ${TEMPEST_DEBUG_SRC}
                           ${TEMPEST_DEBUG_INC})
SOURCE_GROUP("System" FILES ${TEMPEST_SYSTEM_SRC}
                            ${TEMPEST_SYSTEM_INC})
SOURCE_GROUP("Texture" FILES ${TEMPEST_TEXTURE_SRC}
                             ${TEMPEST_TEXTURE_INC})

IF(UNIX)
    SET(EXTRA_PLATFORM_LIBS dl)
ELSEIF(MINGW_CROSS)
    SET(EXTRA_PLATFORM_LIBS dbghelp)
ENDIF()

SET_PROPERTY(SOURCE ${TEMPEST_SHADER_SRC} ${TEMPEST_SHADER_INC} APPEND PROPERTY COMPILE_FLAGS
             "-I${CMAKE_CURRENT_BINARY_DIR}/shader")

SET_PROPERTY(SOURCE ${TEMPEST_MESH_SRC} ${TEMPEST_MESH_INC} APPEND PROPERTY COMPILE_FLAGS
             "-I${CMAKE_CURRENT_BINARY_DIR}/mesh")

SET(TEMPEST_DEP_LIBRARIES
    ${EXTRA_PLATFORM_LIBS}
    ${EXTRA_PLATFORM_LIBS}
    ${TEMPEST_NDA_STATIC_LIBS}
    ${TEMPEST_NDA_LIBS}
    # ${PNG_LIBRARIES}
    ${EMBREE_LIBRARIES}
    ${CMAKE_THREAD_LIBS_INIT}
    ${WINDOW_SYSTEM_LIBRARIES}
    xxhash
    triangle
    faddeeva
    kissfft
    zstd
    tinyxml2
    libvpx
    )

ADD_LIBRARY(tempest-static STATIC ${TEMPEST_LIBRARY_FILES})

FILE(MAKE_DIRECTORY
    ${CMAKE_BINARY_DIR}/Debug/share/tempest/shading/
    ${CMAKE_BINARY_DIR}/RelWithDebInfo/share/tempest/shading/
    ${CMAKE_BINARY_DIR}/Release/share/tempest/shading/)

FOREACH(SHADER_SRC ${TEMPEST_SHADING_SRC})
    ADD_CUSTOM_COMMAND(TARGET tempest-static
                       POST_BUILD
                       COMMAND ${CMAKE_COMMAND} -E copy_if_different ${SHADER_SRC} ${CMAKE_BINARY_DIR}/Debug/share/tempest/shading/
                       COMMAND ${CMAKE_COMMAND} -E copy_if_different ${SHADER_SRC} ${CMAKE_BINARY_DIR}/RelWithDebInfo/share/tempest/shading/
                       COMMAND ${CMAKE_COMMAND} -E copy_if_different ${SHADER_SRC} ${CMAKE_BINARY_DIR}/Release/share/tempest/shading/
                       DEPENDS ${SHADER_SRC}
                       COMMENT "Copying shader ${SHADER_SRC} to share/tempest/shading/")
ENDFOREACH()

IF(DISABLE_VULKAN)
    TARGET_LINK_LIBRARIES(tempest-static ${TEMPEST_DEP_LIBRARIES})
ELSE()
    IF(WIN32)
        TARGET_LINK_LIBRARIES(tempest-static ${TEMPEST_DEP_LIBRARIES}
                                             debug SPIRVd
                                             debug libglslangd
                                             debug OSDependentd
                                             debug HLSLd
                                             debug OGLCompilerd
                                             optimized SPIRV
                                             optimized libglslang
                                             optimized OSDependent
                                             optimized HLSL
                                             optimized OGLCompiler)
    ELSE()
        TARGET_LINK_LIBRARIES(tempest-static ${TEMPEST_DEP_LIBRARIES}
                                             SPIRV
                                             libglslang
                                             OSDependent
                                             HLSL
                                             OGLCompiler)
    ENDIF()
ENDIF()

IF(MINGW_CROSS)
    SET_PROPERTY(TARGET tempest-static APPEND PROPERTY COMPILE_FLAGS "-Wa,-mbig-obj")
ENDIF()

SET_PROPERTY(TARGET tempest-static PROPERTY FOLDER "Library")

SET_PROPERTY(TARGET tempest-static APPEND PROPERTY COMPILE_DEFINITIONS TEMPEST_CONFIG=$<CONFIG>)

IF(UNIX)
    SET_PROPERTY(TARGET tempest-static APPEND PROPERTY COMPILE_FLAGS "-fPIC")
ENDIF()

#ADD_DEPENDENCIES(tempest-static EmbreeCopyBinaries)

IF(NOT DISABLE_RELOADING)
    ADD_LIBRARY(tempest-models MODULE ${TEMPEST_GRAPHICS_MODELS_SRC})
    TARGET_LINK_LIBRARIES(tempest-models tempest-static)
    IF(CMAKE_COMPILER_IS_GNUCC)
        SET_PROPERTY(TARGET tempest-models APPEND PROPERTY COMPILE_FLAGS "-fvisibility=hidden")
    ENDIF()
ENDIF()

#TARGET_LINK_LIBRARIES(tempest-shared ${TEMPEST_DEP_LIBRARIES})
#SET_PROPERTY(TARGET tempest-shared PROPERTY FOLDER "Library")
#ADD_PRECOMPILED_HEADER(tempest-shared ${CMAKE_SOURCE_DIR}/include/tempest/utils/pchheader.hh FORCEINCLUDE)

IF(UNIX)
# tempest-shared
    SET_TARGET_PROPERTIES(tempest-static PROPERTIES LINK_FLAGS "-Wl,--no-undefined")
ENDIF()

ADD_PRECOMPILED_HEADER(tempest-static ${CMAKE_SOURCE_DIR}/include/tempest/utils/pchheader.hh FORCEINCLUDE)

ADD_LIBRARY(tempest-main STATIC utils/tempest-main.cc)
SET_PROPERTY(TARGET tempest-main PROPERTY FOLDER "Library")

###################################################################################################

IF(NOT DISABLE_QT)
    SET(TEMPEST_QT_WIDGETS_SRC
        qt/tempest-widget.cc
        qt/color-picker.cc
        utils/pchheader.cc)

    SET(TEMPEST_QT_WIDGETS_INC
        ${CMAKE_SOURCE_DIR}/include/tempest/qt/tempest-widget.hh
        ${CMAKE_SOURCE_DIR}/include/tempest/qt/color-picker.hh
        ${CMAKE_SOURCE_DIR}/include/tempest/utils/pchheader.hh
        )

    QT5_WRAP_CPP(TEMPEST_QT_WIDGETS_INC_MOC ${TEMPEST_QT_WIDGETS_INC})

    ADD_LIBRARY(tempest-qt-widgets STATIC ${TEMPEST_QT_WIDGETS_SRC} ${TEMPEST_QT_WIDGETS_INC} ${TEMPEST_QT_WIDGETS_INC_MOC})
    TARGET_LINK_LIBRARIES(tempest-qt-widgets Qt5::Widgets)
    SET_PROPERTY(TARGET tempest-qt-widgets PROPERTY FOLDER "Library")
    #IF(WIN32)
    #    ADD_DEPENDENCIES(tempest-qt-widgets Qt5CopyBinaries)
    #ENDIF()

    ADD_PRECOMPILED_HEADER(tempest-qt-widgets ${CMAKE_SOURCE_DIR}/include/tempest/utils/pchheader.hh FORCEINCLUDE)
ENDIF()

###################################################################################################

ADD_LIBRARY(luatempest-binding STATIC ${CMAKE_SOURCE_DIR}/include/tempest/binding/lua-binding.hh binding/lua-binding.cc binding/lua-large-data.cc)
TARGET_LINK_LIBRARIES(luatempest-binding tempest-static ${LUA_LIBRARIES})
SET_PROPERTY(TARGET luatempest-binding PROPERTY FOLDER "Library")

ADD_PRECOMPILED_HEADER(luatempest-binding ${CMAKE_SOURCE_DIR}/include/tempest/utils/pchheader.hh FORCEINCLUDE)
