Compare commits
9 Commits
70056cf4ca
...
vita
| Author | SHA1 | Date | |
|---|---|---|---|
| 5919881568 | |||
| cbb68a399d | |||
| 0e794f28b1 | |||
| 87d2d9123e | |||
| 6823a4ddb5 | |||
| 20a7c70081 | |||
| 9caa33b3bb | |||
| 2d7e61460a | |||
| a4b7fb3f44 |
176
.github/workflows/build.yml
vendored
176
.github/workflows/build.yml
vendored
@@ -1,5 +1,4 @@
|
||||
name: Build Dusk
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
@@ -7,94 +6,52 @@ on:
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
|
||||
jobs:
|
||||
# run-tests:
|
||||
# runs-on: ubuntu-latest
|
||||
# steps:
|
||||
# - name: Checkout repository
|
||||
# uses: actions/checkout@v6
|
||||
# - name: Set up Docker
|
||||
# uses: docker/setup-docker-action@v5
|
||||
# - name: Run tests in Docker
|
||||
# run: ./scripts/test-linux-docker.sh
|
||||
run-tests:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
- name: Set up Docker
|
||||
uses: docker/setup-docker-action@v5
|
||||
- name: Run tests in Docker
|
||||
run: ./scripts/test-linux-docker.sh
|
||||
|
||||
# build-linux:
|
||||
# runs-on: ubuntu-latest
|
||||
# steps:
|
||||
# - name: Checkout repository
|
||||
# uses: actions/checkout@v6
|
||||
# - name: Set up Docker
|
||||
# uses: docker/setup-docker-action@v5
|
||||
# - name: Build Linux
|
||||
# run: ./scripts/build-linux-docker.sh
|
||||
# - name: Upload Linux binary
|
||||
# uses: actions/upload-artifact@v6
|
||||
# with:
|
||||
# name: dusk-linux
|
||||
# path: build-linux/Dusk
|
||||
# if-no-files-found: error
|
||||
build-linux:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
- name: Set up Docker
|
||||
uses: docker/setup-docker-action@v5
|
||||
- name: Build Linux
|
||||
run: ./scripts/build-linux-docker.sh
|
||||
- name: Upload Linux binary
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: dusk-linux
|
||||
path: build-linux/Dusk
|
||||
if-no-files-found: error
|
||||
|
||||
# build-psp:
|
||||
# runs-on: ubuntu-latest
|
||||
# steps:
|
||||
# - name: Checkout repository
|
||||
# uses: actions/checkout@v6
|
||||
# - name: Set up Docker
|
||||
# uses: docker/setup-docker-action@v5
|
||||
# - name: Build psp
|
||||
# run: ./scripts/build-psp-docker.sh
|
||||
# - name: Move EBOOT.PBP to Dusk subfolder
|
||||
# run: |
|
||||
# mkdir -p ./git-artifcats/Dusk/PSP/GAME/Dusk
|
||||
# cp build-psp/EBOOT.PBP ./git-artifcats/Dusk/PSP/GAME/Dusk/EBOOT.PBP
|
||||
# - name: Upload psp binary
|
||||
# uses: actions/upload-artifact@v6
|
||||
# with:
|
||||
# name: dusk-psp
|
||||
# path: ./git-artifcats/Dusk
|
||||
# if-no-files-found: error
|
||||
|
||||
# build-gamecube:
|
||||
# runs-on: ubuntu-latest
|
||||
# steps:
|
||||
# - name: Checkout repository
|
||||
# uses: actions/checkout@v6
|
||||
# - name: Set up Docker
|
||||
# uses: docker/setup-docker-action@v5
|
||||
# - name: Build GameCube
|
||||
# run: ./scripts/build-gamecube-docker.sh
|
||||
# - name: Copy output files.
|
||||
# run: |
|
||||
# mkdir -p ./git-artifcats/Dusk
|
||||
# cp build-gamecube/Dusk.dol ./git-artifcats/Dusk/Dusk.dol
|
||||
# cp build-gamecube/dusk.dsk ./git-artifcats/Dusk/dusk.dsk
|
||||
# - name: Upload GameCube binary
|
||||
# uses: actions/upload-artifact@v6
|
||||
# with:
|
||||
# name: dusk-gamecube
|
||||
# path: ./git-artifcats/Dusk
|
||||
|
||||
# build-wii:
|
||||
# runs-on: ubuntu-latest
|
||||
# steps:
|
||||
# - name: Checkout repository
|
||||
# uses: actions/checkout@v6
|
||||
# - name: Set up Docker
|
||||
# uses: docker/setup-docker-action@v5
|
||||
# - name: Build Wii
|
||||
# run: ./scripts/build-wii-docker.sh
|
||||
# - name: Copy output files.
|
||||
# run: |
|
||||
# mkdir -p ./git-artifcats/Dusk/apps/Dusk
|
||||
# cp build-wii/Dusk.dol ./git-artifcats/Dusk/apps/Dusk/Dusk.dol
|
||||
# cp build-wii/dusk.dsk ./git-artifcats/Dusk/apps/Dusk/dusk.dsk
|
||||
# cp docker/dolphin/meta.xml ./git-artifcats/Dusk/apps/Dusk/meta.xml
|
||||
# - name: Upload Wii binary
|
||||
# uses: actions/upload-artifact@v6
|
||||
# with:
|
||||
# name: dusk-wii
|
||||
# path: ./git-artifcats/Dusk
|
||||
build-psp:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
- name: Set up Docker
|
||||
uses: docker/setup-docker-action@v5
|
||||
- name: Build psp
|
||||
run: ./scripts/build-psp-docker.sh
|
||||
- name: Move EBOOT.PBP to Dusk subfolder
|
||||
run: |
|
||||
mkdir -p ./git-artifcats/Dusk/PSP/GAME/Dusk
|
||||
cp build-psp/EBOOT.PBP ./git-artifcats/Dusk/PSP/GAME/Dusk/EBOOT.PBP
|
||||
- name: Upload psp binary
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: dusk-psp
|
||||
path: ./git-artifcats/Dusk
|
||||
if-no-files-found: error
|
||||
|
||||
build-knulli:
|
||||
runs-on: ubuntu-latest
|
||||
@@ -105,13 +62,56 @@ jobs:
|
||||
uses: docker/setup-docker-action@v5
|
||||
- name: Build knulli
|
||||
run: ./scripts/build-knulli-docker.sh
|
||||
- name: Upload knulli binary
|
||||
uses: actions/upload-artifact@v6
|
||||
- name: Move output to Dusk subfolder
|
||||
run: |
|
||||
mkdir -p ./git-artifcats/Dusk
|
||||
cp -r build-knulli/dusk ./git-artifcats/Dusk
|
||||
- name: Upload knulli binary
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: dusk-knulli
|
||||
path: ./git-artifcats/Dusk
|
||||
if-no-files-found: error
|
||||
|
||||
build-gamecube:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
- name: Set up Docker
|
||||
uses: docker/setup-docker-action@v5
|
||||
- name: Build GameCube
|
||||
run: ./scripts/build-gamecube-docker.sh
|
||||
- name: Copy output files.
|
||||
run: |
|
||||
mkdir -p ./git-artifcats/Dusk
|
||||
cp build-gamecube/Dusk.dol ./git-artifcats/Dusk/Dusk.dol
|
||||
cp build-gamecube/dusk.dsk ./git-artifcats/Dusk/dusk.dsk
|
||||
- name: Upload GameCube binary
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: dusk-gamecube
|
||||
path: ./git-artifcats/Dusk
|
||||
if-no-files-found: error
|
||||
|
||||
build-wii:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
- name: Set up Docker
|
||||
uses: docker/setup-docker-action@v5
|
||||
- name: Build Wii
|
||||
run: ./scripts/build-wii-docker.sh
|
||||
- name: Copy output files.
|
||||
run: |
|
||||
mkdir -p ./git-artifcats/Dusk/apps/Dusk
|
||||
cp build-wii/Dusk.dol ./git-artifcats/Dusk/apps/Dusk/Dusk.dol
|
||||
cp build-wii/dusk.dsk ./git-artifcats/Dusk/apps/Dusk/dusk.dsk
|
||||
cp docker/dolphin/meta.xml ./git-artifcats/Dusk/apps/Dusk/meta.xml
|
||||
- name: Upload Wii binary
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: dusk-wii
|
||||
path: ./git-artifcats/Dusk
|
||||
if-no-files-found: error
|
||||
17
cmake/modules/CompileLibZip.cmake
Normal file
17
cmake/modules/CompileLibZip.cmake
Normal file
@@ -0,0 +1,17 @@
|
||||
include(FetchContent)
|
||||
|
||||
set(ENABLE_ZSTD OFF CACHE BOOL "" FORCE)
|
||||
set(BUILD_TOOLS OFF CACHE BOOL "" FORCE)
|
||||
set(BUILD_REGRESS OFF CACHE BOOL "" FORCE)
|
||||
set(BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
|
||||
set(BUILD_DOC OFF CACHE BOOL "" FORCE)
|
||||
set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
|
||||
set(LIBZIP_DO_INSTALL OFF CACHE BOOL "" FORCE)
|
||||
|
||||
FetchContent_Declare(
|
||||
libzip
|
||||
GIT_REPOSITORY https://github.com/nih-at/libzip.git
|
||||
GIT_TAG v1.11.4
|
||||
)
|
||||
|
||||
FetchContent_MakeAvailable(libzip)
|
||||
20
cmake/modules/CompileLua.cmake
Normal file
20
cmake/modules/CompileLua.cmake
Normal file
@@ -0,0 +1,20 @@
|
||||
# Compile lua
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
liblua
|
||||
URL https://www.lua.org/ftp/lua-5.5.0.tar.gz
|
||||
)
|
||||
FetchContent_MakeAvailable(liblua)
|
||||
set(LUA_SRC_DIR "${liblua_SOURCE_DIR}/src")
|
||||
set(LUA_C_FILES
|
||||
lapi.c lauxlib.c lbaselib.c lcode.c lcorolib.c lctype.c ldblib.c ldebug.c
|
||||
ldo.c ldump.c lfunc.c lgc.c linit.c liolib.c llex.c lmathlib.c lmem.c
|
||||
loadlib.c lobject.c lopcodes.c loslib.c lparser.c lstate.c lstring.c
|
||||
lstrlib.c ltable.c ltablib.c ltm.c lundump.c lutf8lib.c lvm.c lzio.c
|
||||
)
|
||||
list(TRANSFORM LUA_C_FILES PREPEND "${LUA_SRC_DIR}/")
|
||||
add_library(liblua STATIC ${LUA_C_FILES})
|
||||
target_include_directories(liblua PUBLIC "${LUA_SRC_DIR}")
|
||||
target_compile_definitions(liblua PRIVATE LUA_USE_C89)
|
||||
add_library(lua::lua ALIAS liblua)
|
||||
set(Lua_FOUND TRUE CACHE BOOL "Lua found" FORCE)
|
||||
@@ -1,17 +1,43 @@
|
||||
|
||||
# Allow user to manually specify libzip paths
|
||||
# LIBZIP_ROOT: root directory for libzip (optional)
|
||||
# LIBZIP_INCLUDE_DIR: path to zip.h (optional)
|
||||
# LIBZIP_LIBRARY: path to libzip library (optional)
|
||||
|
||||
find_package(ZLIB REQUIRED)
|
||||
|
||||
find_path(LIBZIP_INCLUDE_DIR NAMES zip.h)
|
||||
if(NOT LIBZIP_INCLUDE_DIR AND LIBZIP_ROOT)
|
||||
find_path(LIBZIP_INCLUDE_DIR NAMES zip.h HINTS "${LIBZIP_ROOT}/include")
|
||||
endif()
|
||||
if(NOT LIBZIP_INCLUDE_DIR)
|
||||
find_path(LIBZIP_INCLUDE_DIR NAMES zip.h)
|
||||
endif()
|
||||
mark_as_advanced(LIBZIP_INCLUDE_DIR)
|
||||
|
||||
find_library(LIBZIP_LIBRARY NAMES zip)
|
||||
if(NOT LIBZIP_LIBRARY AND LIBZIP_ROOT)
|
||||
find_library(LIBZIP_LIBRARY NAMES zip HINTS "${LIBZIP_ROOT}/lib")
|
||||
endif()
|
||||
if(NOT LIBZIP_LIBRARY)
|
||||
find_library(LIBZIP_LIBRARY NAMES zip)
|
||||
endif()
|
||||
mark_as_advanced(LIBZIP_LIBRARY)
|
||||
|
||||
get_filename_component(_libzip_libdir ${LIBZIP_LIBRARY} DIRECTORY)
|
||||
find_file(_libzip_pkgcfg libzip.pc
|
||||
HINTS ${_libzip_libdir} ${LIBZIP_INCLUDE_DIR}/..
|
||||
PATH_SUFFIXES pkgconfig lib/pkgconfig libdata/pkgconfig
|
||||
NO_DEFAULT_PATH
|
||||
)
|
||||
if(LIBZIP_LIBRARY)
|
||||
get_filename_component(_libzip_libdir ${LIBZIP_LIBRARY} DIRECTORY)
|
||||
endif()
|
||||
if(NOT _libzip_pkgcfg AND LIBZIP_ROOT)
|
||||
find_file(_libzip_pkgcfg libzip.pc
|
||||
HINTS "${LIBZIP_ROOT}/lib/pkgconfig" "${LIBZIP_ROOT}/libdata/pkgconfig"
|
||||
NO_DEFAULT_PATH
|
||||
)
|
||||
endif()
|
||||
if(NOT _libzip_pkgcfg AND LIBZIP_LIBRARY)
|
||||
find_file(_libzip_pkgcfg libzip.pc
|
||||
HINTS ${_libzip_libdir} ${LIBZIP_INCLUDE_DIR}/..
|
||||
PATH_SUFFIXES pkgconfig lib/pkgconfig libdata/pkgconfig
|
||||
NO_DEFAULT_PATH
|
||||
)
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(
|
||||
|
||||
@@ -21,26 +21,7 @@ set(CGLM_SHARED OFF CACHE BOOL "Build cglm shared" FORCE)
|
||||
set(CGLM_STATIC ON CACHE BOOL "Build cglm static" FORCE)
|
||||
find_package(cglm REQUIRED)
|
||||
|
||||
# Compile lua
|
||||
include(FetchContent)
|
||||
FetchContent_Declare(
|
||||
liblua
|
||||
URL https://www.lua.org/ftp/lua-5.5.0.tar.gz
|
||||
)
|
||||
FetchContent_MakeAvailable(liblua)
|
||||
set(LUA_SRC_DIR "${liblua_SOURCE_DIR}/src")
|
||||
set(LUA_C_FILES
|
||||
lapi.c lauxlib.c lbaselib.c lcode.c lcorolib.c lctype.c ldblib.c ldebug.c
|
||||
ldo.c ldump.c lfunc.c lgc.c linit.c liolib.c llex.c lmathlib.c lmem.c
|
||||
loadlib.c lobject.c lopcodes.c loslib.c lparser.c lstate.c lstring.c
|
||||
lstrlib.c ltable.c ltablib.c ltm.c lundump.c lutf8lib.c lvm.c lzio.c
|
||||
)
|
||||
list(TRANSFORM LUA_C_FILES PREPEND "${LUA_SRC_DIR}/")
|
||||
add_library(liblua STATIC ${LUA_C_FILES})
|
||||
target_include_directories(liblua PUBLIC "${LUA_SRC_DIR}")
|
||||
target_compile_definitions(liblua PRIVATE LUA_USE_C89)
|
||||
add_library(lua::lua ALIAS liblua)
|
||||
set(Lua_FOUND TRUE CACHE BOOL "Lua found" FORCE)
|
||||
include(cmake/modules/CompileLua.cmake)
|
||||
|
||||
# Link libraries
|
||||
target_link_libraries(${DUSK_LIBRARY_TARGET_NAME} PRIVATE
|
||||
|
||||
62
cmake/targets/vita.cmake
Normal file
62
cmake/targets/vita.cmake
Normal file
@@ -0,0 +1,62 @@
|
||||
include("${VITASDK}/share/vita.cmake" REQUIRED)
|
||||
|
||||
|
||||
# Manually define libzip for Vita
|
||||
set(LIBZIP_LIBRARY "${VITASDK}/lib/libzip.a" CACHE FILEPATH "libzip library for Vita")
|
||||
set(LIBZIP_INCLUDE_DIR "${VITASDK}/include" CACHE PATH "libzip include dir for Vita")
|
||||
|
||||
set(VITA_APP_NAME "Red Rectangle")
|
||||
set(VITA_TITLEID "VSDK00017")
|
||||
set(VITA_VERSION "01.00")
|
||||
|
||||
|
||||
|
||||
target_link_libraries(${DUSK_LIBRARY_TARGET_NAME} PUBLIC
|
||||
mathneon
|
||||
vitashark
|
||||
kubridge_stub
|
||||
SceAppMgr_stub
|
||||
SceAudio_stub
|
||||
SceCtrl_stub
|
||||
SceCommonDialog_stub
|
||||
SceDisplay_stub
|
||||
SceKernelDmacMgr_stub
|
||||
SceGxm_stub
|
||||
SceShaccCg_stub
|
||||
SceSysmodule_stub
|
||||
ScePower_stub
|
||||
SceTouch_stub
|
||||
SceVshBridge_stub
|
||||
SceIofilemgr_stub
|
||||
SceShaccCgExt
|
||||
SDL2-static
|
||||
libtaihen_stub.a
|
||||
lua::lua
|
||||
zip
|
||||
pthread
|
||||
m
|
||||
)
|
||||
|
||||
target_include_directories(${DUSK_LIBRARY_TARGET_NAME} PRIVATE
|
||||
${SDL2_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
target_compile_definitions(${DUSK_LIBRARY_TARGET_NAME} PUBLIC
|
||||
DUSK_SDL2
|
||||
DUSK_OPENGL
|
||||
DUSK_VITA
|
||||
DUSK_INPUT_GAMEPAD
|
||||
DUSK_PLATFORM_ENDIAN_LITTLE
|
||||
DUSK_DISPLAY_WIDTH=960
|
||||
DUSK_DISPLAY_HEIGHT=544
|
||||
)
|
||||
|
||||
vita_create_self(${DUSK_BINARY_TARGET_NAME}.self ${DUSK_BINARY_TARGET_NAME})
|
||||
vita_create_vpk(${DUSK_BINARY_TARGET_NAME}.vpk ${VITA_TITLEID} ${DUSK_BINARY_TARGET_NAME}.self
|
||||
VERSION ${VITA_VERSION}
|
||||
NAME ${VITA_APP_NAME}
|
||||
# FILE sce_sys/icon0.png sce_sys/icon0.png
|
||||
# FILE sce_sys/livearea/contents/bg.png sce_sys/livearea/contents/bg.png
|
||||
# FILE sce_sys/livearea/contents/startup.png sce_sys/livearea/contents/startup.png
|
||||
# FILE sce_sys/livearea/contents/template.xml sce_sys/livearea/contents/template.xml
|
||||
)
|
||||
64
docker/vita/Dockerfile
Normal file
64
docker/vita/Dockerfile
Normal file
@@ -0,0 +1,64 @@
|
||||
FROM ubuntu:22.04
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
RUN apt-get update && apt-get install -y \
|
||||
cmake \
|
||||
git \
|
||||
curl \
|
||||
sudo \
|
||||
wget \
|
||||
libarchive-tools \
|
||||
python3 \
|
||||
python3-pip \
|
||||
python3-dotenv \
|
||||
python3-polib \
|
||||
python3-pil \
|
||||
python3-pyqt5 \
|
||||
python3-opengl \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
RUN git clone https://github.com/vitasdk/vdpm /vdpm
|
||||
WORKDIR /vdpm
|
||||
RUN ./bootstrap-vitasdk.sh
|
||||
|
||||
ENV VITASDK=/usr/local/vitasdk
|
||||
ENV PATH="${VITASDK}/bin:${PATH}"
|
||||
|
||||
RUN git clone https://github.com/vitasdk/packages.git /vitapackages
|
||||
WORKDIR /vitapackages
|
||||
|
||||
RUN bash -lc '\
|
||||
dir_array=( \
|
||||
zlib \
|
||||
bzip2 \
|
||||
henkaku \
|
||||
taihen \
|
||||
kubridge \
|
||||
openal-soft \
|
||||
openssl \
|
||||
curl \
|
||||
curlpp \
|
||||
expat \
|
||||
opus \
|
||||
opusfile \
|
||||
glm \
|
||||
kuio \
|
||||
vitaShaRK \
|
||||
libmathneon \
|
||||
vitaGL \
|
||||
SceShaccCgExt \
|
||||
sdl2 \
|
||||
libzip \
|
||||
luajit \
|
||||
); \
|
||||
curdir=$(pwd); \
|
||||
for d in "${dir_array[@]}"; do \
|
||||
echo "${curdir}/${d}"; \
|
||||
cd "${curdir}/${d}"; \
|
||||
vita-makepkg; \
|
||||
vdpm *-arm.tar.xz; \
|
||||
done \
|
||||
'
|
||||
|
||||
WORKDIR /workdir
|
||||
@@ -1,6 +1,5 @@
|
||||
#!/bin/bash
|
||||
cmake -S . -B build-knulli -G Ninja \
|
||||
-DDUSK_BUILD_TESTS=ON \
|
||||
-DDUSK_TARGET_SYSTEM=knulli \
|
||||
-DCMAKE_TOOLCHAIN_FILE=./cmake/toolchains/aarch64-linux-gnu.cmake \
|
||||
-DCMAKE_BUILD_TYPE=Release
|
||||
|
||||
3
scripts/build-vita-docker.sh
Executable file
3
scripts/build-vita-docker.sh
Executable file
@@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
docker build -t dusk-vita -f docker/vita/Dockerfile .
|
||||
docker run --rm -v $(pwd):/workdir dusk-vita /bin/bash -c "./scripts/build-vita.sh"
|
||||
6
scripts/build-vita.sh
Executable file
6
scripts/build-vita.sh
Executable file
@@ -0,0 +1,6 @@
|
||||
#!/bin/bash
|
||||
cd /workdir
|
||||
cmake -S . -B build-vita \
|
||||
-DDUSK_TARGET_SYSTEM=vita \
|
||||
-DCMAKE_TOOLCHAIN_FILE="$VITASDK/share/vita.toolchain.cmake"
|
||||
cmake --build build-vita -- -j$(nproc)
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
add_subdirectory(dusk)
|
||||
|
||||
if(DUSK_TARGET_SYSTEM STREQUAL "linux" OR DUSK_TARGET_SYSTEM STREQUAL "knulli")
|
||||
if(DUSK_TARGET_SYSTEM STREQUAL "linux" OR DUSK_TARGET_SYSTEM STREQUAL "knulli" OR DUSK_TARGET_SYSTEM STREQUAL "vita")
|
||||
add_subdirectory(dusklinux)
|
||||
add_subdirectory(dusksdl2)
|
||||
add_subdirectory(duskgl)
|
||||
|
||||
@@ -12,50 +12,50 @@
|
||||
#include "util/endian.h"
|
||||
|
||||
errorret_t assetTextureLoad(assetentire_t entire) {
|
||||
assertNotNull(entire.data, "Data pointer cannot be NULL.");
|
||||
assertNotNull(entire.output, "Output pointer cannot be NULL.");
|
||||
// assertNotNull(entire.data, "Data pointer cannot be NULL.");
|
||||
// assertNotNull(entire.output, "Output pointer cannot be NULL.");
|
||||
|
||||
assettexture_t *assetData = (assettexture_t *)entire.data;
|
||||
texture_t *texture = (texture_t *)entire.output;
|
||||
// assettexture_t *assetData = (assettexture_t *)entire.data;
|
||||
// texture_t *texture = (texture_t *)entire.output;
|
||||
|
||||
// Read header and version (first 4 bytes)
|
||||
if(
|
||||
assetData->header[0] != 'D' ||
|
||||
assetData->header[1] != 'P' ||
|
||||
assetData->header[2] != 'T'
|
||||
) {
|
||||
errorThrow("Invalid texture header");
|
||||
}
|
||||
// // Read header and version (first 4 bytes)
|
||||
// if(
|
||||
// assetData->header[0] != 'D' ||
|
||||
// assetData->header[1] != 'P' ||
|
||||
// assetData->header[2] != 'T'
|
||||
// ) {
|
||||
// errorThrow("Invalid texture header");
|
||||
// }
|
||||
|
||||
// Version (can only be 1 atm)
|
||||
if(assetData->version != 0x01) {
|
||||
errorThrow("Unsupported texture version");
|
||||
}
|
||||
// // Version (can only be 1 atm)
|
||||
// if(assetData->version != 0x01) {
|
||||
// errorThrow("Unsupported texture version");
|
||||
// }
|
||||
|
||||
// Fix endian
|
||||
assetData->width = endianLittleToHost32(assetData->width);
|
||||
assetData->height = endianLittleToHost32(assetData->height);
|
||||
// // Fix endian
|
||||
// assetData->width = endianLittleToHost32(assetData->width);
|
||||
// assetData->height = endianLittleToHost32(assetData->height);
|
||||
|
||||
// Check dimensions.
|
||||
if(
|
||||
assetData->width == 0 || assetData->width > ASSET_TEXTURE_WIDTH_MAX ||
|
||||
assetData->height == 0 || assetData->height > ASSET_TEXTURE_HEIGHT_MAX
|
||||
) {
|
||||
errorThrow("Invalid texture dimensions");
|
||||
}
|
||||
// // Check dimensions.
|
||||
// if(
|
||||
// assetData->width == 0 || assetData->width > ASSET_TEXTURE_WIDTH_MAX ||
|
||||
// assetData->height == 0 || assetData->height > ASSET_TEXTURE_HEIGHT_MAX
|
||||
// ) {
|
||||
// errorThrow("Invalid texture dimensions");
|
||||
// }
|
||||
|
||||
textureInit(
|
||||
texture,
|
||||
assetData->width,
|
||||
assetData->height,
|
||||
TEXTURE_FORMAT_PALETTE,
|
||||
(texturedata_t){
|
||||
.paletted = {
|
||||
.indices = NULL,
|
||||
.palette = NULL
|
||||
}
|
||||
}
|
||||
);
|
||||
// textureInit(
|
||||
// texture,
|
||||
// assetData->width,
|
||||
// assetData->height,
|
||||
// TEXTURE_FORMAT_PALETTE,
|
||||
// (texturedata_t){
|
||||
// .paletted = {
|
||||
// .indices = NULL,
|
||||
// .palette = NULL
|
||||
// }
|
||||
// }
|
||||
// );
|
||||
|
||||
errorOk();
|
||||
// errorOk();
|
||||
}
|
||||
@@ -20,4 +20,5 @@ pink,1,0.75,0.8,1
|
||||
lime,0.75,1,0,1
|
||||
navy,0,0,0.5,1
|
||||
teal,0,0.5,0.5,1
|
||||
cornflower_blue,0.39,0.58,0.93,1
|
||||
cornflower_blue,0.39,0.58,0.93,1
|
||||
salmon,1,0.5,0.5,1
|
||||
|
@@ -40,38 +40,38 @@ errorret_t displayInit(void) {
|
||||
errorChain(textInit());
|
||||
errorChain(screenInit());
|
||||
|
||||
PALETTES[0].colors[0] = COLOR_RED;
|
||||
PALETTES[0].colors[1] = COLOR_GREEN;
|
||||
PALETTES[0].colors[2] = COLOR_BLUE;
|
||||
PALETTES[0].colors[3] = COLOR_WHITE;
|
||||
PALETTES[0].colors[4] = COLOR_MAGENTA;
|
||||
PALETTES[0].colors[5] = COLOR_CYAN;
|
||||
PALETTES[0].colors[6] = COLOR_YELLOW;
|
||||
PALETTES[0].colors[7] = COLOR_BLACK;
|
||||
PALETTES[0].count = 8;
|
||||
// PALETTES[0].colors[0] = COLOR_RED;
|
||||
// PALETTES[0].colors[1] = COLOR_GREEN;
|
||||
// PALETTES[0].colors[2] = COLOR_BLUE;
|
||||
// PALETTES[0].colors[3] = COLOR_WHITE;
|
||||
// PALETTES[0].colors[4] = COLOR_MAGENTA;
|
||||
// PALETTES[0].colors[5] = COLOR_CYAN;
|
||||
// PALETTES[0].colors[6] = COLOR_YELLOW;
|
||||
// PALETTES[0].colors[7] = COLOR_BLACK;
|
||||
// PALETTES[0].count = 8;
|
||||
|
||||
uint8_t indices[64] = {
|
||||
0,0,0,0,0,0,0,0,
|
||||
1,1,1,1,1,1,1,1,
|
||||
2,2,2,2,2,2,2,2,
|
||||
3,3,3,3,3,3,3,3,
|
||||
4,4,4,4,4,4,4,4,
|
||||
5,5,5,5,5,5,5,5,
|
||||
6,6,6,6,6,6,6,6,
|
||||
7,7,7,7,7,7,7,7
|
||||
};
|
||||
// uint8_t indices[64] = {
|
||||
// 0,0,0,0,0,0,0,0,
|
||||
// 1,1,1,1,1,1,1,1,
|
||||
// 2,2,2,2,2,2,2,2,
|
||||
// 3,3,3,3,3,3,3,3,
|
||||
// 4,4,4,4,4,4,4,4,
|
||||
// 5,5,5,5,5,5,5,5,
|
||||
// 6,6,6,6,6,6,6,6,
|
||||
// 7,7,7,7,7,7,7,7
|
||||
// };
|
||||
|
||||
errorChain(textureInit(
|
||||
&PALETTE_TEXTURE,
|
||||
8, 8,
|
||||
TEXTURE_FORMAT_PALETTE,
|
||||
(texturedata_t){
|
||||
.paletted = {
|
||||
.indices = indices,
|
||||
.palette = &PALETTES[0]
|
||||
}
|
||||
}
|
||||
));
|
||||
// errorChain(textureInit(
|
||||
// &PALETTE_TEXTURE,
|
||||
// 8, 8,
|
||||
// TEXTURE_FORMAT_PALETTE,
|
||||
// (texturedata_t){
|
||||
// .paletted = {
|
||||
// .indices = indices,
|
||||
// .palette = &PALETTES[0]
|
||||
// }
|
||||
// }
|
||||
// ));
|
||||
|
||||
errorChain(textureInit(
|
||||
&UNCOMPRESSED_TEXTURE,
|
||||
@@ -115,7 +115,7 @@ errorret_t displayUpdate(void) {
|
||||
// camera.orthographic.left = 0.0f;
|
||||
// camera.orthographic.right = SCREEN.width;
|
||||
// camera.orthographic.top = SCREEN.height;
|
||||
// camera.orthographic.bottom = 0.0f;
|
||||
// camera.orthographic.bottom = 0.0f;
|
||||
cameraInitPerspective(&camera);
|
||||
camera.lookat.position[0] = 3.0f;
|
||||
camera.lookat.position[1] = 3.0f;
|
||||
|
||||
@@ -26,7 +26,6 @@ typedef union texturedata_u {
|
||||
palette_t *palette;
|
||||
} paletted;
|
||||
color_t *rgbaColors;
|
||||
uint8_t *compressedData;
|
||||
} texturedata_t;
|
||||
|
||||
/**
|
||||
|
||||
@@ -47,8 +47,6 @@ errorret_t meshDrawDolphin(
|
||||
assertTrue(offsetof(meshvertex_t, uv) == 4, "uv offset wrong");
|
||||
assertTrue(offsetof(meshvertex_t, pos) == 12, "pos offset wrong");
|
||||
|
||||
textureDolphinUploadTEV();
|
||||
|
||||
DCFlushRange(
|
||||
(void*)&mesh->vertices[vertexOffset],
|
||||
sizeof(meshvertex_t) * vertexCount
|
||||
|
||||
@@ -77,6 +77,88 @@ errorret_t shaderSetMatrixDolphin(
|
||||
errorOk();
|
||||
}
|
||||
|
||||
errorret_t shaderSetTextureDolphin(
|
||||
shaderdolphin_t *shader,
|
||||
const char_t *name,
|
||||
texture_t *texture
|
||||
) {
|
||||
assertNotNull(shader, "Shader must not be null");
|
||||
assertNotNull(name, "Uniform name must not be null");
|
||||
assertStrLenMin(name, 1, "Uniform name cannot be empty");
|
||||
|
||||
if(texture == NULL) {
|
||||
// GX_SetNumChans(0);
|
||||
GX_SetNumChans(1);
|
||||
GX_SetChanCtrl(
|
||||
GX_COLOR0A0,
|
||||
GX_DISABLE,
|
||||
GX_SRC_REG,
|
||||
GX_SRC_VTX,
|
||||
GX_LIGHTNULL,
|
||||
GX_DF_NONE,
|
||||
GX_AF_NONE
|
||||
);
|
||||
GX_SetChanAmbColor(GX_COLOR0A0, (GXColor){ 0, 0, 0, 0 });
|
||||
GX_SetChanMatColor(GX_COLOR0A0, (GXColor){ 255, 255, 255, 255 });
|
||||
|
||||
GX_SetNumTexGens(0);
|
||||
|
||||
GX_SetNumTevStages(1);
|
||||
GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORDNULL, GX_TEXMAP_NULL, GX_COLOR0A0);
|
||||
GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR);
|
||||
|
||||
GX_SetBlendMode(GX_BM_NONE, GX_BL_ONE, GX_BL_ZERO, GX_LO_CLEAR);
|
||||
GX_SetAlphaCompare(GX_ALWAYS, 0, GX_AOP_AND, GX_ALWAYS, 0);
|
||||
|
||||
errorOk();
|
||||
}
|
||||
|
||||
// Add channel for vertex color
|
||||
GX_LoadTexObj(&texture->texObj, GX_TEXMAP0);
|
||||
GX_SetNumChans(1);
|
||||
GX_SetChanCtrl(
|
||||
GX_COLOR0A0,// Store in color channel 0
|
||||
GX_DISABLE,// Lighting disabled
|
||||
GX_SRC_REG,// Ambient color?
|
||||
GX_SRC_VTX,// Material color?
|
||||
GX_LIGHTNULL,// Light Mask
|
||||
GX_DF_NONE,// Diffuse function
|
||||
GX_AF_NONE// Attenuation function
|
||||
);
|
||||
|
||||
// One set of UVs
|
||||
GX_SetNumTexGens(1);
|
||||
GX_SetTexCoordGen(
|
||||
GX_TEXCOORD0,
|
||||
GX_TG_MTX2x4,
|
||||
GX_TG_TEX0,
|
||||
GX_IDENTITY
|
||||
);
|
||||
|
||||
// Basically the shader setup
|
||||
switch(texture->format) {
|
||||
case TEXTURE_FORMAT_RGBA:
|
||||
// One TEV stage: vertex color * texture color
|
||||
GX_SetNumTevStages(1);
|
||||
GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE);
|
||||
GX_SetTevOrder(
|
||||
GX_TEVSTAGE0,
|
||||
GX_TEXCOORD0,
|
||||
GX_TEXMAP0,
|
||||
GX_COLOR0A0
|
||||
);
|
||||
GX_SetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_CLEAR);
|
||||
GX_SetAlphaCompare(GX_ALWAYS, 0, GX_AOP_AND, GX_ALWAYS, 0);
|
||||
break;
|
||||
|
||||
default:
|
||||
assertUnreachable("Unknown texture format in meshDraw");
|
||||
break;
|
||||
}
|
||||
|
||||
errorOk();
|
||||
}
|
||||
|
||||
errorret_t shaderDisposeDolphin(shaderdolphin_t *shader) {
|
||||
assertNotNull(shader, "Shader must not be null");
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include "error/error.h"
|
||||
#include "display/texture/texture.h"
|
||||
|
||||
typedef struct {
|
||||
mat4 view;
|
||||
@@ -66,6 +66,20 @@ errorret_t shaderSetMatrixDolphin(
|
||||
mat4 matrix
|
||||
);
|
||||
|
||||
/**
|
||||
* Sets a texture uniform in the dolphin shader. Basically does nothing.
|
||||
*
|
||||
* @param shader Shader to set the texture in.
|
||||
* @param name Name of the uniform to set.
|
||||
* @param texture Texture to set.
|
||||
* @return Error code if failure.
|
||||
*/
|
||||
errorret_t shaderSetTextureDolphin(
|
||||
shaderdolphin_t *shader,
|
||||
const char_t *name,
|
||||
texture_t *texture
|
||||
);
|
||||
|
||||
/**
|
||||
* Disposes a dolphin shader. Basically does nothing.
|
||||
*
|
||||
|
||||
@@ -14,5 +14,5 @@ typedef shaderdefinitiondolphin_t shaderdefinitionplatform_t;
|
||||
#define shaderInitPlatform shaderInitDolphin
|
||||
#define shaderBindPlatform shaderBindDolphin
|
||||
#define shaderSetMatrixPlatform shaderSetMatrixDolphin
|
||||
// #define shaderSetTexturePlatform shaderSetTextureDolphin
|
||||
#define shaderSetTexturePlatform shaderSetTextureDolphin
|
||||
#define shaderDisposePlatform shaderDisposeDolphin
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
#include "display/texture/texture.h"
|
||||
#include "assert/assert.h"
|
||||
#include "util/memory.h"
|
||||
|
||||
errorret_t textureInitDolphin(
|
||||
texturedolphin_t *texture,
|
||||
@@ -15,191 +16,101 @@ errorret_t textureInitDolphin(
|
||||
const textureformatdolphin_t format,
|
||||
const texturedata_t data
|
||||
) {
|
||||
// switch(format) {
|
||||
// case TEXTURE_FORMAT_RGBA:
|
||||
// assertTrue(
|
||||
// (width % 4) == 0 && (height % 4) == 0,
|
||||
// "RGB5A3 requires w/h multiple of 4 (or pad)"
|
||||
// );
|
||||
switch(format) {
|
||||
case TEXTURE_FORMAT_RGBA: {
|
||||
size_t rgbaSize = width * height * sizeof(uint8_t) * 4;
|
||||
|
||||
// // Convert to RGB5A3 format
|
||||
// size_t rgbaSize = width * height * sizeof(u16);
|
||||
// texture->rgba = (u16*)memalign(32, rgbaSize);
|
||||
// assertNotNull(texture->rgba, "Failed to allocate texture RGBA data");
|
||||
// Dolphin takes the RGBA data as 4x4 tiled layout.
|
||||
texture->rgba = memoryAllocate(rgbaSize);
|
||||
|
||||
for(uint32_t y = 0; y < height; ++y) {
|
||||
for(uint32_t x = 0; x < width; ++x) {
|
||||
const int src = y * width + x;
|
||||
|
||||
// for(uint32_t y = 0; y < height; ++y) {
|
||||
// for(uint32_t x = 0; x < width; ++x) {
|
||||
// const int src = y * width + x;
|
||||
const int tileX = x >> 2;
|
||||
const int tileY = y >> 2;
|
||||
const int tilesPerRow = width >> 2;
|
||||
const int tileIndex = tileY * tilesPerRow + tileX;
|
||||
const int inTile = ((y & 3) << 2) + (x & 3);
|
||||
const int tileBase = tileIndex * 64;
|
||||
|
||||
// const int tileX = x >> 2;
|
||||
// const int tileY = y >> 2;
|
||||
// const int tilesPerRow = width >> 2;
|
||||
// const int tileIndex = tileY * tilesPerRow + tileX;
|
||||
// const int tileBaseWords = tileIndex * 16;
|
||||
// const int inTile = ((y & 3) << 2) + (x & 3);
|
||||
// const int dest = tileBaseWords + inTile;
|
||||
|
||||
// color4b_t col = data.rgba.colors[src];
|
||||
color_t col = data.rgbaColors[src];
|
||||
|
||||
// u16 outCol;
|
||||
// if(col.a < 255) {
|
||||
// // 0AAA RRRR GGGG BBBB
|
||||
// outCol = (
|
||||
// (0u << 15) |
|
||||
// ((u16)(col.a >> 5) << 12) |
|
||||
// ((u16)(col.r >> 4) << 8) |
|
||||
// ((u16)(col.g >> 4) << 4) |
|
||||
// ((u16)(col.b >> 4) << 0)
|
||||
// );
|
||||
// } else {
|
||||
// // 1RRRR RRGG GGGB BBBB
|
||||
// outCol = (
|
||||
// (1u << 15) |
|
||||
// ((u16)(col.r >> 3) << 10) |
|
||||
// ((u16)(col.g >> 3) << 5) |
|
||||
// ((u16)(col.b >> 3) << 0)
|
||||
// );
|
||||
// }
|
||||
// texture->rgba[dest] = outCol;
|
||||
// }
|
||||
// }
|
||||
// AR plane
|
||||
texture->rgba[tileBase + inTile * 2 + 0] = col.a;
|
||||
texture->rgba[tileBase + inTile * 2 + 1] = col.r;
|
||||
|
||||
// DCFlushRange(texture->rgba, rgbaSize);
|
||||
// GX_InitTexObj(
|
||||
// &texture->texObj,
|
||||
// texture->rgba,
|
||||
// width, height,
|
||||
// GX_TF_RGB5A3,
|
||||
// GX_REPEAT, GX_REPEAT,
|
||||
// GX_FALSE
|
||||
// );
|
||||
// GB plane
|
||||
texture->rgba[tileBase + 32 + inTile * 2 + 0] = col.g;
|
||||
texture->rgba[tileBase + 32 + inTile * 2 + 1] = col.b;
|
||||
}
|
||||
}
|
||||
DCFlushRange(texture->rgba, rgbaSize);
|
||||
GX_InitTexObj(
|
||||
&texture->texObj,
|
||||
texture->rgba,
|
||||
width, height,
|
||||
format,
|
||||
GX_REPEAT, GX_REPEAT,
|
||||
GX_FALSE
|
||||
);
|
||||
|
||||
// DCFlushRange(texture->rgba, rgbaSize);
|
||||
// GX_InvalidateTexAll();
|
||||
DCFlushRange(texture->rgba, rgbaSize);
|
||||
GX_InvalidateTexAll();
|
||||
|
||||
// GX_InitTexObjLOD(
|
||||
// &texture->texObj,
|
||||
// GX_NEAR, GX_NEAR,
|
||||
// 0.0f, 0.0f, 0.0f,
|
||||
// GX_FALSE,
|
||||
// GX_FALSE,
|
||||
// GX_ANISO_1
|
||||
// );
|
||||
// break;
|
||||
GX_InitTexObjLOD(
|
||||
&texture->texObj,
|
||||
GX_NEAR, GX_NEAR,
|
||||
0.0f, 0.0f, 0.0f,
|
||||
GX_FALSE,
|
||||
GX_FALSE,
|
||||
GX_ANISO_1
|
||||
);
|
||||
break;
|
||||
}
|
||||
|
||||
// case TEXTURE_FORMAT_PALETTE: {
|
||||
// // Not supported, convert to RGBA using lookup
|
||||
// color_t* formatted = memoryAllocate(width * height * sizeof(color_t));
|
||||
// for(int32_t i = 0; i < width * height; i++) {
|
||||
// uint8_t index = data.palette.data[i];
|
||||
// assertTrue(
|
||||
// index < data.palette.palette->colorCount,
|
||||
// "Palette index out of range"
|
||||
// );
|
||||
// formatted[i] = data.palette.palette->colors[index];
|
||||
// }
|
||||
case TEXTURE_FORMAT_PALETTE: {
|
||||
assertUnreachable("Paletted textures not yet implemented for Dolphin");
|
||||
break;
|
||||
}
|
||||
|
||||
// textureInit(
|
||||
// texture, width, height, TEXTURE_FORMAT_RGBA,
|
||||
// (texturedata_t){
|
||||
// .rgba = { .colors = formatted }
|
||||
// }
|
||||
// );
|
||||
// memoryFree(formatted);
|
||||
// break;
|
||||
// }
|
||||
|
||||
// default:
|
||||
// assertUnreachable("Unsupported texture format for Dolphin");
|
||||
// break;
|
||||
// }
|
||||
|
||||
// texture->ready = true;
|
||||
|
||||
errorOk();
|
||||
}
|
||||
|
||||
errorret_t textureBindDolphin(texturedolphin_t *texture) {
|
||||
if(texture == NULL) {
|
||||
GX_SetNumChans(0);
|
||||
errorOk();
|
||||
default: {
|
||||
assertUnreachable("Unsupported texture format for Dolphin");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
GX_SetNumChans(1);
|
||||
GX_LoadTexObj(&texture->texObj, GX_TEXMAP0);
|
||||
|
||||
errorOk();
|
||||
}
|
||||
|
||||
|
||||
errorret_t textureDisposeDolphin(texturedolphin_t *texture) {
|
||||
errorOk();
|
||||
}
|
||||
switch(texture->format) {
|
||||
case TEXTURE_FORMAT_RGBA: {
|
||||
if(texture->rgba) {
|
||||
memoryFree(texture->rgba);
|
||||
texture->rgba = NULL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
void textureDolphinUploadTEV(void) {
|
||||
if(TEXTURE_BOUND == NULL) {
|
||||
GX_SetNumChans(1);
|
||||
GX_SetChanCtrl(
|
||||
GX_COLOR0A0,
|
||||
GX_DISABLE,
|
||||
GX_SRC_REG,
|
||||
GX_SRC_VTX,
|
||||
GX_LIGHTNULL,
|
||||
GX_DF_NONE,
|
||||
GX_AF_NONE
|
||||
);
|
||||
GX_SetChanAmbColor(GX_COLOR0A0, (GXColor){0, 0, 0, 0});
|
||||
GX_SetChanMatColor(GX_COLOR0A0, (GXColor){255, 255, 255, 255});
|
||||
|
||||
GX_SetNumTexGens(0);
|
||||
|
||||
GX_SetNumTevStages(1);
|
||||
GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORDNULL, GX_TEXMAP_NULL, GX_COLOR0A0);
|
||||
GX_SetTevOp(GX_TEVSTAGE0, GX_PASSCLR);
|
||||
|
||||
GX_SetBlendMode(GX_BM_NONE, GX_BL_ONE, GX_BL_ZERO, GX_LO_CLEAR);
|
||||
GX_SetAlphaCompare(GX_ALWAYS, 0, GX_AOP_AND, GX_ALWAYS, 0);
|
||||
// case TEXTURE_FORMAT_RGB4A3: {
|
||||
// assertUnreachable("RGB4A3 texture format not yet implemented");
|
||||
// }
|
||||
|
||||
return;
|
||||
}
|
||||
// case TEXTURE_FORMAT_RGB5: {
|
||||
// assertUnreachable("RGB5 texture format not yet implemented");
|
||||
// }
|
||||
|
||||
// Add channel for vertex color
|
||||
GX_SetNumChans(1);
|
||||
GX_SetChanCtrl(
|
||||
GX_COLOR0A0,// Store in color channel 0
|
||||
GX_DISABLE,// Lighting disabled
|
||||
GX_SRC_REG,// Ambient color?
|
||||
GX_SRC_VTX,// Material color?
|
||||
GX_LIGHTNULL,// Light Mask
|
||||
GX_DF_NONE,// Diffuse function
|
||||
GX_AF_NONE// Attenuation function
|
||||
);
|
||||
// case TEXTURE_FORMAT_PALETTE: {
|
||||
// assertUnreachable("Paletted textures not yet implemented for Dolphin");
|
||||
// break;
|
||||
// }
|
||||
|
||||
// One set of UVs
|
||||
GX_SetNumTexGens(1);
|
||||
GX_SetTexCoordGen(
|
||||
GX_TEXCOORD0,
|
||||
GX_TG_MTX2x4,
|
||||
GX_TG_TEX0,
|
||||
GX_IDENTITY
|
||||
);
|
||||
|
||||
// Basically the shader setup
|
||||
switch(TEXTURE_BOUND->format) {
|
||||
case TEXTURE_FORMAT_RGBA:
|
||||
// One TEV stage: vertex color * texture color
|
||||
GX_SetNumTevStages(1);
|
||||
GX_SetTevOp(GX_TEVSTAGE0, GX_MODULATE);
|
||||
GX_SetTevOrder(
|
||||
GX_TEVSTAGE0,
|
||||
GX_TEXCOORD0,
|
||||
GX_TEXMAP0,
|
||||
GX_COLOR0A0
|
||||
);
|
||||
GX_SetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_CLEAR);
|
||||
GX_SetAlphaCompare(GX_ALWAYS, 0, GX_AOP_AND, GX_ALWAYS, 0);
|
||||
break;
|
||||
|
||||
default:
|
||||
assertUnreachable("Unknown texture format in meshDraw");
|
||||
default: {
|
||||
assertUnreachable("Unsupported texture format for Dolphin");
|
||||
break;
|
||||
}
|
||||
}
|
||||
errorOk();
|
||||
}
|
||||
@@ -13,6 +13,8 @@ typedef union texturedata_u texturedata_t;
|
||||
typedef enum {
|
||||
TEXTURE_FORMAT_RGBA = GX_TF_RGBA8,
|
||||
TEXTURE_FORMAT_PALETTE = GX_TF_CI8,
|
||||
// TEXTURE_FORMAT_RGB4A3 = GX_TF_RGB5A3,
|
||||
// TEXTURE_FORMAT_RGB5 = GX_TF_RGB565,
|
||||
} textureformatdolphin_t;
|
||||
|
||||
typedef struct {
|
||||
@@ -20,6 +22,11 @@ typedef struct {
|
||||
textureformatdolphin_t format;
|
||||
int32_t width;
|
||||
int32_t height;
|
||||
|
||||
union {
|
||||
uint8_t *rgba;
|
||||
// u16 *rgba;
|
||||
};
|
||||
} texturedolphin_t;
|
||||
|
||||
/**
|
||||
@@ -54,10 +61,4 @@ errorret_t textureBindDolphin(texturedolphin_t *texture);
|
||||
* @param texture The texture to dispose.
|
||||
* @return An error if the texture failed to dispose, otherwise success.
|
||||
*/
|
||||
errorret_t textureDisposeDolphin(texturedolphin_t *texture);
|
||||
|
||||
/**
|
||||
* Internal method that uploads the texture environment variables to the GPU
|
||||
* for rendering. This is basically uploading the shader information.
|
||||
*/
|
||||
void textureDolphinUploadTEV(void);
|
||||
errorret_t textureDisposeDolphin(texturedolphin_t *texture);
|
||||
@@ -20,6 +20,9 @@
|
||||
#define glClearDepth(depth) glClearDepthf(depth)
|
||||
#else
|
||||
#define GL_GLEXT_PROTOTYPES
|
||||
#include <GL/gl.h>
|
||||
#include <GL/glext.h>
|
||||
#include <vitaGL.h>
|
||||
|
||||
#define GL_COLOR_INDEX8_EXT 0x80E5
|
||||
|
||||
// #include <GL/glext.h>
|
||||
#endif
|
||||
Reference in New Issue
Block a user