Compare commits
2 Commits
aa49a32ace
...
f09db214cc
| Author | SHA1 | Date | |
|---|---|---|---|
| f09db214cc | |||
| 1fce028eea |
@@ -7,27 +7,27 @@ ifeq ($(LDFLAGS),)
|
||||
LDFLAGS := -lwayland-client -lm
|
||||
endif
|
||||
|
||||
LIB_SRC := waymini.c xdg-shell-client-protocol.c
|
||||
LIB_SRC := waymini/waymini.c waymini/xdg-shell-client-protocol.c
|
||||
LIB_OBJ := $(LIB_SRC:.c=.o)
|
||||
|
||||
.PHONY: all clean
|
||||
|
||||
all: libwaymini.a example waymini
|
||||
all: waymini/libwaymini.a example waymini
|
||||
|
||||
libwaymini.a: $(LIB_OBJ)
|
||||
ar rcs $@ $^
|
||||
waymini/libwaymini.a: $(LIB_OBJ)
|
||||
ar rcs -rpath=./waymini $@ $^
|
||||
|
||||
example: example.cpp libwaymini.a
|
||||
example: example.cpp waymini/libwaymini.a
|
||||
g++ $(CFLAGS) -o $@ example.cpp -L. -lwaymini $(LDFLAGS)
|
||||
|
||||
waymini: waymini_standalone.c waymini.c xdg-shell-client-protocol.c
|
||||
$(CC) $(CFLAGS) -o $@ waymini_standalone.c waymini.c xdg-shell-client-protocol.c $(LDFLAGS)
|
||||
waymini: waymini/waymini_standalone.c waymini/waymini.c waymini/xdg-shell-client-protocol.c
|
||||
$(CC) $(CFLAGS) -o $@ waymini/waymini_standalone.c waymini/waymini.c waymini/xdg-shell-client-protocol.c $(LDFLAGS)
|
||||
|
||||
%.o: %.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $<
|
||||
|
||||
clean:
|
||||
rm -f $(LIB_OBJ) libwaymini.a example waymini
|
||||
rm -f $(LIB_OBJ) waymini/libwaymini.a example waymini/waymini
|
||||
|
||||
xdg-shell-client-protocol.c xdg-shell-client-protocol.h: gen-protocols.sh
|
||||
bash gen-protocols.sh
|
||||
bash waymini/gen-protocols.sh
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
write a monolithic header file
|
||||
refactor example code using composition
|
||||
remove draw class entirely
|
||||
create shader classes with polymorphism
|
||||
[ ] write a monolithic header file
|
||||
[x] refactor example code using composition
|
||||
[ ] remove draw class entirely
|
||||
[ ] create shader classes with polymorphism
|
||||
@@ -1,31 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
namespace UwU {
|
||||
|
||||
class Bresenham {
|
||||
private:
|
||||
int16_t x0;
|
||||
int16_t y0;
|
||||
int16_t x1;
|
||||
int16_t y1;
|
||||
int16_t d;
|
||||
int16_t
|
||||
|
||||
public:
|
||||
Bresenham(int16_t x0, int16_t y0, int16_t x1, int16_t y1) {
|
||||
this->x0 = x0;
|
||||
this->y0 = y0;
|
||||
this->x1 = x1;
|
||||
this->y1 = y1;
|
||||
|
||||
if (abs(y1 - y0) < abs(x1 - x0)) {
|
||||
if (x0 > x1) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
+17
@@ -4,6 +4,7 @@
|
||||
|
||||
#include "datatypes.cpp"
|
||||
#include "helpers.cpp"
|
||||
#include "shaders/shader.cpp"
|
||||
|
||||
namespace UwU {
|
||||
// Buffer object - can be a wayland surface or a virtual buffer
|
||||
@@ -42,5 +43,21 @@ namespace UwU {
|
||||
pixels[i + 3] = 0xff; // A
|
||||
return;
|
||||
}
|
||||
|
||||
void drawPixelShader(Coord2 coord, Shader shader) {
|
||||
size_t i = (size_t)coord.y * stride + (size_t)coord.x * 4;
|
||||
uint8_t b0 = pixels[i + 0];
|
||||
uint8_t g0 = pixels[i + 1];
|
||||
uint8_t r0 = pixels[i + 2];
|
||||
Color newColor = shader.color();
|
||||
uint8_t b = Helpers::lerp8(b0, newColor.b, newColor.a);
|
||||
uint8_t g = Helpers::lerp8(g0, newColor.g, newColor.a);
|
||||
uint8_t r = Helpers::lerp8(r0, newColor.r, newColor.a);
|
||||
pixels[i + 0] = b; // B
|
||||
pixels[i + 1] = g; // G
|
||||
pixels[i + 2] = r; // R
|
||||
pixels[i + 3] = 0xff; // A
|
||||
return;
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -1,153 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include "waymini.h"
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "datatypes.cpp"
|
||||
#include "helpers.cpp"
|
||||
#include "triangle.cpp"
|
||||
#include "buffer.cpp"
|
||||
#include "surface.cpp"
|
||||
#include "trapezoid.cpp"
|
||||
#include "line.cpp"
|
||||
#include "rectangle.cpp"
|
||||
#include "point.cpp"
|
||||
|
||||
namespace UwU {
|
||||
|
||||
class Draw {
|
||||
public:
|
||||
|
||||
Draw(uint16_t width, uint16_t height, waymini_key_cb onKey)
|
||||
: surface(width, height, onKey) {}
|
||||
|
||||
class Surface surface;
|
||||
|
||||
bool shouldClose() {
|
||||
return surface.shouldClose();
|
||||
}
|
||||
|
||||
void updateSize() {
|
||||
surface.updateSize();
|
||||
return;
|
||||
}
|
||||
|
||||
uint16_t getWidth() {
|
||||
return surface.getWidth();
|
||||
}
|
||||
|
||||
uint16_t getHeight() {
|
||||
return surface.getHeight();
|
||||
}
|
||||
|
||||
uint16_t getStride() {
|
||||
return surface.getStride();
|
||||
}
|
||||
|
||||
void present() {
|
||||
surface.present();
|
||||
return;
|
||||
}
|
||||
|
||||
void destroy() {
|
||||
surface.destroy();
|
||||
return;
|
||||
}
|
||||
|
||||
// Draw a rectangle (duh)
|
||||
void rectangle(Coord2 point0, Coord2 point1, Color color) {
|
||||
Rectangle rectangle = Rectangle(point0.x, point0.y, point1.x, point1.y);
|
||||
rectangle.draw(surface.buffer, color);
|
||||
return;
|
||||
}
|
||||
|
||||
// Draws a rectangle with a 4-point color gradient
|
||||
void rectangleGradient(Coord2 point0, Coord2 point1, Color colorUL, Color colorUR, Color colorLL, Color colorLR) {
|
||||
// convert to int32_t and ensure x1>x0 && y1>y0
|
||||
int32_t x0, y0, x1, y1;
|
||||
if (point0.x > point1.x) {
|
||||
x0 = (int32_t)point1.x;
|
||||
x1 = (int32_t)point0.x;
|
||||
} else {
|
||||
x0 = (int32_t)point0.x;
|
||||
x1 = (int32_t)point1.x;
|
||||
}
|
||||
if (point0.y > point1.y) {
|
||||
y0 = (int32_t)point1.y;
|
||||
y1 = (int32_t)point0.y;
|
||||
} else {
|
||||
y0 = (int32_t)point0.y;
|
||||
y1 = (int32_t)point1.y;
|
||||
}
|
||||
|
||||
// setup gradient coefficient arrays
|
||||
int32_t w = x1 - x0 + 1;
|
||||
int32_t h = y1 - y0 + 1;
|
||||
int16_t xGrad[w];
|
||||
int16_t yGrad[h];
|
||||
|
||||
// calculate gradient coefficients
|
||||
Helpers::bresenham(0, 0, w - 1, 255, xGrad);
|
||||
Helpers::bresenham(0, 0, h - 1, 255, yGrad);
|
||||
|
||||
// for each point calculate, alpha blend and print color
|
||||
Color Lmix = Color();
|
||||
Color Rmix = Color();
|
||||
Color Xmix = Color();
|
||||
for (int32_t y = y0; y <= y1; y++) {
|
||||
Lmix = Helpers::lerpColor(colorUL, colorLL, (uint8_t)yGrad[y - y0]);
|
||||
Rmix = Helpers::lerpColor(colorUR, colorLR, (uint8_t)yGrad[y - y0]);
|
||||
for (int32_t x = x0; x <= x1; x++) {
|
||||
Xmix = Helpers::lerpColor(Lmix, Rmix, (uint8_t)xGrad[x - x0]);
|
||||
// putPixel(x, y, Xmix.r, Xmix.g, Xmix.b, Xmix.a);
|
||||
surface.buffer.drawPixel(Coord2((uint16_t)x, (uint16_t)y), Xmix);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Fill a simple gradient. Each row is stride bytes.
|
||||
void rainbow() {
|
||||
for (uint32_t y = 0; y < getHeight(); y++) {
|
||||
for (uint32_t x = 0; x < getWidth(); x++) {
|
||||
surface.buffer.drawPixel(Coord2((uint16_t)x, (uint16_t)y), Color(
|
||||
(uint8_t)(y * 255 / getHeight()),
|
||||
0x00,
|
||||
(uint8_t)(x * 255 / getWidth()),
|
||||
0xff));
|
||||
// size_t i = (size_t)y * getStride() + (size_t)x * 4;
|
||||
// pixels[i + 0] = (uint8_t)(y * 255 / getHeight()); // B
|
||||
// pixels[i + 1] = 0x00; // G
|
||||
// pixels[i + 2] = (uint8_t)(x * 255 / getWidth()); // R
|
||||
// pixels[i + 3] = 0xFF; // A
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Draw a single point
|
||||
void point (Point point, Color color) {
|
||||
point.draw(surface.buffer, color);
|
||||
}
|
||||
|
||||
void line (Line line, Color color) {
|
||||
line.draw(surface.buffer, color);
|
||||
return;
|
||||
}
|
||||
|
||||
void trapezoid (Trapezoid coords, Color color) {
|
||||
coords.draw(surface.buffer, color);
|
||||
return;
|
||||
}
|
||||
|
||||
// Draw a triangle
|
||||
void triangle (uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, Color color) {
|
||||
Triangle triangle = Triangle(x0, y0, x1, y1, x2, y2);
|
||||
triangle.draw(surface.buffer, color);
|
||||
return;
|
||||
}
|
||||
};
|
||||
}
|
||||
+9
-19
@@ -1,6 +1,6 @@
|
||||
// #pragma once
|
||||
|
||||
#include "waymini.h"
|
||||
#include "waymini/waymini.h"
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
@@ -9,14 +9,15 @@
|
||||
|
||||
#include "datatypes.cpp"
|
||||
#include "helpers.cpp"
|
||||
#include "triangle.cpp"
|
||||
#include "buffer.cpp"
|
||||
#include "surface.cpp"
|
||||
#include "trapezoid.cpp"
|
||||
#include "line.cpp"
|
||||
#include "rectangle.cpp"
|
||||
#include "point.cpp"
|
||||
#include "draw.cpp"
|
||||
#include "primatives/line.cpp"
|
||||
#include "primatives/point.cpp"
|
||||
#include "primatives/rectangle.cpp"
|
||||
#include "primatives/trapezoid.cpp"
|
||||
#include "primatives/triangle.cpp"
|
||||
// #include "draw.cpp"
|
||||
#include "shaders/shader.cpp"
|
||||
|
||||
static void onKey(void *user, uint32_t keycode, uint32_t state) {
|
||||
if (keycode == 1) {
|
||||
@@ -30,38 +31,27 @@ static void onKey(void *user, uint32_t keycode, uint32_t state) {
|
||||
|
||||
int main(void) {
|
||||
uint16_t w = 800, h = 480;
|
||||
UwU::Color fuchsia = UwU::Color(0xb00b6980);
|
||||
UwU::Shader fuchsia = UwU::Shader();
|
||||
UwU::Color red = UwU::Color(0xff000080);
|
||||
UwU::Color green = UwU::Color(0x00ff00ff);
|
||||
UwU::Color blue = UwU::Color(0x0000ff80);
|
||||
UwU::Color alpha = UwU::Color(0x00000000);
|
||||
printf("r: %u, g:%u, b:%u, a:%u\n", fuchsia.r, fuchsia.g, fuchsia.b, fuchsia.a);
|
||||
|
||||
// struct waymini *wm = waymini_create(w, h, on_key, NULL);
|
||||
// UwU::Draw draw = UwU::Draw(w, h, onKey);
|
||||
UwU::Surface surface = UwU::Surface(w, h, onKey);
|
||||
|
||||
// draw.rainbow();
|
||||
|
||||
// draw.rectangle(UwU::Coord2(69, 69), UwU::Coord2(420, 420), fuchsia);
|
||||
UwU::Rectangle rectangle = UwU::Rectangle(69, 69, 420, 420);
|
||||
rectangle.draw(surface.buffer, fuchsia);
|
||||
|
||||
// draw.rectangleGradient(UwU::Coord2(200, 200), UwU::Coord2(600, 400), red, blue, alpha, red);
|
||||
|
||||
// draw.trapezoid(UwU::Trapezoid(300, 400, 360, 380, 600, 480), red);
|
||||
UwU::Trapezoid trapezoid = UwU::Trapezoid(300, 400, 360, 380, 600, 480);
|
||||
trapezoid.draw(surface.buffer, red);
|
||||
|
||||
// draw.triangle(280, 100, 240, 290, 320, 300, blue);
|
||||
UwU::Triangle triangle = UwU::Triangle(280, 100, 240, 290, 320, 300);
|
||||
triangle.draw(surface.buffer, blue);
|
||||
|
||||
// myTrap = UwU:Trapezoid(300, 400, 360, 380, 600, 480);
|
||||
// myTrap.draw()
|
||||
|
||||
|
||||
// draw.point(UwU::Point(387, 43), green);
|
||||
UwU::Point point = UwU::Point(387, 43);
|
||||
point.draw(surface.buffer, green);
|
||||
|
||||
|
||||
Binary file not shown.
@@ -2,9 +2,9 @@
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "datatypes.cpp"
|
||||
#include "helpers.cpp"
|
||||
#include "buffer.cpp"
|
||||
#include "../datatypes.cpp"
|
||||
#include "../helpers.cpp"
|
||||
#include "../buffer.cpp"
|
||||
|
||||
namespace UwU {
|
||||
// line
|
||||
@@ -2,9 +2,9 @@
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "datatypes.cpp"
|
||||
#include "helpers.cpp"
|
||||
#include "buffer.cpp"
|
||||
#include "../datatypes.cpp"
|
||||
#include "../helpers.cpp"
|
||||
#include "../buffer.cpp"
|
||||
|
||||
namespace UwU {
|
||||
// point
|
||||
@@ -2,9 +2,10 @@
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "datatypes.cpp"
|
||||
#include "helpers.cpp"
|
||||
#include "buffer.cpp"
|
||||
#include "../datatypes.cpp"
|
||||
#include "../helpers.cpp"
|
||||
#include "../buffer.cpp"
|
||||
#include "../shaders/shader.cpp"
|
||||
|
||||
namespace UwU {
|
||||
// rectangle
|
||||
@@ -23,11 +24,11 @@ namespace UwU {
|
||||
uint16_t y1;
|
||||
|
||||
// Draw a rectangle
|
||||
void draw (Buffer buffer, Color color) {
|
||||
void draw (Buffer buffer, Shader shader) {
|
||||
if (x0 > buffer.width || y0 > buffer.height || x1 > buffer.width || y1 > buffer.height) {return;};
|
||||
for (uint16_t y = y0; y < y1; y++) {
|
||||
for (uint16_t x = x0; x < x1; x++) {
|
||||
buffer.drawPixel(Coord2(x, y), color);
|
||||
buffer.drawPixelShader(Coord2(x, y), shader);
|
||||
}
|
||||
}
|
||||
return;
|
||||
@@ -2,9 +2,9 @@
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "datatypes.cpp"
|
||||
#include "helpers.cpp"
|
||||
#include "buffer.cpp"
|
||||
#include "../datatypes.cpp"
|
||||
#include "../helpers.cpp"
|
||||
#include "../buffer.cpp"
|
||||
|
||||
namespace UwU {
|
||||
// trapezoid (horizontally constrained)
|
||||
@@ -2,9 +2,9 @@
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "datatypes.cpp"
|
||||
#include "helpers.cpp"
|
||||
#include "buffer.cpp"
|
||||
#include "../datatypes.cpp"
|
||||
#include "../helpers.cpp"
|
||||
#include "../buffer.cpp"
|
||||
|
||||
namespace UwU {
|
||||
class Triangle {
|
||||
@@ -0,0 +1,19 @@
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "../datatypes.cpp"
|
||||
#include "../helpers.cpp"
|
||||
#include "../buffer.cpp"
|
||||
|
||||
namespace UwU {
|
||||
// shader prototype
|
||||
class Shader {
|
||||
public:
|
||||
Shader() {}
|
||||
|
||||
Color color() {
|
||||
return Color(0xb00b69ff);
|
||||
}
|
||||
};
|
||||
}
|
||||
+2
-1
@@ -1,6 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include "waymini.h"
|
||||
#include "waymini/waymini.h"
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
@@ -12,6 +12,7 @@
|
||||
|
||||
namespace UwU {
|
||||
class Surface {
|
||||
// should probably be a child of buffer
|
||||
public:
|
||||
Surface(uint16_t width, uint16_t height, waymini_key_cb onKey) {
|
||||
this->wm = waymini_create((uint32_t)width, (uint32_t)height, onKey, NULL);
|
||||
|
||||
Reference in New Issue
Block a user