diff --git a/Sources/Voxelotl/CMakeLists.txt b/Sources/Voxelotl/CMakeLists.txt index 617335f..d0f5631 100644 --- a/Sources/Voxelotl/CMakeLists.txt +++ b/Sources/Voxelotl/CMakeLists.txt @@ -4,7 +4,9 @@ add_executable(Voxelotl MACOSX_BUNDLE FPSCalculator.swift Application.swift main.swift - shader.metal) + shader.metal + shadertypes.h + module.modulemap) set_source_files_properties( shader.metal PROPERTIES @@ -12,6 +14,7 @@ set_source_files_properties( COMPILE_OPTIONS "-I${PROJECT_SOURCE_DIR}" ) +target_include_directories(Voxelotl PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}") target_link_libraries(Voxelotl PRIVATE SDLSwift) set_target_properties(Voxelotl PROPERTIES XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME YES @@ -33,6 +36,7 @@ set_target_properties(Voxelotl PROPERTIES XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${CMAKE_CURRENT_SOURCE_DIR}/Voxelotl.entitlements" MACOSX_BUNDLE_COPYRIGHT "© 2024 Gay Pizza Specifications") set_source_files_properties(Assets.xcassets PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") +set_source_files_properties(module.modulemap PROPERTIES MACOSX_PACKAGE_LOCATION Modules) source_group("Resources" FILES Assets.xcassets) source_group("Source Files" REGULAR_EXPRESSION "\\.(swift|metal)$") diff --git a/Sources/Voxelotl/Renderer.swift b/Sources/Voxelotl/Renderer.swift index f83a866..fcc8836 100644 --- a/Sources/Voxelotl/Renderer.swift +++ b/Sources/Voxelotl/Renderer.swift @@ -2,65 +2,18 @@ import Foundation import Metal import QuartzCore.CAMetalLayer import simd +import ShaderTypes -// Temp: -@objc fileprivate enum ShaderInputIdx: NSInteger { - case ShaderInputIdxVertices = 0 -} -fileprivate struct ShaderVertex { - let position: SIMD4 - let color: SIMD4 -} +//// Temp: +//@objc fileprivate enum ShaderInputIdx: NSInteger { +// case ShaderInputIdxVertices = 0 +//} +//fileprivate struct ShaderVertex { +// let position: SIMD4 +// let color: SIMD4 +//} class Renderer { - fileprivate static let shaderSource = """ - #ifndef SHADERTYPES_H - #define SHADERTYPES_H - - #ifdef __METAL_VERSION__ - # define NS_ENUM(TYPE, NAME) enum NAME : TYPE NAME; enum NAME : TYPE - # define NSInteger metal::int32_t - #else - # import - #endif - - #include - - typedef NS_ENUM(NSInteger, ShaderInputIdx) { - ShaderInputIdxVertices = 0 - }; - - typedef struct { - vector_float4 position; - vector_float4 color; - } ShaderVertex; - - #endif//SHADERTYPES_H - - #include - - using namespace metal; - - struct FragmentInput { - float4 position [[position]]; - float4 color; - }; - - vertex FragmentInput vertexMain( - uint vertexID [[vertex_id]], - device const ShaderVertex* vtx [[buffer(ShaderInputIdxVertices)]] - ){ - FragmentInput out; - out.position = vtx[vertexID].position; - out.color = vtx[vertexID].color; - return out; - } - - fragment float4 fragmentMain(FragmentInput in [[stage_in]]) { - return in.color; - } - """ - fileprivate static let vertices = [ ShaderVertex(position: SIMD4(-0.5, -0.5, 0.0, 1.0), color: SIMD4(1.0, 0.0, 0.0, 1.0)), ShaderVertex(position: SIMD4( 0.0, 0.5, 0.0, 1.0), color: SIMD4(0.0, 1.0, 0.0, 1.0)), @@ -170,7 +123,7 @@ class Renderer { encoder.setCullMode(MTLCullMode.none) encoder.setRenderPipelineState(pso) - encoder.setVertexBuffer(vtxBuffer, offset: 0, index: ShaderInputIdx.ShaderInputIdxVertices.rawValue) + encoder.setVertexBuffer(vtxBuffer, offset: 0, index: ShaderInputIdx.vertices.rawValue) encoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: 3) encoder.endEncoding() diff --git a/Sources/Voxelotl/module.modulemap b/Sources/Voxelotl/module.modulemap new file mode 100644 index 0000000..3bd68c0 --- /dev/null +++ b/Sources/Voxelotl/module.modulemap @@ -0,0 +1,3 @@ +module ShaderTypes { + header "shadertypes.h" +} diff --git a/Sources/Voxelotl/shader.metal b/Sources/Voxelotl/shader.metal index 8e0998f..17b79ae 100644 --- a/Sources/Voxelotl/shader.metal +++ b/Sources/Voxelotl/shader.metal @@ -1,25 +1,4 @@ -#ifndef SHADERTYPES_H -#define SHADERTYPES_H - -#ifdef __METAL_VERSION__ -# define NS_ENUM(TYPE, NAME) enum NAME : TYPE NAME; enum NAME : TYPE -# define NSInteger metal::int32_t -#else -# import -#endif - -#include - -typedef NS_ENUM(NSInteger, ShaderInputIdx) { - ShaderInputIdxVertices = 0 -}; - -typedef struct { - vector_float4 position; - vector_float4 color; -} ShaderVertex; - -#endif//SHADERTYPES_H +#include "shadertypes.h" #include diff --git a/Sources/Voxelotl/shadertypes.h b/Sources/Voxelotl/shadertypes.h new file mode 100644 index 0000000..86b087a --- /dev/null +++ b/Sources/Voxelotl/shadertypes.h @@ -0,0 +1,22 @@ +#ifndef SHADERTYPES_H +#define SHADERTYPES_H + +#ifdef __METAL_VERSION__ +# define NS_ENUM(TYPE, NAME) enum NAME : TYPE NAME; enum NAME : TYPE +# define NSInteger metal::int32_t +#else +# import +#endif + +#include + +typedef NS_ENUM(NSInteger, ShaderInputIdx) { + ShaderInputIdxVertices = 0 +}; + +typedef struct { + vector_float4 position; + vector_float4 color; +} ShaderVertex; + +#endif//SHADERTYPES_H