Skip to content

Commit

Permalink
test mms ogl
Browse files Browse the repository at this point in the history
  • Loading branch information
Hugothms committed Jun 12, 2020
1 parent 05b7a7f commit ba90dfc
Show file tree
Hide file tree
Showing 35 changed files with 13,985 additions and 0 deletions.
34 changes: 34 additions & 0 deletions mms/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@



MODULE_SRC= mlx_image.swift mlx_window.swift mlx_init.swift
MODULE_OBJ=$(MODULE_SRC:.swift=.swiftmodule)

SRC= interface.swift $(MODULE_SRC)
OBJ=$(SRC:.swift=.o)

C_SRC= mlx_xpm.c mlx_png.c mlx_string_put.c
C_OBJ=$(C_SRC:.c=.o)
CFLAGS=-O3

NAME=libmlx.dylib

INC=-I.
#OPTI=-Ounchecked

all: $(NAME)

$(NAME): $(MODULE_OBJ) $(OBJ) $(C_OBJ)
swiftc $(OPTI) $(INC) -o $(NAME) -emit-library $(OBJ) $(C_OBJ) -lz



%.o: %.swift
swiftc $(OPTI) $(INC) -parse-as-library -c $< -o $@

%.swiftmodule: %.swift
swiftc $(OPTI) $(INC) -parse-as-library -c $< -o $@ -emit-module -module-name $(patsubst %.swift,%,$<) -module-link-name $(patsubst %.swift,%,$<)

clean:
rm -f $(NAME) $(OBJ) $(MODULE_OBJ) $(C_OBJ) *.swiftdoc *~

3,526 changes: 3,526 additions & 0 deletions mms/font.c

Large diffs are not rendered by default.

292 changes: 292 additions & 0 deletions mms/interface.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,292 @@

import Cocoa

import mlx_window
import mlx_image
import mlx_init



func _mlx_bridge<T : AnyObject>(obj : T) -> UnsafeRawPointer {
return UnsafeRawPointer(Unmanaged.passUnretained(obj).toOpaque())
}

func _mlx_bridge_retained<T : AnyObject>(obj : T) -> UnsafeRawPointer {
return UnsafeRawPointer(Unmanaged.passRetained(obj).toOpaque())
}

func _mlx_bridge<T : AnyObject>(ptr : UnsafeRawPointer) -> T {
return Unmanaged<T>.fromOpaque(ptr).takeUnretainedValue()
}

func _mlx_bridge_transfer<T : AnyObject>(ptr : UnsafeRawPointer) -> T {
return Unmanaged<T>.fromOpaque(ptr).takeRetainedValue()
}


let MLX_SYNC_IMAGE_WRITABLE = Int32(1)
let MLX_SYNC_WIN_FLUSH_CMD = Int32(2)
let MLX_SYNC_WIN_CMD_COMPLETED = Int32(3)



/// C decl


@_cdecl("mlx_init")
public func mlx_init_swift() -> UnsafeRawPointer
{
let mm = MlxMain()
return (_mlx_bridge_retained(obj:mm))
}


@_cdecl("mlx_loop")
public func mlx_loop_swift(_ mlxptr:UnsafeRawPointer)
{
let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
mlx.inLoop = true
NSApp.run()
}


@_cdecl("mlx_new_window")
public func mlx_new_window_swift(_ mlxptr:UnsafeRawPointer, Width w:UInt32, Height h:UInt32, Title t:UnsafePointer<CChar>) -> UnsafeRawPointer
{
let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
let mw = MlxWin(device: mlx.device, width: Int(w), height: Int(h), title: String(cString: t))
mw.setNotifs()
mw.initMetal()
mlx.addWinToList(mw)
return (_mlx_bridge_retained(obj:mw))
}



@_cdecl("mlx_key_hook")
public func mlx_key_hook_swift(_ winptr:UnsafeRawPointer, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32
{
let win:MlxWin = _mlx_bridge(ptr:winptr)
win.addHook(index: 3, fct: fctptr, param: paramptr)
return (Int32(0));
}


@_cdecl("mlx_mouse_hook")
public func mlx_mouse_hook_swift(_ winptr:UnsafeRawPointer, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32
{
let win:MlxWin = _mlx_bridge(ptr:winptr)
win.addHook(index: 4, fct: fctptr, param: paramptr)
return (Int32(0));
}


@_cdecl("mlx_hook")
public func mlx_hook_swift(_ winptr:UnsafeRawPointer, _ xevent:Int32, _ xmask:Int32, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32
{
let win:MlxWin = _mlx_bridge(ptr:winptr)
win.addHook(index: Int(xevent), fct: fctptr, param: paramptr)
return (Int32(0));
}


@_cdecl("mlx_expose_hook")
public func mlx_expose_hook_swift(_ winptr:UnsafeRawPointer, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32
{
let win:MlxWin = _mlx_bridge(ptr:winptr)
win.addHook(index: 12, fct: fctptr, param: paramptr)
return (Int32(0));
}

@_cdecl("mlx_loop_hook")
public func mlx_loop_hook_swift(_ mlxptr:UnsafeRawPointer, _ fctptr:UnsafeMutableRawPointer, _ paramptr:UnsafeMutableRawPointer) -> Int32
{
let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
mlx.addLoopHook(fctptr, paramptr)
return (Int32(0));
}


@_cdecl("mlx_do_key_autorepeatoff")
public func mlx_do_key_autorepeatoff_swift(_ mlxptr:UnsafeRawPointer)
{
let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
mlx.winList.forEach{ $0.setKeyRepeat(0) }
}


@_cdecl("mlx_do_key_autorepeaton")
public func mlx_do_key_autorepeatoon_swift(_ mlxptr:UnsafeRawPointer)
{
let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
mlx.winList.forEach{ $0.setKeyRepeat(1) }
}


@_cdecl("mlx_clear_window")
public func mlx_clear_window_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer)
{
let win:MlxWin = _mlx_bridge(ptr:winptr)
win.clearWin()
}


@_cdecl("mlx_pixel_put")
public func mlx_pixel_put_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer, _ x:Int32, _ y:Int32, _ color:UInt32)
{
let win:MlxWin = _mlx_bridge(ptr:winptr)
win.pixelPut(x, y, color)
}


@_cdecl("mlx_get_color_value")
public func mlx_get_color_value(_ mlxptr:UnsafeRawPointer, _ color:UInt32) -> UInt32
{
return color
}


@_cdecl("mlx_new_image")
public func mlx_new_image(_ mlxptr:UnsafeRawPointer, _ width:Int32, _ height:Int32) -> UnsafeRawPointer
{
let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
let img = MlxImg(d:mlx.device, w:Int(width), h:Int(height))
mlx.addImgToList(img)
/// print(CFGetRetainCount(img))
return (_mlx_bridge_retained(obj:img))

}

@_cdecl("mlx_get_data_addr")
public func mlx_get_data_addr_swift(_ imgptr:UnsafeRawPointer, _ bpp:UnsafeMutablePointer<Int32>, _ sizeline:UnsafeMutablePointer<Int32>, _ endian:UnsafeMutablePointer<Int32>) -> UnsafeMutablePointer<UInt32>
{
let img:MlxImg = _mlx_bridge(ptr:imgptr)
bpp.pointee = 32
sizeline.pointee = Int32(img.texture_sizeline)
endian.pointee = Int32(0)
return img.texture_data
}

@_cdecl("mlx_put_image_to_window")
public func mlx_put_image_to_window_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer, _ imgptr:UnsafeRawPointer, _ x:Int32, _ y:Int32) -> Int32
{
let win:MlxWin = _mlx_bridge(ptr:winptr)
let img:MlxImg = _mlx_bridge(ptr:imgptr)
win.putImage(image:img, x:x, y:y)
return Int32(0)
}

@_cdecl("mlx_put_image_to_window_scale")
public func mlx_put_image_to_window_scale_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer, _ imgptr:UnsafeRawPointer, _ sx:Int32, _ sy:Int32, _ sw:Int32, _ sh:Int32, _ dx:Int32, _ dy:Int32, _ dw:Int32, _ dh:Int32, _ color:UInt32) -> Int32
{
let win:MlxWin = _mlx_bridge(ptr:winptr)
let img:MlxImg = _mlx_bridge(ptr:imgptr)
win.putImageScale(image:img, sx:sx, sy:sy, sw:sw, sh:sh, dx:dx, dy:dy, dw:dw, dh:dh, c:color)
return Int32(0)
}

@_cdecl("mlx_do_sync")
public func mlx_do_sync_swift(_ mlxptr:UnsafeRawPointer) -> Int32
{
let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
mlx.winList.forEach { $0.flushImages() }
mlx.winList.forEach { $0.waitForGPU() }
return Int32(0)
}

@_cdecl("mlx_sync")
public func mlx_sync_swift(_ what:Int32, _ param:UnsafeRawPointer) -> Int32
{
switch what
{
case MLX_SYNC_IMAGE_WRITABLE:
let img:MlxImg = _mlx_bridge(ptr:param); while img.onGPU > 0 {}
case MLX_SYNC_WIN_FLUSH_CMD:
let win:MlxWin = _mlx_bridge(ptr:param); win.flushImages()
case MLX_SYNC_WIN_CMD_COMPLETED:
let win:MlxWin = _mlx_bridge(ptr:param); win.flushImages(); win.waitForGPU()
default:
break
}
return Int32(0)
}

@_cdecl("mlx_destroy_window")
public func mlx_destroy_window_swift(_ mlxptr:UnsafeRawPointer, _ winptr:UnsafeRawPointer) -> Int32
{
let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
/// bridge_transfer to get the retain, at end of this func should release the MlxWin object, because no ref anymore.
let win:MlxWin = _mlx_bridge_transfer(ptr:winptr)
win.delNotifs()
win.flushImages()
win.waitForGPU()
win.destroyWinE()
mlx.winList.removeAll(where: { $0 === win} )
return Int32(0)
}

@_cdecl("mlx_destroy_image")
public func mlx_destroy_image_swift(_ mlxptr:UnsafeRawPointer, _ imgptr:UnsafeRawPointer) -> Int32
{
let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
/// bridge_transfer to get the retain, at end of this func should release the MlxImg object, because no ref anymore.
let img:MlxImg = _mlx_bridge_transfer(ptr:imgptr)
mlx.winList.forEach { $0.flushImages() }
while img.onGPU > 0 {}
mlx.imgList.removeAll(where: { $0 === img} )
return Int32(0)
}


@_cdecl("mlx_get_screen_size")
public func mlx_get_screen_size_swift(_ mlxptr:UnsafeRawPointer, _ sizex:UnsafeMutablePointer<Int32>, _ sizey:UnsafeMutablePointer<Int32>) -> Int32
{
/// let mlx:MlxMain = _mlx_bridge(ptr:mlxptr)
sizex.pointee = Int32(NSScreen.main!.frame.size.width)
sizey.pointee = Int32(NSScreen.main!.frame.size.height)
return Int32(0)
}


@_cdecl("mlx_mouse_hide")
public func mlx_mouse_hide_swift() -> Int32
{
NSCursor.hide()
return Int32(0)
}

@_cdecl("mlx_mouse_show")
public func mlx_mouse_show_swift() -> Int32
{
NSCursor.unhide()
return Int32(0)
}


@_cdecl("mlx_mouse_move")
public func mlx_mouse_move_swift(_ winptr:UnsafeRawPointer, _ x:Int32, _ y:Int32) -> Int32
{
let win:MlxWin = _mlx_bridge(ptr:winptr)
let frame = win.getWinEFrame()
/// let sframe = win.getScreenFrame()
var pt = CGPoint()
pt.x = frame.origin.x + CGFloat(x)
/// pt.y = sframe.size.y - frame.size.y - frame.origin.y + 1 + y
pt.y = frame.origin.y + frame.size.height - 1.0 - CGFloat(y)
CGWarpMouseCursorPosition(pt)
CGAssociateMouseAndMouseCursorPosition(UInt32(1))
return Int32(0);
}



@_cdecl("mlx_mouse_get_pos")
public func mlx_mouse_get_pos_swift(_ winptr:UnsafeRawPointer, _ x:UnsafeMutablePointer<Int32>, _ y:UnsafeMutablePointer<Int32>) -> Int32
{
let win:MlxWin = _mlx_bridge(ptr:winptr)
let frame = win.getWinEFrame()
let point = win.getMouseLoc()
x.pointee = Int32(point.x)
y.pointee = Int32(frame.size.height - 1.0 - point.y)
return Int32(0)
}
Loading

0 comments on commit ba90dfc

Please sign in to comment.