macOS tweaks / CI builds
This commit is contained in:
parent
a52d095e45
commit
79c54b09c3
|
@ -1,7 +1,5 @@
|
||||||
version: "0.1.0.{build}-{branch}"
|
version: "0.1.0.{build}-{branch}"
|
||||||
|
|
||||||
os: Visual Studio 2019
|
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
global:
|
global:
|
||||||
PROJECT_NAME: doukutsu-rs
|
PROJECT_NAME: doukutsu-rs
|
||||||
|
@ -10,37 +8,78 @@ environment:
|
||||||
target: x86_64-pc-windows-msvc
|
target: x86_64-pc-windows-msvc
|
||||||
target_name: win64
|
target_name: win64
|
||||||
job_name: windows-x64
|
job_name: windows-x64
|
||||||
|
appveyor_build_worker_image: Visual Studio 2019
|
||||||
# - channel: stable
|
# - channel: stable
|
||||||
# target: i686-pc-windows-msvc
|
# target: i686-pc-windows-msvc
|
||||||
# target_name: win32
|
# target_name: win32
|
||||||
# job_name: windows-x32
|
# job_name: windows-x32
|
||||||
|
- channel: stable
|
||||||
|
target: x86_64-pc-windows-msvc
|
||||||
|
target_name: macos
|
||||||
|
job_name: mac-x64
|
||||||
|
appveyor_build_worker_image: macos
|
||||||
|
|
||||||
install:
|
matrix:
|
||||||
- appveyor DownloadFile https://win.rustup.rs/ -FileName rustup-init.exe
|
fast_finish: true
|
||||||
- rustup-init -yv --default-toolchain %channel% --default-host %target%
|
|
||||||
- set PATH=%PATH%;%USERPROFILE%\.cargo\bin
|
|
||||||
- rustup update
|
|
||||||
- rustup default %channel%
|
|
||||||
- rustc -vV
|
|
||||||
- cargo -vV
|
|
||||||
|
|
||||||
cache:
|
for:
|
||||||
- '%USERPROFILE%\.cache\sccache -> Cargo.toml'
|
-
|
||||||
- '%USERPROFILE%\.cargo -> Cargo.toml'
|
matrix:
|
||||||
- 'target -> Cargo.toml'
|
only:
|
||||||
|
- appveyor_build_worker_image: Visual Studio 2019
|
||||||
|
|
||||||
#test_script:
|
install:
|
||||||
# - cargo build --verbose --all
|
- appveyor DownloadFile https://win.rustup.rs/ -FileName rustup-init.exe
|
||||||
# - cargo test --verbose --all --no-fail-fast
|
- rustup-init -yv --default-toolchain %channel% --default-host %target%
|
||||||
|
- set PATH=%PATH%;%USERPROFILE%\.cargo\bin
|
||||||
|
- rustup update
|
||||||
|
- rustup default %channel%
|
||||||
|
- rustc -vV
|
||||||
|
- cargo -vV
|
||||||
|
|
||||||
build_script:
|
cache:
|
||||||
- set DRS_BUILD_VERSION_OVERRIDE=%APPVEYOR_BUILD_VERSION%
|
- '%USERPROFILE%\.cache\sccache -> Cargo.toml'
|
||||||
- cargo build --release --bin doukutsu-rs
|
- '%USERPROFILE%\.cargo -> Cargo.toml'
|
||||||
- mkdir release
|
- 'target -> Cargo.toml'
|
||||||
- copy target\release\doukutsu-rs.exe release
|
|
||||||
- cd release
|
build_script:
|
||||||
- appveyor DownloadFile https://github.com/doukutsu-rs/game-data/archive/master.zip -FileName ../game-data.zip
|
- set DRS_BUILD_VERSION_OVERRIDE=%APPVEYOR_BUILD_VERSION%
|
||||||
- 7z x ../game-data.zip
|
- cargo build --release --bin doukutsu-rs
|
||||||
- rename game-data-master data
|
- mkdir release
|
||||||
- 7z a ../doukutsu-rs_%target_name%.zip *
|
- copy target\release\doukutsu-rs.exe release
|
||||||
- appveyor PushArtifact ../doukutsu-rs_%target_name%.zip
|
- cd release
|
||||||
|
- appveyor DownloadFile https://github.com/doukutsu-rs/game-data/archive/master.zip -FileName ../game-data.zip
|
||||||
|
- 7z x ../game-data.zip
|
||||||
|
- rename game-data-master data
|
||||||
|
- 7z a ../doukutsu-rs_%target_name%.zip *
|
||||||
|
- appveyor PushArtifact ../doukutsu-rs_%target_name%.zip
|
||||||
|
|
||||||
|
-
|
||||||
|
matrix:
|
||||||
|
only:
|
||||||
|
- appveyor_build_worker_image: macos
|
||||||
|
|
||||||
|
install:
|
||||||
|
- curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
|
||||||
|
- export PATH=$PATH:$HOME/.cargo/bin
|
||||||
|
- rustup update
|
||||||
|
- rustup default $channel
|
||||||
|
- rustc -vV
|
||||||
|
- cargo -vV
|
||||||
|
|
||||||
|
cache:
|
||||||
|
- '$HOME/.cache/sccache -> Cargo.toml'
|
||||||
|
- '$HOME/.cargo -> Cargo.toml'
|
||||||
|
- 'target -> Cargo.toml'
|
||||||
|
|
||||||
|
build_script:
|
||||||
|
- export DRS_BUILD_VERSION_OVERRIDE=$APPVEYOR_BUILD_VERSION
|
||||||
|
- appveyor DownloadFile https://github.com/doukutsu-rs/game-data/archive/master.zip -FileName ../game-data.zip
|
||||||
|
- 7z x ../game-data.zip
|
||||||
|
- rename game-data-master data
|
||||||
|
- cargo bundle --release
|
||||||
|
- mkdir release
|
||||||
|
- cp -a target/release/bundle/osx/doukutsu-rs.app ./release/doukutsu-rs.app
|
||||||
|
- cd release
|
||||||
|
- 7z a ../doukutsu-rs_$target_name.zip *
|
||||||
|
- appveyor PushArtifact ../doukutsu-rs_$target_name.zip
|
||||||
|
|
|
@ -15,4 +15,48 @@ Cargo.lock
|
||||||
|
|
||||||
# These are backup files generated by rustfmt
|
# These are backup files generated by rustfmt
|
||||||
**/*.rs.bk
|
**/*.rs.bk
|
||||||
|
|
||||||
|
# cave story saves
|
||||||
Profile.dat*
|
Profile.dat*
|
||||||
|
|
||||||
|
# General
|
||||||
|
.DS_Store
|
||||||
|
.AppleDouble
|
||||||
|
.LSOverride
|
||||||
|
|
||||||
|
# Icon must end with two \r
|
||||||
|
Icon
|
||||||
|
|
||||||
|
# Thumbnails
|
||||||
|
._*
|
||||||
|
|
||||||
|
# Files that might appear in the root of a volume
|
||||||
|
.DocumentRevisions-V100
|
||||||
|
.fseventsd
|
||||||
|
.Spotlight-V100
|
||||||
|
.TemporaryItems
|
||||||
|
.Trashes
|
||||||
|
.VolumeIcon.icns
|
||||||
|
.com.apple.timemachine.donotpresent
|
||||||
|
|
||||||
|
# Directories potentially created on remote AFP share
|
||||||
|
.AppleDB
|
||||||
|
.AppleDesktop
|
||||||
|
Network Trash Folder
|
||||||
|
Temporary Items
|
||||||
|
.apdisk
|
||||||
|
|
||||||
|
# Windows thumbnail cache files
|
||||||
|
Thumbs.db
|
||||||
|
Thumbs.db:encryptable
|
||||||
|
ehthumbs.db
|
||||||
|
ehthumbs_vista.db
|
||||||
|
|
||||||
|
# Dump file
|
||||||
|
*.stackdump
|
||||||
|
|
||||||
|
# Folder config file
|
||||||
|
[Dd]esktop.ini
|
||||||
|
|
||||||
|
# Recycle Bin used on file shares
|
||||||
|
$RECYCLE.BIN/
|
||||||
|
|
17
Cargo.toml
17
Cargo.toml
|
@ -1,8 +1,9 @@
|
||||||
[package]
|
[package]
|
||||||
|
name = "doukutsu-rs"
|
||||||
|
description = "A re-implementation of Cave Story (Doukutsu Monogatari) engine"
|
||||||
|
version = "0.1.0"
|
||||||
authors = ["Alula"]
|
authors = ["Alula"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
name = "doukutsu-rs"
|
|
||||||
version = "0.1.0"
|
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
#crate-type = ["lib", "cdylib"]
|
#crate-type = ["lib", "cdylib"]
|
||||||
|
@ -22,6 +23,15 @@ panic = 'abort'
|
||||||
[profile.dev.package."*"]
|
[profile.dev.package."*"]
|
||||||
opt-level = 3
|
opt-level = 3
|
||||||
|
|
||||||
|
[package.metadata.bundle]
|
||||||
|
name = "doukutsu-rs"
|
||||||
|
identifier = "io.github.doukutsu_rs"
|
||||||
|
version = "0.1.0"
|
||||||
|
resources = ["data"]
|
||||||
|
copyright = "Copyright (c) 2020-2021 Alula and contributors"
|
||||||
|
category = "Game"
|
||||||
|
osx_minimum_system_version = "10.12"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["scripting", "backend-sdl", "render-opengl", "ogg-playback", "exe"]
|
default = ["scripting", "backend-sdl", "render-opengl", "ogg-playback", "exe"]
|
||||||
ogg-playback = ["lewton"]
|
ogg-playback = ["lewton"]
|
||||||
|
@ -79,6 +89,9 @@ winit = { git = "https://github.com/alula/winit.git", rev = "6acf76ff192dd8270aa
|
||||||
[target.'cfg(target_os = "windows")'.dependencies]
|
[target.'cfg(target_os = "windows")'.dependencies]
|
||||||
winapi = { version = "0.3", features = ["winuser"] }
|
winapi = { version = "0.3", features = ["winuser"] }
|
||||||
|
|
||||||
|
[target.'cfg(target_os = "macos")'.dependencies]
|
||||||
|
objc = "0.2.7"
|
||||||
|
|
||||||
[target.'cfg(target_os = "android")'.dependencies]
|
[target.'cfg(target_os = "android")'.dependencies]
|
||||||
ndk = "0.3"
|
ndk = "0.3"
|
||||||
ndk-glue = "0.3"
|
ndk-glue = "0.3"
|
||||||
|
|
4
build.rs
4
build.rs
|
@ -19,6 +19,10 @@ fn main() {
|
||||||
// .unwrap();
|
// .unwrap();
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
if target.contains("macos") {
|
||||||
|
println!("cargo:rustc-env=MACOSX_DEPLOYMENT_TARGET=10.12")
|
||||||
|
}
|
||||||
|
|
||||||
if is_android {
|
if is_android {
|
||||||
println!("cargo:rustc-link-lib=dylib=GLESv2");
|
println!("cargo:rustc-link-lib=dylib=GLESv2");
|
||||||
println!("cargo:rustc-link-lib=dylib=EGL");
|
println!("cargo:rustc-link-lib=dylib=EGL");
|
||||||
|
|
|
@ -13,6 +13,7 @@ use sdl2::mouse::{Cursor, SystemCursor};
|
||||||
use sdl2::pixels::PixelFormatEnum;
|
use sdl2::pixels::PixelFormatEnum;
|
||||||
use sdl2::render::{Texture, TextureCreator, WindowCanvas};
|
use sdl2::render::{Texture, TextureCreator, WindowCanvas};
|
||||||
use sdl2::video::WindowContext;
|
use sdl2::video::WindowContext;
|
||||||
|
use sdl2::video::GLProfile;
|
||||||
use sdl2::{keyboard, pixels, EventPump, Sdl, VideoSubsystem};
|
use sdl2::{keyboard, pixels, EventPump, Sdl, VideoSubsystem};
|
||||||
|
|
||||||
use crate::common::{Color, Rect};
|
use crate::common::{Color, Rect};
|
||||||
|
@ -66,6 +67,11 @@ impl SDL2EventLoop {
|
||||||
pub fn new(sdl: &Sdl) -> GameResult<Box<dyn BackendEventLoop>> {
|
pub fn new(sdl: &Sdl) -> GameResult<Box<dyn BackendEventLoop>> {
|
||||||
let event_pump = sdl.event_pump().map_err(|e| GameError::WindowError(e))?;
|
let event_pump = sdl.event_pump().map_err(|e| GameError::WindowError(e))?;
|
||||||
let video = sdl.video().map_err(|e| GameError::WindowError(e))?;
|
let video = sdl.video().map_err(|e| GameError::WindowError(e))?;
|
||||||
|
let gl_attr = video.gl_attr();
|
||||||
|
|
||||||
|
gl_attr.set_context_profile(GLProfile::Core);
|
||||||
|
gl_attr.set_context_version(3, 0);
|
||||||
|
|
||||||
let mut window = video.window("Cave Story (doukutsu-rs)", 640, 480);
|
let mut window = video.window("Cave Story (doukutsu-rs)", 640, 480);
|
||||||
window.position_centered();
|
window.position_centered();
|
||||||
window.resizable();
|
window.resizable();
|
||||||
|
@ -121,6 +127,29 @@ impl BackendEventLoop for SDL2EventLoop {
|
||||||
}
|
}
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
|
|
||||||
|
#[cfg(target_os = "macos")]
|
||||||
|
unsafe {
|
||||||
|
use objc::*;
|
||||||
|
let mut winfo: sdl2_sys::SDL_SysWMinfo = mem::MaybeUninit::uninit().assume_init();
|
||||||
|
winfo.version.major = sdl2_sys::SDL_MAJOR_VERSION as _;
|
||||||
|
winfo.version.minor = sdl2_sys::SDL_MINOR_VERSION as _;
|
||||||
|
winfo.version.patch = sdl2_sys::SDL_PATCHLEVEL as _;
|
||||||
|
|
||||||
|
let mut whandle = self.refs.borrow().canvas.window().raw();
|
||||||
|
|
||||||
|
if sdl2_sys::SDL_GetWindowWMInfo(whandle, &mut winfo as *mut _) != sdl2_sys::SDL_bool::SDL_FALSE {
|
||||||
|
let window = winfo.info.x11.display as *mut objc::runtime::Object;
|
||||||
|
let _: () = msg_send![window, setTitlebarAppearsTransparent:1];
|
||||||
|
let _: () = msg_send![window, setTitleVisibility:1]; // NSWindowTitleHidden
|
||||||
|
let mut style_mask: u32 = msg_send![window, styleMask];
|
||||||
|
|
||||||
|
style_mask |= 1 << 15; // NSWindowStyleMaskFullSizeContentView
|
||||||
|
|
||||||
|
let _: () = msg_send![window, setStyleMask:style_mask];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for event in self.event_pump.poll_iter() {
|
for event in self.event_pump.poll_iter() {
|
||||||
imgui_sdl2.handle_event(imgui, &event);
|
imgui_sdl2.handle_event(imgui, &event);
|
||||||
|
|
||||||
|
|
|
@ -279,6 +279,52 @@ fn check_shader_compile_status(shader: u32, gl: &Gl) -> bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
const VERTEX_SHADER_BASIC: &str = r"
|
const VERTEX_SHADER_BASIC: &str = r"
|
||||||
|
#version 110
|
||||||
|
|
||||||
|
uniform mat4 ProjMtx;
|
||||||
|
attribute vec2 Position;
|
||||||
|
attribute vec2 UV;
|
||||||
|
attribute vec4 Color;
|
||||||
|
varying vec2 Frag_UV;
|
||||||
|
varying vec4 Frag_Color;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
Frag_UV = UV;
|
||||||
|
Frag_Color = Color;
|
||||||
|
gl_Position = ProjMtx * vec4(Position.xy, 0.0, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
";
|
||||||
|
|
||||||
|
const FRAGMENT_SHADER_TEXTURED: &str = r"
|
||||||
|
#version 110
|
||||||
|
|
||||||
|
uniform sampler2D Texture;
|
||||||
|
varying vec2 Frag_UV;
|
||||||
|
varying vec4 Frag_Color;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_FragColor = Frag_Color * texture2D(Texture, Frag_UV.st);
|
||||||
|
}
|
||||||
|
|
||||||
|
";
|
||||||
|
|
||||||
|
const FRAGMENT_SHADER_COLOR: &str = r"
|
||||||
|
#version 110
|
||||||
|
|
||||||
|
varying vec2 Frag_UV;
|
||||||
|
varying vec4 Frag_Color;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_FragColor = Frag_Color;
|
||||||
|
}
|
||||||
|
|
||||||
|
";
|
||||||
|
|
||||||
|
const VERTEX_SHADER_BASIC_GLES: &str = r"
|
||||||
#version 100
|
#version 100
|
||||||
|
|
||||||
precision mediump float;
|
precision mediump float;
|
||||||
|
@ -299,7 +345,7 @@ void main()
|
||||||
|
|
||||||
";
|
";
|
||||||
|
|
||||||
const FRAGMENT_SHADER_TEXTURED: &str = r"
|
const FRAGMENT_SHADER_TEXTURED_GLES: &str = r"
|
||||||
#version 100
|
#version 100
|
||||||
|
|
||||||
precision mediump float;
|
precision mediump float;
|
||||||
|
@ -315,7 +361,7 @@ void main()
|
||||||
|
|
||||||
";
|
";
|
||||||
|
|
||||||
const FRAGMENT_SHADER_COLOR: &str = r"
|
const FRAGMENT_SHADER_COLOR_GLES: &str = r"
|
||||||
#version 100
|
#version 100
|
||||||
|
|
||||||
precision mediump float;
|
precision mediump float;
|
||||||
|
@ -366,15 +412,19 @@ impl ImguiData {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn init(&mut self, imgui: &mut imgui::Context, gl: &Gl) {
|
fn init(&mut self, gles2_mode: bool, imgui: &mut imgui::Context, gl: &Gl) {
|
||||||
self.initialized = true;
|
self.initialized = true;
|
||||||
|
|
||||||
let vert_sources = [VERTEX_SHADER_BASIC.as_ptr() as *const GLchar];
|
let vshdr_basic = if gles2_mode { VERTEX_SHADER_BASIC_GLES } else { VERTEX_SHADER_BASIC };
|
||||||
let frag_sources_tex = [FRAGMENT_SHADER_TEXTURED.as_ptr() as *const GLchar];
|
let fshdr_tex = if gles2_mode { FRAGMENT_SHADER_TEXTURED_GLES } else { FRAGMENT_SHADER_TEXTURED };
|
||||||
let frag_sources_fill = [FRAGMENT_SHADER_COLOR.as_ptr() as *const GLchar];
|
let fshdr_fill = if gles2_mode { FRAGMENT_SHADER_COLOR_GLES } else { FRAGMENT_SHADER_COLOR };
|
||||||
let vert_sources_len = [VERTEX_SHADER_BASIC.len() as GLint - 1];
|
|
||||||
let frag_sources_tex_len = [FRAGMENT_SHADER_TEXTURED.len() as GLint - 1];
|
let vert_sources = [vshdr_basic.as_ptr() as *const GLchar];
|
||||||
let frag_sources_fill_len = [FRAGMENT_SHADER_COLOR.len() as GLint - 1];
|
let frag_sources_tex = [fshdr_tex.as_ptr() as *const GLchar];
|
||||||
|
let frag_sources_fill = [fshdr_fill.as_ptr() as *const GLchar];
|
||||||
|
let vert_sources_len = [vshdr_basic.len() as GLint - 1];
|
||||||
|
let frag_sources_tex_len = [fshdr_tex.len() as GLint - 1];
|
||||||
|
let frag_sources_fill_len = [fshdr_fill.len() as GLint - 1];
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
self.program_tex = gl.gl.CreateProgram();
|
self.program_tex = gl.gl.CreateProgram();
|
||||||
|
@ -520,10 +570,11 @@ impl OpenGLRenderer {
|
||||||
fn get_context(&mut self) -> Option<(&mut GLContext, &'static Gl)> {
|
fn get_context(&mut self) -> Option<(&mut GLContext, &'static Gl)> {
|
||||||
let imgui = unsafe { &mut *self.imgui.get() };
|
let imgui = unsafe { &mut *self.imgui.get() };
|
||||||
|
|
||||||
|
let gles2 = self.refs.gles2_mode;
|
||||||
let gl = load_gl(&mut self.refs);
|
let gl = load_gl(&mut self.refs);
|
||||||
|
|
||||||
if !self.imgui_data.initialized {
|
if !self.imgui_data.initialized {
|
||||||
self.imgui_data.init(imgui, gl);
|
self.imgui_data.init(gles2, imgui, gl);
|
||||||
}
|
}
|
||||||
|
|
||||||
Some((&mut self.refs, gl))
|
Some((&mut self.refs, gl))
|
||||||
|
|
16
src/lib.rs
16
src/lib.rs
|
@ -200,6 +200,22 @@ pub fn init() -> GameResult {
|
||||||
if resource_dir.file_name().is_some() {
|
if resource_dir.file_name().is_some() {
|
||||||
let _ = resource_dir.pop();
|
let _ = resource_dir.pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(target_os = "macos")]
|
||||||
|
{
|
||||||
|
let mut bundle_dir = resource_dir.clone();
|
||||||
|
let _ = bundle_dir.pop();
|
||||||
|
let mut bundle_exec_dir = bundle_dir.clone();
|
||||||
|
|
||||||
|
bundle_exec_dir.push("MacOS");
|
||||||
|
bundle_dir.push("Resources");
|
||||||
|
|
||||||
|
if bundle_exec_dir.is_dir() && bundle_dir.is_dir() {
|
||||||
|
log::info!("Running in macOS bundle mode");
|
||||||
|
resource_dir = bundle_dir
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
resource_dir.push("data");
|
resource_dir.push("data");
|
||||||
resource_dir
|
resource_dir
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue