From 305c224104be6558f2ece595a47cf29348b60d66 Mon Sep 17 00:00:00 2001 From: nathansmith117 Date: Mon, 3 Feb 2025 06:46:19 -0700 Subject: first commit --- .gitignore | 2 ++ CMakeLists.txt | 17 ++++++++++++++ README.md | 2 ++ src/main.c | 16 +++++++++++++ src/sldj.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/sldj.h | 22 ++++++++++++++++++ src/sldjConfig.h | 12 ++++++++++ src/util.c | 2 ++ src/util.h | 13 +++++++++++ 9 files changed, 154 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 README.md create mode 100644 src/main.c create mode 100644 src/sldj.c create mode 100644 src/sldj.h create mode 100644 src/sldjConfig.h create mode 100644 src/util.c create mode 100644 src/util.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9785597 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +build +.cache diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..bb6c55d --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 3.30.5) + +project(sldj VERSION 1.0) + +find_package(raylib 3.0 REQUIRED) + +set(C_STANDARD 99) +set(C_STANDARD_REQUIRED ON) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +file(GLOB SRC_FILES src/*.c) + +add_executable(${PROJECT_NAME} ${SRC_FILES}) + +target_include_directories(${PROJECT_NAME} PUBLIC include src) +target_link_libraries(${PROJECT_NAME} raylib m tcc) + diff --git a/README.md b/README.md new file mode 100644 index 0000000..47255c3 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# Scanline DJ +Fun little project for making cool videos diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..a02b023 --- /dev/null +++ b/src/main.c @@ -0,0 +1,16 @@ +#include +#include "sldj.h" + +int main() +{ + Sldj sldj; + initSldj(&sldj); + + while (!WindowShouldClose()) + { + updateSldj(&sldj); + } + + closeSldj(&sldj); + return 0; +} diff --git a/src/sldj.c b/src/sldj.c new file mode 100644 index 0000000..a2b0c47 --- /dev/null +++ b/src/sldj.c @@ -0,0 +1,68 @@ +#include "sldj.h" + +void initSldj(Sldj* sldj) +{ + InitWindow(WINDOW_WIDTH, WINDOW_HEIGHT, "Scanline DJ"); + SetWindowState(FLAG_WINDOW_RESIZABLE); + SetTargetFPS(FRAME_RATE); + + sldj->screenTexture = LoadRenderTexture(SCREEN_WIDTH, SCREEN_HEIGHT); + sldj->frameCounter = 0; +} + +uint16_t noise = 0; + +Color scanPoint(uint16_t x, uint16_t y, int frame) +{ + noise ^= frame; + noise ^= x ^ y; + return (Color){.r = (y >> (6 - noise)) ^ (frame << 4), .g = noise >> x, .b = 0, .a = 255}; +} + +void updateSldj(Sldj* sldj) +{ + BeginDrawing(); + + // Scan image. + BeginTextureMode(sldj->screenTexture); + + uint16_t xScaled = 0; + uint16_t yScaled = 0; + + for (uint16_t y = 0; y < SCREEN_HEIGHT; ++y) + { + xScaled = 0; + + for (uint16_t x = 0; x < SCREEN_WIDTH; ++x) + { + DrawPixel(x, y, scanPoint(xScaled, yScaled, sldj->frameCounter)); + xScaled += 65536 / SCREEN_WIDTH; + } + + yScaled += 65536 / SCREEN_HEIGHT; + } + + EndTextureMode(); + + // Draw scanned image. + DrawTexturePro( + sldj->screenTexture.texture, + (Rectangle){0.0, 0.0, SCREEN_WIDTH, SCREEN_HEIGHT}, + (Rectangle){0.0, 0.0, SCREEN_WIDTH, SCREEN_HEIGHT}, + (Vector2){0.0, 0.0}, + 0.0, + WHITE + ); + + EndDrawing(); + + ++sldj->frameCounter; +} + +void closeSldj(Sldj* sldj) +{ + UnloadRenderTexture(sldj->screenTexture); + + CloseWindow(); +} + diff --git a/src/sldj.h b/src/sldj.h new file mode 100644 index 0000000..4db6afb --- /dev/null +++ b/src/sldj.h @@ -0,0 +1,22 @@ +#include +#include +#include +#include +#include + +#include "sldjConfig.h" +#include "util.h" + +#ifndef SLDJ_H +#define SLDJ_H + +typedef struct Sldj { + RenderTexture screenTexture; + int frameCounter; +} Sldj; + +void initSldj(Sldj* sldj); +void updateSldj(Sldj* sldj); +void closeSldj(Sldj* sldj); + +#endif diff --git a/src/sldjConfig.h b/src/sldjConfig.h new file mode 100644 index 0000000..53fa4e9 --- /dev/null +++ b/src/sldjConfig.h @@ -0,0 +1,12 @@ +#ifndef CONFIG_SLDJ_H +#define CONFIG_SLDJ_H + +#define WINDOW_WIDTH 960 +#define WINDOW_HEIGHT 720 + +#define SCREEN_WIDTH 640 +#define SCREEN_HEIGHT 480 + +#define FRAME_RATE 24 + +#endif diff --git a/src/util.c b/src/util.c new file mode 100644 index 0000000..b7e445c --- /dev/null +++ b/src/util.c @@ -0,0 +1,2 @@ +#include "util.h" + diff --git a/src/util.h b/src/util.h new file mode 100644 index 0000000..110aae7 --- /dev/null +++ b/src/util.h @@ -0,0 +1,13 @@ +#include +#include + +#ifndef UTIL_H +#define UTIL_H + +#define SET_BIT(b, n) (b | (0x1 << n)) +#define CLEAR_BIT(b, n) (b & ~(0x1 << n)) +#define IS_BIT_SET(b, n) ((b >> n) & 0x1) +#define TOGGLE_BIT(b, n) (b ^ (0x1 << n)) +#define HAS_FLAG(v, f) ((v & f) == f) + +#endif -- cgit v1.2.3