lets get this porting done
commit
fdd9f35323
|
@ -0,0 +1 @@
|
||||||
|
bin/
|
|
@ -0,0 +1,4 @@
|
||||||
|
all: editor
|
||||||
|
|
||||||
|
editor: src/*.odin
|
||||||
|
odin build src/ -out:bin/editor -lld
|
|
@ -0,0 +1,111 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"flake-utils": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1701680307,
|
||||||
|
"narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "4022d587cbbfd70fe950c1e2083a02621806a725",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-utils_2": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1659877975,
|
||||||
|
"narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixgl": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils_2",
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1685908677,
|
||||||
|
"narHash": "sha256-E4zUPEUFyVWjVm45zICaHRpfGepfkE9Z2OECV9HXfA4=",
|
||||||
|
"owner": "guibou",
|
||||||
|
"repo": "nixGL",
|
||||||
|
"rev": "489d6b095ab9d289fe11af0219a9ff00fe87c7c5",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "guibou",
|
||||||
|
"repo": "nixGL",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1660551188,
|
||||||
|
"narHash": "sha256-a1LARMMYQ8DPx1BgoI/UN4bXe12hhZkCNqdxNi6uS0g=",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "441dc5d512153039f19ef198e662e4f3dbb9fd65",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_2": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1703013332,
|
||||||
|
"narHash": "sha256-+tFNwMvlXLbJZXiMHqYq77z/RfmpfpiI3yjL6o/Zo9M=",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "54aac082a4d9bb5bbc5c4e899603abfb76a3f6d6",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nixos",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils",
|
||||||
|
"nixgl": "nixgl",
|
||||||
|
"nixpkgs": "nixpkgs_2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
|
@ -0,0 +1,74 @@
|
||||||
|
{
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||||
|
flake-utils.url = "github:numtide/flake-utils";
|
||||||
|
nixgl.url = "github:guibou/nixGL";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = { self, nixpkgs, flake-utils, nixgl, ... }:
|
||||||
|
flake-utils.lib.eachDefaultSystem (system:
|
||||||
|
let
|
||||||
|
overlays = [ nixgl.overlay ];
|
||||||
|
pkgs = import nixpkgs {
|
||||||
|
inherit system overlays;
|
||||||
|
};
|
||||||
|
fixed-odin = pkgs.odin.overrideAttrs (finalAttrs: prevAttr: rec {
|
||||||
|
src = /Users/temp/Documents/personal/Odin;
|
||||||
|
LLVM_CONFIG = "${pkgs.llvmPackages_17.llvm.dev}/bin/llvm-config";
|
||||||
|
nativeBuildInputs = with pkgs; prevAttr.nativeBuildInputs ++ [ libcxx libcxxabi ];
|
||||||
|
postPatch = prevAttr.postPatch + ''
|
||||||
|
sed -i build_odin.sh \
|
||||||
|
-e 's|CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags)"|CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags) -I ${pkgs.libiconv.outPath}/include/"|' \
|
||||||
|
-e 's|LDFLAGS="$LDFLAGS -pthread -lm -lstdc++"|LDFLAGS="$LDFLAGS -pthread -lm -lstdc++ -L ${pkgs.libiconv.outPath}/lib/ -L ${pkgs.llvmPackages_17.libcxxabi.outPath}/lib/"|'
|
||||||
|
'';
|
||||||
|
installPhase = ''
|
||||||
|
runHook preInstall
|
||||||
|
|
||||||
|
mkdir -p $out/bin
|
||||||
|
cp odin $out/bin/odin
|
||||||
|
|
||||||
|
mkdir -p $out/share
|
||||||
|
cp -r core $out/share/core
|
||||||
|
cp -r vendor $out/share/vendor
|
||||||
|
|
||||||
|
wrapProgram $out/bin/odin \
|
||||||
|
--set PATH ${pkgs.lib.makeBinPath (with pkgs; [
|
||||||
|
coreutils
|
||||||
|
llvmPackages_17.bintools
|
||||||
|
llvmPackages_17.lld
|
||||||
|
llvmPackages_17.clang
|
||||||
|
])} \
|
||||||
|
--set-default ODIN_ROOT $out/share
|
||||||
|
|
||||||
|
runHook postInstall
|
||||||
|
'';
|
||||||
|
});
|
||||||
|
in
|
||||||
|
{
|
||||||
|
devShell = pkgs.mkShell {
|
||||||
|
buildInputs = with pkgs; (if pkgs.system == "aarch64-darwin" || pkgs.system == "x86_64-darwin" then [
|
||||||
|
fixed-odin
|
||||||
|
darwin.apple_sdk.frameworks.CoreData
|
||||||
|
darwin.apple_sdk.frameworks.Kernel
|
||||||
|
darwin.apple_sdk.frameworks.CoreVideo
|
||||||
|
darwin.apple_sdk.frameworks.GLUT
|
||||||
|
darwin.apple_sdk.frameworks.IOKit
|
||||||
|
darwin.apple_sdk.frameworks.OpenGL
|
||||||
|
darwin.apple_sdk.frameworks.Cocoa
|
||||||
|
] else if pkgs.system == "x86_64-linux" then [
|
||||||
|
pkg-config
|
||||||
|
binutils
|
||||||
|
odin
|
||||||
|
libGL
|
||||||
|
xorg.libX11
|
||||||
|
xorg.libXi
|
||||||
|
xorg.xinput
|
||||||
|
xorg.libXcursor
|
||||||
|
xorg.libXrandr
|
||||||
|
xorg.libXinerama
|
||||||
|
pkgs.nixgl.nixGLIntel
|
||||||
|
] else throw "unsupported system" );
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,183 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "core:fmt"
|
||||||
|
import "core:mem"
|
||||||
|
import "vendor:raylib"
|
||||||
|
|
||||||
|
source_font_width :: 8;
|
||||||
|
source_font_height :: 16;
|
||||||
|
line_number_padding :: 4 * source_font_width;
|
||||||
|
|
||||||
|
ContentType :: enum {
|
||||||
|
Original,
|
||||||
|
Added,
|
||||||
|
}
|
||||||
|
|
||||||
|
ContentSlice :: struct {
|
||||||
|
type: ContentType,
|
||||||
|
slice: []u8,
|
||||||
|
}
|
||||||
|
|
||||||
|
FileBufferIndex :: struct {
|
||||||
|
slice_index: int,
|
||||||
|
content_index: int,
|
||||||
|
}
|
||||||
|
|
||||||
|
Cursor :: struct {
|
||||||
|
col: int,
|
||||||
|
line: int,
|
||||||
|
buffer_index: FileBufferIndex,
|
||||||
|
}
|
||||||
|
|
||||||
|
Glyph :: struct #packed {
|
||||||
|
codepoint: u8,
|
||||||
|
color: u16,
|
||||||
|
}
|
||||||
|
|
||||||
|
FileBuffer :: struct {
|
||||||
|
allocator: mem.Allocator,
|
||||||
|
|
||||||
|
file_path: string,
|
||||||
|
top_line: int,
|
||||||
|
cursor: Cursor,
|
||||||
|
|
||||||
|
original_content: [dynamic]u8,
|
||||||
|
added_content: [dynamic]u8,
|
||||||
|
content_slices: [dynamic]ContentSlice,
|
||||||
|
|
||||||
|
glyph_buffer_width: int,
|
||||||
|
glyph_buffer_height: int,
|
||||||
|
glyph_buffer: [dynamic]Glyph,
|
||||||
|
|
||||||
|
input_buffer: [dynamic]u8,
|
||||||
|
}
|
||||||
|
|
||||||
|
FileBufferIter :: struct {
|
||||||
|
index: FileBufferIndex,
|
||||||
|
buffer: ^FileBuffer,
|
||||||
|
}
|
||||||
|
|
||||||
|
new_file_buffer_iter :: proc(file_buffer: ^FileBuffer) -> FileBufferIter {
|
||||||
|
return FileBufferIter { buffer = file_buffer };
|
||||||
|
}
|
||||||
|
iterate_file_buffer :: proc(it: ^FileBufferIter) -> (character: u8, idx: FileBufferIndex, cond: bool) {
|
||||||
|
if it.index.slice_index >= len(it.buffer.content_slices) || it.index.content_index >= len(it.buffer.content_slices[it.index.slice_index].slice) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
cond = true;
|
||||||
|
|
||||||
|
character = it.buffer.content_slices[it.index.slice_index].slice[it.index.content_index];
|
||||||
|
|
||||||
|
it.index.content_index += 1;
|
||||||
|
if it.index.content_index >= len(it.buffer.content_slices[it.index.slice_index].slice) {
|
||||||
|
it.index.content_index = 0;
|
||||||
|
it.index.slice_index += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
new_file_buffer :: proc(allocator: mem.Allocator, file_path: string) -> FileBuffer {
|
||||||
|
context.allocator = allocator;
|
||||||
|
|
||||||
|
width := 80;
|
||||||
|
height := 24;
|
||||||
|
|
||||||
|
test_str := "This is a test string\nfor a file buffer\nThis is line 3\nThis is line 4\n\n\nThis is line 7 (with some gaps between 4)";
|
||||||
|
|
||||||
|
buffer := FileBuffer {
|
||||||
|
allocator = allocator,
|
||||||
|
file_path = file_path,
|
||||||
|
|
||||||
|
original_content = make([dynamic]u8, 0, len(test_str)),
|
||||||
|
added_content = make([dynamic]u8, 0, 1024*1024),
|
||||||
|
content_slices = make([dynamic]ContentSlice, 0, 1024*1024),
|
||||||
|
|
||||||
|
glyph_buffer_width = width,
|
||||||
|
glyph_buffer_height = height,
|
||||||
|
glyph_buffer = make([dynamic]Glyph, width*height, width*height),
|
||||||
|
|
||||||
|
input_buffer = make([dynamic]u8, 0, 1024),
|
||||||
|
};
|
||||||
|
|
||||||
|
append(&buffer.original_content, test_str);
|
||||||
|
append(&buffer.content_slices, ContentSlice { type = .Original, slice = buffer.original_content[:] });
|
||||||
|
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
update_glyph_buffer :: proc(buffer: ^FileBuffer) {
|
||||||
|
//mem.set(&buffer.glyph_buffer, 0, size_of(Glyph)*buffer.glyph_buffer_width*buffer.glyph_buffer_height);
|
||||||
|
|
||||||
|
begin := buffer.top_line;
|
||||||
|
rendered_col: int;
|
||||||
|
rendered_line: int;
|
||||||
|
|
||||||
|
it := new_file_buffer_iter(buffer);
|
||||||
|
for character in iterate_file_buffer(&it) {
|
||||||
|
if character == '\r' { continue; }
|
||||||
|
|
||||||
|
line := rendered_line - begin;
|
||||||
|
if rendered_line >= begin && line >= buffer.glyph_buffer_height { break; }
|
||||||
|
|
||||||
|
if character == '\n' {
|
||||||
|
rendered_col = 0;
|
||||||
|
rendered_line += 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if rendered_line >= begin && rendered_col < buffer.glyph_buffer_width {
|
||||||
|
buffer.glyph_buffer[rendered_col + line * buffer.glyph_buffer_width] = Glyph { codepoint = character, color = 0 };
|
||||||
|
}
|
||||||
|
|
||||||
|
rendered_col += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
draw_file_buffer :: proc(buffer: ^FileBuffer, x: int, y: int, font: raylib.Font) {
|
||||||
|
update_glyph_buffer(buffer);
|
||||||
|
|
||||||
|
begin := buffer.top_line;
|
||||||
|
cursor_x := x + line_number_padding + buffer.cursor.col * source_font_width;
|
||||||
|
cursor_y := y + buffer.cursor.line * source_font_height;
|
||||||
|
|
||||||
|
for j in 0..<buffer.glyph_buffer_height {
|
||||||
|
text_y := y + source_font_height * j;
|
||||||
|
|
||||||
|
// Line Numbers
|
||||||
|
raylib.DrawTextEx(font, raylib.TextFormat("%d", begin + j + 1), raylib.Vector2 { f32(x), f32(text_y) }, source_font_height, 0, raylib.DARKGRAY);
|
||||||
|
|
||||||
|
for i in 0..<buffer.glyph_buffer_width {
|
||||||
|
text_x := x + line_number_padding + i * source_font_width;
|
||||||
|
glyph := buffer.glyph_buffer[i + j * buffer.glyph_buffer_width];
|
||||||
|
|
||||||
|
if glyph.codepoint == 0 { break; }
|
||||||
|
|
||||||
|
raylib.DrawTextCodepoint(font, rune(glyph.codepoint), raylib.Vector2 { f32(text_x), f32(text_y) }, source_font_height, raylib.LIGHTGRAY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main :: proc() {
|
||||||
|
raylib.InitWindow(640, 480, "odin_editor - [back to basics]");
|
||||||
|
raylib.SetWindowState({ .WINDOW_RESIZABLE, .VSYNC_HINT });
|
||||||
|
raylib.SetTargetFPS(60);
|
||||||
|
raylib.SetExitKey(.KEY_NULL);
|
||||||
|
|
||||||
|
font := raylib.LoadFont("../c_editor/Mx437_ToshibaSat_8x16.ttf");
|
||||||
|
|
||||||
|
fmt.println("Hello");
|
||||||
|
buffer := new_file_buffer(context.allocator, "./main.odin");
|
||||||
|
update_glyph_buffer(&buffer);
|
||||||
|
|
||||||
|
for !raylib.WindowShouldClose() {
|
||||||
|
{
|
||||||
|
raylib.BeginDrawing();
|
||||||
|
defer raylib.EndDrawing();
|
||||||
|
|
||||||
|
raylib.ClearBackground(raylib.GetColor(0x232136ff));
|
||||||
|
|
||||||
|
draw_file_buffer(&buffer, 0, 0, font);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue