Repository: Inochi2D/inochi-session
Branch: v0_8
Commit: 249f04772088
Files: 43
Total size: 56.7 KB
Directory structure:
gitextract_zwm6wzm0/
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug-report.yml
│ │ ├── config.yml
│ │ └── feature_request.yml
│ └── workflows/
│ ├── build.yml
│ ├── pr-test.yml
│ ├── publish-gh.yml
│ ├── publish-itch.yml
│ ├── release-nightly.yml
│ └── release.yml
├── .gitignore
├── LICENSE
├── README.md
├── build-aux/
│ ├── linux/
│ │ ├── inochi-session.appdata.xml
│ │ └── inochi-session.desktop
│ ├── osx/
│ │ ├── BuildUniversal.sh
│ │ ├── Info.plist
│ │ ├── gendmg.sh
│ │ └── osxbundle.sh
│ └── windows/
│ ├── inochi-session.rc
│ └── version.h
├── dub.sdl
├── genpot.sh
├── gentl.sh
├── imgui.ini
├── res/
│ ├── licenses/
│ │ ├── LICENSE-FreeType
│ │ ├── LICENSE-Lua
│ │ ├── LICENSE-Spout2
│ │ └── LICENSE-imgui
│ ├── shaders/
│ │ ├── batch.frag
│ │ └── batch.vert
│ ├── style.css
│ └── version.txt
├── source/
│ ├── app.d
│ ├── inochi2d/
│ │ └── nio/
│ │ ├── puppet.d
│ │ ├── scene.d
│ │ └── staging.d
│ └── session/
│ ├── package.d
│ └── widgets/
│ ├── package.d
│ └── scene.d
├── tl/
│ ├── placeholder.txt
│ └── template.pot
└── vcvars.ps1
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/FUNDING.yml
================================================
github: [LunaTheFoxgirl]
patreon: LunaFoxgirlVT
================================================
FILE: .github/ISSUE_TEMPLATE/bug-report.yml
================================================
name: Bug Report
description: Report an issue with Inochi Session
title: "[BUG]"
labels: ["Bug", "Triage"]
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this bug report!
- type: checkboxes
id: checkboxes
attributes:
label: Validations
description: Before submitting the bug report, please make sure you do the following
options:
- label: I have checked for similar bug reports and could not find any.
required: true
- label: I have tested and confirmed that this is an issue in an official branded build.
required: true
- type: textarea
id: bug-description
attributes:
label: Describe the bug
description: A clear and concise description of what the bug is, and the behavior you expect instead. If you intend to submit a PR for this issue, tell us in the description. Thanks!
placeholder: I am doing ... What I expect is ... What is actually happening is ...
validations:
required: true
- type: textarea
id: reproduction
attributes:
label: Reproduction
description: Steps to reproduce the behavior
placeholder: |
1. Go to '...'
2. Click on '...'
3. Scroll down to '...'
4. See error
validations:
required: true
- type: dropdown
id: sys-arch
attributes:
label: System Architecture
options:
- x86_64
- arm64 / aarch64
- type: dropdown
id: sys-os
attributes:
label: Operating System
options:
- Windows
- macOS
- Linux
- type: input
id: version
attributes:
label: Version
description: The version of Inochi Session you are running, or the commit hash if you are running a nightly / main branch build
- type: textarea
id: logs
attributes:
label: Logs
description: |
Optional. If applicable, provide logs using the format below:
````
<details>
<summary>Click to expand!</summary>
```
// paste the log text here
```
</details>
````
- type: textarea
id: additional-context
attributes:
label: Additional Context
description: |
Any other context or screenshots about the issue here.
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: Discord Chat
url: https://discord.com/invite/abnxwN6r9v
about: Ask questions and discuss with other Inochi2D users in real time.
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: Feature request
description: Suggest an idea for Inochi Session
title: "[Feature Request]"
labels: ["Enhancement", "Triage"]
body:
- type: markdown
attributes:
value: |
Thanks for your interest in the project and taking the time to fill out this feature request!
- type: checkboxes
id: checkboxes
attributes:
label: Validations
description: Before submitting the feature request, please make sure you do the following
options:
- label: I have checked for similar feature requests and could not find any.
required: true
- label: I have made sure this is not an already-existing feature.
required: true
- type: textarea
id: feature-description
attributes:
label: Description
description: |
Clear and concise description of the problem being solved. Please make the reason and usecases as detailed as possible. If you intend to submit a PR for this issue, tell us in the description. Thanks!
placeholder: When using Inochi Session, I would like to be able to [goal / wish] so that [benefit].
validations:
required: true
- type: textarea
id: suggested-solution
attributes:
label: Suggested solution
description: |
A possible implementation to solve the problem.
validations:
required: true
- type: textarea
id: alternative
attributes:
label: Alternative solution
description: |
A different possible solution to solve the problem.
- type: textarea
id: additional-context
attributes:
label: Additional Context
description: |
Any other context or screenshots about the issue here.
================================================
FILE: .github/workflows/build.yml
================================================
name: 'Build Inochi Session'
run-name: 'Build Inochi Session (${{ inputs.variant }})...'
on:
workflow_call:
inputs:
target_ref:
required: false
type: string
default: '${{ github.ref_name }}'
variant:
required: true
type: string
build_type:
required: false
type: string
default: release
generate_version:
required: false
type: boolean
default: false
fail_fast:
required: false
type: boolean
default: true
do_package:
required: false
type: boolean
default: false
postfix:
required: false
type: string
default: ''
permissions:
contents: write
jobs:
build:
runs-on: ${{ matrix.config.os }}
strategy:
fail-fast: ${{ inputs.fail_fast }}
matrix:
config:
- platform: 'osx'
os: 'macos-latest'
- platform: 'win32'
os: windows-latest
- platform: 'linux'
os: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
ref: '${{ inputs.target_ref }}'
# Setup D Compiler
- uses: dlang-community/setup-dlang@v1.4.0
with:
compiler: ldc-latest
- name: 'Preparing build... (Ubuntu)'
if: ${{ matrix.config.platform == 'linux' }}
run: |
sudo apt-get update
sudo apt-get install libsdl3-dev libfontconfig-dev
- name: 'Preparing build... (Windows)'
if: ${{ matrix.config.platform == 'win32' }}
run: |
Remove-Item 'C:/Strawberry' -Recurse
- name: 'Update version info'
if: 'inputs.generate_version'
run: |
# Build metadata (like version information and icons)
dub build --config=update-version
- name: 'Build (OSX Universal)'
if: ${{ matrix.config.platform == 'osx' }}
id: osx-build
run: |
dub build --config=meta
# First build ARM64 version...
echo "Building arm64 binary..."
dub build --build=${{ inputs.build_type }} --compiler=ldc2 --config=${{ matrix.config.platform }}-${{ inputs.variant }} --arch=arm64-apple-macos
mv "out/Inochi Session.app/Contents/MacOS/inochi-session" "out/Inochi Session.app/Contents/MacOS/inochi-session-arm64"
# Then the X86_64 version...
echo "Building x86_64 binary..."
dub build --build=${{ inputs.build_type }} --compiler=ldc2 --config=${{ matrix.config.platform }}-${{ inputs.variant }} --arch=x86_64-apple-macos
mv "out/Inochi Session.app/Contents/MacOS/inochi-session" "out/Inochi Session.app/Contents/MacOS/inochi-session-x86_64"
# Glue them together with lipo
echo "Gluing them together..."
lipo "out/Inochi Session.app/Contents/MacOS/inochi-session-x86_64" "out/Inochi Session.app/Contents/MacOS/inochi-session-arm64" -output "out/Inochi Session.app/Contents/MacOS/inochi-session" -create
# Cleanup
echo "Cleaning up..."
rm "out/Inochi Session.app/Contents/MacOS/inochi-session-x86_64" "out/Inochi Session.app/Contents/MacOS/inochi-session-arm64"
# Bundle
echo "Bundling up to app"
./build-aux/osx/osxbundle.sh
- name: 'Build (Windows)'
if: ${{ matrix.config.platform == 'win32' }}
id: win32-build
shell: powershell
run: |
.\vcvars.ps1
dub build --config=meta
dub build --build=${{ inputs.build_type }} --compiler=ldc2 --config=${{ matrix.config.platform }}-${{ inputs.variant }}
- name: 'Build (Linux)'
if: ${{ matrix.config.platform == 'linux' }}
id: posix-build
run: |
dub build --config=meta
dub build --build=${{ inputs.build_type }} --compiler=ldc2 --config=${{ matrix.config.platform }}-${{ inputs.variant }}
# TODO: Add signing workflow.
# - name: 'Select latest XCode (OSX)'
# if: ${{ startsWith(matrix.config.os, 'macos') }}
# uses: BoundfoxStudios/action-xcode-select@v1
# - name: 'Sign and Notarize (OSX)'
# if: ${{ startsWith(matrix.config.os, 'macos') }}
# uses: BoundfoxStudios/action-xcode-notarize@v1.1
# with:
# product-path: 'out/Inochi Session.app'
- name: 'Make Artifact (Main)'
uses: actions/upload-artifact@v4
with:
name: build-${{ matrix.config.platform }}${{ inputs.postfix }}
path: |
out/*
version.txt
retention-days: 1
- name: Archive Zip
uses: thedoctor0/zip-release@main
with:
type: 'zip'
filename: 'inochi-session-${{ matrix.config.platform }}.zip'
directory: 'out/'
path: '*'
- name: 'Make Artifact (ZIP)'
uses: actions/upload-artifact@v4
with:
name: build-${{ matrix.config.platform }}-zip${{ inputs.postfix }}
path: |
out/inochi-session-${{ matrix.config.platform }}.zip
version.txt
retention-days: 1
package-dmg:
if: ${{ inputs.do_package == true }}
needs: build
runs-on: macos-14
steps:
- uses: actions/checkout@v4.1.7
with:
sparse-checkout:
build-aux
- uses: actions/download-artifact@v4
with:
name: build-osx${{ inputs.postfix }}
- name: 'Install create-dmg...'
run: |
brew update
brew install create-dmg
- name: 'Build DMG'
run: |
./build-aux/osx/gendmg.sh
- name: Make Artifact
uses: actions/upload-artifact@v4
with:
name: build-osx-dmg${{ inputs.postfix }}
path: |
out/Install_Inochi_Session.dmg
version.txt
overwrite: true
retention-days: 1
================================================
FILE: .github/workflows/pr-test.yml
================================================
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
name: Pull Request Test
on:
pull_request:
branches: [ "main" ]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v4.1.7
- uses: dlang-community/setup-dlang@4c99aa991ce7d19dd3064de0a4f2f6b2f152e2d7
with:
compiler: ldc-latest
- name: "Get build dependencies"
run: |
sudo apt install libsdl2-dev libfreetype6-dev
- name: "Clone dependencies & set versions"
run: |
git clone https://github.com/Inochi2D/i2d-imgui.git --recurse-submodules
git clone https://github.com/Inochi2D/inochi2d.git
dub add-local i2d-imgui/ "0.8.0"
dub add-local inochi2d/ "0.8.5"
- name: 'Build'
run: |
# Build metadata (like version information and icons)
dub build --config=meta
# Build the project, with its main file included, without unittests
dub build --compiler=ldc2 --build=release --config=linux-full
- name: 'Test'
run: |
dub test --compiler=ldc2 --config=linux-full
- name: "Upload Artifacts"
if: success()
uses: actions/upload-artifact@v3
with:
name: inochi-session
path: out/inochi-session
================================================
FILE: .github/workflows/publish-gh.yml
================================================
name: 'Publish to GitHub'
permissions:
contents: write
on:
workflow_call:
inputs:
tag:
required: false
type: string
default: ${{ github.ref_name }}
name:
required: false
type: string
default: ''
generate-notes:
required: false
type: boolean
default: false
postfix:
required: false
type: string
default: ''
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/download-artifact@v4
with:
pattern: '*${{ inputs.postfix }}'
merge-multiple: true
- name: 'Release to ${{ inputs.tag }}'
uses: softprops/action-gh-release@v2
with:
name: '${{ inputs.name }}'
tag_name: ${{ inputs.tag }}
files: |
out/inochi-session-linux.zip
out/inochi-session-win32.zip
out/inochi-session-osx.zip
out/Install_Inochi_Session.dmg
generate_release_notes: ${{ inputs.generate-notes }}
================================================
FILE: .github/workflows/publish-itch.yml
================================================
name: 'Publish to itch.io'
on:
workflow_call:
inputs:
postfix:
required: false
type: string
default: ''
jobs:
publish:
continue-on-error: true
name: 'Publish'
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
config:
- name: "Windows (ZIP)"
channel: 'windows'
artifact: 'build-win32-zip${{ inputs.postfix }}'
file: 'inochi-session-win32.zip'
- name: "macOS (ZIP)"
channel: 'osx'
artifact: 'build-osx-zip${{ inputs.postfix }}'
file: 'inochi-session-osx.zip'
- name: "macOS (DMG)"
channel: 'osx-dmg'
artifact: 'build-osx-dmg${{ inputs.postfix }}'
file: 'Install_Inochi_Session.dmg'
- name: "Linux"
channel: 'linux'
artifact: 'build-linux-zip${{ inputs.postfix }}'
file: 'inochi-session-linux.zip'
steps:
- name: 'Download ${{ matrix.config.artifact }}...'
uses: actions/download-artifact@v4
with:
name: '${{ matrix.config.artifact }}'
- name: 'Publishing ${{ matrix.config.name }} to Itch...'
uses: manleydev/butler-publish-itchio-action@master
env:
BUTLER_CREDENTIALS: ${{ secrets.BUTLER_CREDENTIALS }}
CHANNEL: ${{ matrix.config.channel }}
ITCH_GAME: inochi-session
ITCH_USER: kitsunebi-games
VERSION_FILE: version.txt
PACKAGE: 'out/${{ matrix.config.file }}'
================================================
FILE: .github/workflows/release-nightly.yml
================================================
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
name: Build and Release (Nightly)
on:
schedule:
- cron: '0 0 * * *'
workflow_dispatch:
permissions:
contents: write
jobs:
build:
uses: './.github/workflows/build.yml'
with:
variant: 'nightly'
generate_version: true
do_package: true
fail_fast: false
gh-publish:
needs: build
uses: './.github/workflows/publish-gh.yml'
secrets: inherit
with:
tag: 'nightly'
name: 'Nightly'
generate-notes: true
# Delete artifacts after use.
cleanup:
if: 'always()'
runs-on: ubuntu-latest
needs: [gh-publish]
steps:
- uses: GeekyEggo/delete-artifact@v5
with:
name: |
*
================================================
FILE: .github/workflows/release.yml
================================================
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
name: Build and Release
on:
push:
# Push all normally versioned tags
tags:
- 'v*'
permissions:
contents: write
jobs:
# Full Release
# This needs "gh-publish-demo" due to the fact that
# we need to overwrite the artifacts related.
build:
if: ${{ ! contains(github.ref_name, 'rc') }}
uses: './.github/workflows/build.yml'
with:
target_ref: '${{ github.ref_name }}'
variant: 'full'
generate_version: true
do_package: true
itch-publish:
needs: build
uses: './.github/workflows/publish-itch.yml'
secrets: inherit
gh-publish:
needs: build
uses: './.github/workflows/publish-gh.yml'
secrets: inherit
# Delete artifacts after use.
cleanup:
if: 'always()'
runs-on: ubuntu-latest
needs: [itch-publish, gh-publish]
steps:
- uses: GeekyEggo/delete-artifact@v5
with:
name: |
*
================================================
FILE: .gitignore
================================================
.dub
docs.json
__dummy.html
docs/
*.exe
*.pdb
*.o
*.obj
*.lst
*.res
out/
dub.selections.json
__dummy_docs/
# Redub Junk
.ldc2_cache
# Other Junk
.DS_Store
.vscode/
================================================
FILE: LICENSE
================================================
BSD 2-Clause License
Copyright (c) 2020, Inochi2D Project
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
================================================
FILE: README.md
================================================
# Inochi Session

_[Aka (example model)](https://github.com/Inochi2D/example-models#aka) by [seagetch](https://twitter.com/seagetch)_
*Inochi Session is the official tool for using Inochi2D puppets for VTubing.*
This application is currently under heavy development and isn't ready for production just yet.
================================================
FILE: build-aux/linux/inochi-session.appdata.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop">
<id>inochi-session</id>
<launchable type="desktop-id">inochi-session.desktop</launchable>
<name>Inochi Session</name>
<metadata_license>CC0-1.0</metadata_license>
<project_license>BSD-2-Clause</project_license>
<summary>Tool for using Inochi2D puppets for streaming.</summary>
<description>
<p>
Inochi2D is a framework for realtime 2D puppet animation which can be used for VTubing,
game development and digital animation.
</p>
<p>
Inochi Session is a tool that lets you use your Inochi2D models for live streaming.
</p>
</description>
<url type="homepage">https://inochi2d.com</url>
<url type="help">https://github.com/Inochi2D/inochi-session</url>
<url type="bugtracker">https://github.com/Inochi2D/inochi-session/issues</url>
<screenshots>
<screenshot type="default">
<caption>Title screen</caption>
<image>https://user-images.githubusercontent.com/7032834/181119161-f83e8e57-2f9e-409f-90bd-1b1b9c047bcc.png</image>
</screenshot>
</screenshots>
<categories>
<category>Graphics</category>
</categories>
</component>
================================================
FILE: build-aux/linux/inochi-session.desktop
================================================
[Desktop Entry]
Name=inochi-session
Exec=inochi-session
Icon=icon_x256
Type=Application
Categories=Utility
================================================
FILE: build-aux/osx/BuildUniversal.sh
================================================
# First build ARM64 version...
echo "Building arm64 binary..."
dub build --build=release --config=osx-full --arch=arm64-apple-macos
mv "out/Inochi Session.app/Contents/MacOS/inochi-session" "out/Inochi Session.app/Contents/MacOS/inochi-session-arm64"
# Then the X86_64 version...
echo "Building x86_64 binary..."
dub build --build=release --config=osx-full --arch=x86_64-apple-macos
mv "out/Inochi Session.app/Contents/MacOS/inochi-session" "out/Inochi Session.app/Contents/MacOS/inochi-session-x86_64"
# Glue them together with lipo
echo "Gluing them together..."
lipo "out/Inochi Session.app/Contents/MacOS/inochi-session-x86_64" "out/Inochi Session.app/Contents/MacOS/inochi-session-arm64" -output "out/Inochi Session.app/Contents/MacOS/inochi-session" -create
# Print some nice info
echo "Done!"
lipo -info "out/Inochi Session.app/Contents/MacOS/inochi-session"
# Cleanup and bundle
echo "Cleaning up..."
rm "out/Inochi Session.app/Contents/MacOS/inochi-session-x86_64" "out/Inochi Session.app/Contents/MacOS/inochi-session-arm64"
./osxbundle.sh
================================================
FILE: build-aux/osx/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleName</key>
<string>Inochi Session</string>
<key>CFBundleDisplayName</key>
<string>Inochi Session</string>
<key>CFBundleIdentifier</key>
<string>com.inochi2d.inochi-session</string>
<key>CFBundleVersion</key>
<string>0.7.4</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>inoc</string>
<key>CFBundleExecutable</key>
<string>inochi-session</string>
<key>CFBundleIconFile</key>
<string>InochiSession</string>
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeIconFile</key>
<string>project.icns</string>
<key>CFBundleTypeName</key>
<string>Inochi2D Puppet</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSItemContentTypes</key>
<array>
<string>com.inochi2d.inochi2d.puppet</string>
</array>
</dict>
</array>
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeIdentifier</key>
<string>com.inochi2d.inochi2d.puppet</string>
<key>UTTypeReferenceURL</key>
<string>https://github.com/Inochi2D/inochi2d/wiki/INP-Data-Interchange-Format</string>
<key>UTTypeDescription</key>
<string>Inochi2D Puppet</string>
<key>UTTypeIconFile</key>
<string>puppet.icns</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>inp</string>
</array>
</dict>
</dict>
</array>
</dict>
</plist>
================================================
FILE: build-aux/osx/gendmg.sh
================================================
DMGTITLE="Install Inochi Session"
DMGFILENAME="Install_Inochi_Session.dmg"
if [ -d "out/Inochi Session.app" ]; then
if [ -f "out/$DMGFILENAME" ]; then
echo "Removing prior install dmg..."
rm "out/$DMGFILENAME"
fi
PREVPWD=$PWD
cd out/
echo "Building $DMGFILENAME..."
# Create Install Volume directory
if [ -d "InstallVolume" ]; then
echo "Cleaning up old install volume..."
rm -r InstallVolume
fi
mkdir -p InstallVolume
cp ../LICENSE LICENSE
cp -r "Inochi Session.app" "InstallVolume/Inochi Session.app"
# Downloaded artifact removes executable flag.
chmod +x "InstallVolume/Inochi Session.app/Contents/MacOS/inochi-session"
create-dmg \
--volname "$DMGTITLE" \
--volicon "InochiSession.icns" \
--background "../build-aux/osx/dmgbg.png" \
--window-size 800 600 \
--icon "Inochi Session.app" 200 250 \
--hide-extension "Inochi Session.app" \
--eula "LICENSE" \
--app-drop-link 600 250 \
"$DMGFILENAME" InstallVolume/
echo "Done! Cleaning up temporaries..."
rm LICENSE
echo "DMG generated as $PWD/$DMGFILENAME"
cd $PREVPWD
else
echo "Could not find Inochi Session for packaging..."
fi
================================================
FILE: build-aux/osx/osxbundle.sh
================================================
echo "Creating directory structure..."
LASTPWD=$PWD
# Handle copying all the dylibs to their respective directories
# As well handle creating our directory structure
cd out/Inochi\ Session.app/Contents
# Remove old files
if [ -d "Frameworks" ]; then
echo "Removing files from prior bundle..."
rm -r Frameworks SharedSupport Resources
rm Info.plist
fi
# Create new directories and move dylibs
mkdir -p Frameworks SharedSupport Resources Resources/i18n
mv MacOS/libSDL2-2.0.dylib Frameworks/libSDL2.dylib
mv -n MacOS/*.dylib Frameworks
# Move back to where we were
cd $LASTPWD
echo "Setting up file structure..."
# Copy info plist and icon
cp build-aux/osx/Info.plist out/Inochi\ Session.app/Contents/
# Move any translation files in if any.
mv -n out/*.mo out/Inochi\ Session.app/Contents/Resources/i18n/
# Copy license info to SharedSupport
cp res/licenses/*-LICENSE out/Inochi\ Session.app/Contents/SharedSupport/
cp LICENSE out/Inochi\ Session.app/Contents/SharedSupport/LICENSE
# Create icons dir
# TODO: check if dir exists, skip this step if it does
if [ ! -d "out/InochiCreator.icns" ]; then
iconutil -c icns -o out/InochiSession.icns build-aux/osx/Inochi-Session.iconset
else
echo "Icons already exist, skipping..."
fi
echo "Applying Icon..."
cp out/InochiSession.icns out/Inochi\ Session.app/Contents/Resources/InochiSession.icns
echo "Cleaning up..."
find out/Inochi\ Session.app/Contents/MacOS -type f ! -name "inochi-session" -delete
echo "Done!"
================================================
FILE: build-aux/windows/inochi-session.rc
================================================
#include <windows.h>
#include "version.h"
IDI_ICON1 ICON "icon.ico"
VS_VERSION_INFO VERSIONINFO
FILEVERSION VER_FILEVERSION
PRODUCTVERSION VER_PRODUCTVERSION
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904E4"
BEGIN
VALUE "CompanyName", VER_COMPANYNAME_STR
VALUE "FileDescription", VER_FILEDESCRIPTION_STR
VALUE "FileVersion", VER_FILEVERSION_STR
VALUE "InternalName", VER_INTERNALNAME_STR
VALUE "LegalCopyright", VER_LEGALCOPYRIGHT_STR
VALUE "OriginalFilename", VER_ORIGINALFILENAME_STR
VALUE "ProductName", VER_PRODUCTNAME_STR
VALUE "ProductVersion", VER_PRODUCTVERSION_STR
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1252
END
END
================================================
FILE: build-aux/windows/version.h
================================================
#ifndef VERSION_H
#define VERSION_H
#define VER_FILEVERSION 0,8,1,0
#define VER_FILEVERSION_STR "0.8.1\0"
#define VER_PRODUCTVERSION 0,8,1,0
#define VER_PRODUCTVERSION_STR "0.8.1\0"
#define VER_COMPANYNAME_STR "Inochi2D Project"
#define VER_FILEDESCRIPTION_STR "Inochi Session"
#define VER_INTERNALNAME_STR "inochi-session"
#define VER_LEGALCOPYRIGHT_STR "Copyright © 2022-2023 Inochi2D Project"
#define VER_ORIGINALFILENAME_STR "inochi-session.exe"
#define VER_PRODUCTNAME_STR "Inochi Session"
#define VER_COMPANYDOMAIN_STR "inochi2d.com"
#endif // VERSION_H
================================================
FILE: dub.sdl
================================================
name "inochi-session"
description "App that allows you to stream with Inochi2D puppets"
authors "Inochi2D Project"
copyright "Copyright © 2021, Inochi2D Project"
license "BSD 2-clause"
dependency "facetrack-d" version="~>0.8.0"
dependency "lumars" version="~>1.6.1"
dependency "inochi2d" path="../inochi2d"
dependency "inui" path="../inui"
targetPath "out/"
workingDirectory "out/"
copyFiles "res/licenses/*"
dflags "-mscrtlib=msvcrt" platform="windows-ldc"
lflags "-rpath=$$ORIGIN" platform="linux"
buildRequirements "allowWarnings"
stringImportPaths "res"
// Uncomment following lines to enable JINS MEME Logger module.
//versions "JML"
//subConfiguration "facetrack-d" "jml"
//
// CONFIGURATIONS
//
configuration "barebones" {
platforms "linux"
targetType "executable"
}
// Official build configurations.
// Do not package your compilation of Inochi Creator with these configurations
// unless you have prior permission from the Inochi2D project.
configuration "linux-full" {
platforms "linux"
targetType "executable"
versions "InBranding"
}
configuration "osx-full" {
platforms "osx"
targetType "executable"
targetPath "out/Inochi Session.app/Contents/MacOS"
versions "InBranding"
subConfiguration "i2d-imgui" "dynamic_dynamicCRT"
lflags "-rpath" "@executable_path/../Frameworks" "-rpath" "@executable_path/."
}
configuration "win32-full" {
platforms "windows"
targetType "executable"
versions "InBranding"
dependency "bindbc-spout2" version="~>0.1.1"
lflags "/SUBSYSTEM:windows" "/ENTRY:mainCRTStartup" platform="window-dmd"
sourceFiles "build-aux\\windows\\inochi-session.res"
}
// Linux nightly build
configuration "linux-nightly" {
platforms "linux"
targetType "executable"
subConfiguration "i2d-imgui" "static_dynamicCRT"
versions "InNightly"
dependency "dportals" version="~>0.1.0"
}
// macOS nightly build
configuration "osx-nightly" {
platforms "osx"
targetType "executable"
targetPath "out/Inochi Session.app/Contents/MacOS"
subConfiguration "i2d-imgui" "dynamic_dynamicCRT"
dflags "-force-dwarf-frame-section=false"
lflags "-rpath" "@executable_path/../Frameworks" "-rpath" "@executable_path/."
versions "InNightly"
}
// Windows nightly build
configuration "win32-nightly" {
platforms "windows"
targetType "executable"
versions "InBranding" "InNightly"
dependency "bindbc-spout2" version="~>0.1.1"
lflags "/SUBSYSTEM:windows" "/ENTRY:mainCRTStartup" platform="window-dmd"
sourceFiles "build-aux\\windows\\inochi-session.res"
}
// Meta configurations
configuration "update-version" {
targetType "none"
preGenerateCommands "dub run gitver -- --prefix INS --file source/session/ver.d --mod session.ver --appname \"Inochi Session\" --itchfile res/version.txt"
}
configuration "meta" {
targetType "none"
preGenerateCommands "rc.exe /v build-aux\\windows\\inochi-session.rc" platform="windows"
}
================================================
FILE: genpot.sh
================================================
#!/bin/sh
find . -iname "*.d" | xargs xgettext --from-code=UTF-8 -o tl/template.pot -c --keyword=_ --keyword=__
================================================
FILE: gentl.sh
================================================
mkdir -p out/
if [ -n `$(find tl/ -name "*.po" 2>/dev/null)` ]
then
echo "No translations, skipping..."
else
for f in tl/*.po; do
msgfmt -o "out/$(basename -- "$f" .po).mo" -- "$f"
done
fi
================================================
FILE: imgui.ini
================================================
[Window][WindowOverViewport_11111111]
Pos=0,0
Size=1065,754
Collapsed=0
[Window][Debug##Default]
Pos=60,60
Size=400,400
Collapsed=0
[Docking][Data]
DockSpace ID=0x08BD597D Window=0x1BBC0F80 Pos=0,0 Size=1065,754 CentralNode=1 Selected=0xA9D0F322
================================================
FILE: res/licenses/LICENSE-FreeType
================================================
The FreeType Project LICENSE
----------------------------
2006-Jan-27
Copyright 1996-2002, 2006 by
David Turner, Robert Wilhelm, and Werner Lemberg
Introduction
============
The FreeType Project is distributed in several archive packages;
some of them may contain, in addition to the FreeType font engine,
various tools and contributions which rely on, or relate to, the
FreeType Project.
This license applies to all files found in such packages, and
which do not fall under their own explicit license. The license
affects thus the FreeType font engine, the test programs,
documentation and makefiles, at the very least.
This license was inspired by the BSD, Artistic, and IJG
(Independent JPEG Group) licenses, which all encourage inclusion
and use of free software in commercial and freeware products
alike. As a consequence, its main points are that:
o We don't promise that this software works. However, we will be
interested in any kind of bug reports. (`as is' distribution)
o You can use this software for whatever you want, in parts or
full form, without having to pay us. (`royalty-free' usage)
o You may not pretend that you wrote this software. If you use
it, or only parts of it, in a program, you must acknowledge
somewhere in your documentation that you have used the
FreeType code. (`credits')
We specifically permit and encourage the inclusion of this
software, with or without modifications, in commercial products.
We disclaim all warranties covering The FreeType Project and
assume no liability related to The FreeType Project.
Finally, many people asked us for a preferred form for a
credit/disclaimer to use in compliance with this license. We thus
encourage you to use the following text:
"""
Portions of this software are copyright © <year> The FreeType
Project (www.freetype.org). All rights reserved.
"""
Please replace <year> with the value from the FreeType version you
actually use.
Legal Terms
===========
0. Definitions
--------------
Throughout this license, the terms `package', `FreeType Project',
and `FreeType archive' refer to the set of files originally
distributed by the authors (David Turner, Robert Wilhelm, and
Werner Lemberg) as the `FreeType Project', be they named as alpha,
beta or final release.
`You' refers to the licensee, or person using the project, where
`using' is a generic term including compiling the project's source
code as well as linking it to form a `program' or `executable'.
This program is referred to as `a program using the FreeType
engine'.
This license applies to all files distributed in the original
FreeType Project, including all source code, binaries and
documentation, unless otherwise stated in the file in its
original, unmodified form as distributed in the original archive.
If you are unsure whether or not a particular file is covered by
this license, you must contact us to verify this.
The FreeType Project is copyright (C) 1996-2000 by David Turner,
Robert Wilhelm, and Werner Lemberg. All rights reserved except as
specified below.
1. No Warranty
--------------
THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS
BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO
USE, OF THE FREETYPE PROJECT.
2. Redistribution
-----------------
This license grants a worldwide, royalty-free, perpetual and
irrevocable right and license to use, execute, perform, compile,
display, copy, create derivative works of, distribute and
sublicense the FreeType Project (in both source and object code
forms) and derivative works thereof for any purpose; and to
authorize others to exercise some or all of the rights granted
herein, subject to the following conditions:
o Redistribution of source code must retain this license file
(`FTL.TXT') unaltered; any additions, deletions or changes to
the original files must be clearly indicated in accompanying
documentation. The copyright notices of the unaltered,
original files must be preserved in all copies of source
files.
o Redistribution in binary form must provide a disclaimer that
states that the software is based in part of the work of the
FreeType Team, in the distribution documentation. We also
encourage you to put an URL to the FreeType web page in your
documentation, though this isn't mandatory.
These conditions apply to any software derived from or based on
the FreeType Project, not just the unmodified files. If you use
our work, you must acknowledge us. However, no fee need be paid
to us.
3. Advertising
--------------
Neither the FreeType authors and contributors nor you shall use
the name of the other for commercial, advertising, or promotional
purposes without specific prior written permission.
We suggest, but do not require, that you use one or more of the
following phrases to refer to this software in your documentation
or advertising materials: `FreeType Project', `FreeType Engine',
`FreeType library', or `FreeType Distribution'.
As you have not signed this license, you are not required to
accept it. However, as the FreeType Project is copyrighted
material, only this license, or another one contracted with the
authors, grants you the right to use, distribute, and modify it.
Therefore, by using, distributing, or modifying the FreeType
Project, you indicate that you understand and accept all the terms
of this license.
4. Contacts
-----------
There are two mailing lists related to FreeType:
o freetype@nongnu.org
Discusses general use and applications of FreeType, as well as
future and wanted additions to the library and distribution.
If you are looking for support, start in this list if you
haven't found anything to help you in the documentation.
o freetype-devel@nongnu.org
Discusses bugs, as well as engine internals, design issues,
specific licenses, porting, etc.
Our home page can be found at
https://www.freetype.org
--- end of FTL.TXT ---
================================================
FILE: res/licenses/LICENSE-Lua
================================================
Copyright © 1994–2021 Lua.org, PUC-Rio.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
================================================
FILE: res/licenses/LICENSE-Spout2
================================================
BSD 2-Clause License
Copyright (c) 2020, Lynn Jarvis
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
================================================
FILE: res/licenses/LICENSE-imgui
================================================
The MIT License (MIT)
Copyright (c) 2014-2022 Omar Cornut
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: res/shaders/batch.frag
================================================
#version 330
in vec2 texUVs;
in vec4 exColor;
layout(location = 0) out vec4 outAlbedo;
layout(location = 1) out vec4 outEmission;
layout(location = 2) out vec4 outBump;
uniform sampler2D tex;
void main() {
vec2 texSize = vec2(textureSize(tex, 0));
outAlbedo = texture(tex, texUVs/texSize) * exColor;
outEmission = texture(tex, texUVs/texSize) * 0.5;
outBump = vec4(0.5, 0.5, 1, 1);
}
================================================
FILE: res/shaders/batch.vert
================================================
#version 330
uniform mat4 vp;
layout(location = 0) in vec2 verts;
layout(location = 1) in vec2 uvs;
layout(location = 2) in vec4 color;
out vec2 texUVs;
out vec4 exColor;
void main() {
gl_Position = vp * vec4(verts.x, verts.y, 0, 1);
texUVs = uvs;
exColor = color;
}
================================================
FILE: res/style.css
================================================
.scene {
width: 100%;
height: 100%;
}
================================================
FILE: res/version.txt
================================================
0.8.7
================================================
FILE: source/app.d
================================================
module app;
import session;
import inui;
void main(string[] args) {
AppInfo info = {
name: "Inochi Session",
author: "Inochi2D Project",
id: "com.inochi2d.inochi-session",
version_: import("version.txt"),
};
Application app = new Application(info);
app.stylesheet = StyleSheet.parse(import("style.css"));
Window window = (new Window(app.appInfo.name, 640, 480))
.resizable(true)
.vibrancy(SystemVibrancy.vivid);
window.view.addWidget(new Scene());
app.run(window, args);
}
================================================
FILE: source/inochi2d/nio/puppet.d
================================================
module inochi2d.nio.puppet;
import inochi2d;
import niobium;
import numem;
import nulib.collections;
import nulib.math : min, max;
/**
A niobium renderered puppet.
*/
class NioPuppet : NuRefCounted {
private:
@nogc:
// Puppet info
Puppet puppet_;
// Render handles
NioDevice device_;
NioBuffer vtx_;
NioBuffer idx_;
NioTexture[] tex_;
// Creates the puppet and its associated buffers.
void createPuppet(string file) {
this.puppet_ = assumeNoThrowNoGC(&ins_puppet_load_pinned, file);
this.tex_ = nu_malloca!NioTexture(puppet_.textureCache.cache.length);
foreach(i, ref Texture texture; puppet_.textureCache.cache) {
tex_[i] = device_.createTexture(NioTextureDescriptor(
type: NioTextureType.type2D,
format: NioPixelFormat.rgba8UnormSRGB,
storage: NioStorageMode.privateStorage,
usage: NioTextureUsage.transfer | NioTextureUsage.sampled,
width: texture.width,
height: texture.height,
)).upload(NioRegion3D(0, 0, 0, texture.width, texture.height, 1), 0, 0, texture.pixels, 0);
}
// NOTE: We create the initial buffers here,
// the buffer sizes are not known until an update
// has occured, so we do a 0 ms update.
assumeNoThrowNoGC(&ins_puppet_update_pinned, puppet_, 0);
size_t vtxSize = puppet.drawList.vertices.length * VtxData.sizeof;
size_t idxSize = puppet.drawList.indices.length * uint.sizeof;
vtx_ = device_.createBuffer(NioBufferDescriptor(
storage: NioStorageMode.privateStorage,
usage: NioBufferUsage.transfer | NioBufferUsage.vertexBuffer,
size: cast(uint)vtxSize
));
idx_ = device_.createBuffer(NioBufferDescriptor(
storage: NioStorageMode.privateStorage,
usage: NioBufferUsage.transfer | NioBufferUsage.indexBuffer,
size: cast(uint)idxSize
));
}
// Resizes the vertex and index buffers.
void resizeBuffers() {
size_t vtxSize = puppet.drawList.vertices.length * VtxData.sizeof;
size_t idxSize = puppet.drawList.indices.length * uint.sizeof;
if (vtxSize > vtx_.size) {
vtx_.release();
vtx_ = device_.createBuffer(NioBufferDescriptor(
storage: NioStorageMode.privateStorage,
usage: NioBufferUsage.transfer | NioBufferUsage.vertexBuffer,
size: cast(uint)vtxSize
));
}
if (idxSize > idx_.size) {
idx_.release();
idx_ = device_.createBuffer(NioBufferDescriptor(
storage: NioStorageMode.privateStorage,
usage: NioBufferUsage.transfer | NioBufferUsage.indexBuffer,
size: cast(uint)idxSize
));
}
}
public:
/**
The underlying Inochi2D Puppet
*/
@property Puppet puppet() => puppet_;
/**
The loaded textures of the puppet.
*/
@property NioTexture[] textures() => tex_;
/**
Vertex data of the puppet.
*/
@property VtxData[] vertices() => puppet.drawList.vertices;
/**
The puppet's vertex buffer.
*/
@property NioBuffer vertexBuffer() => vtx_;
/**
Index data of the puppet.
*/
@property uint[] indices() => puppet.drawList.indices;
/**
The puppet's index buffer.
*/
@property NioBuffer indexBuffer() => idx_;
/**
Draw commands of the puppet.
*/
@property DrawCmd[] commands() => puppet.drawList.commands;
/**
Total size of the puppet's buffers.
*/
@property size_t totalBufferSize() => vtx_.size + idx_.size;
// Destructor
~this() {
assumeNoThrowNoGC(&ins_puppet_unload_pinned, puppet);
if (vtx_) vtx_.release();
if (idx_) idx_.release();
foreach(ref NioTexture texture; tex_)
texture.release();
nu_freea(tex_);
}
/**
Loads a puppet.
*/
this(NioDevice device, string file) {
this.device_ = device;
this.createPuppet(file);
}
/**
Updates the puppet and resizes vertex and index buffers if needed.
Params:
delta = Time since last frame.
*/
void update(float delta) {
assumeNoThrowNoGC(&ins_puppet_update_pinned, puppet_, delta);
this.resizeBuffers();
}
}
private:
extern(C) void ins_puppet_update_pinned(Puppet puppet, float delta) {
puppet.update(delta);
puppet.draw(delta);
}
extern(C) Puppet ins_puppet_load_pinned(string file) {
import core.memory : GC;
auto puppet_ = inLoadPuppet(file);
GC.addRoot(cast(void*)puppet_);
return puppet_;
}
extern(C) void ins_puppet_unload_pinned(Puppet puppet) {
import core.memory : GC;
GC.removeRoot(cast(void*)puppet);
}
================================================
FILE: source/inochi2d/nio/scene.d
================================================
module inochi2d.nio.scene;
import inochi2d.nio.staging;
import inochi2d.nio.puppet;
import inochi2d;
import niobium;
import numem;
import nulib.collections;
import nulib.math : min, max;
/**
An Inochi2D Scene hosted by Niobium.
*/
class NioScene {
private:
@nogc:
NioDevice device_;
NioCommandQueue queue_;
weak_vector!NioPuppet puppets_;
/// Render state
NioStagingBuffer staging_;
NioTexture maskTarget_;
NioTexture[6][] renderTargets_;
/// Updates the puppets and their vertex data.
void updatePuppets(NioCommandBuffer cmdbuffer, float delta) {
// 1. Update the staging buffer's size.
size_t totalBufferSize = 0;
foreach(ref NioPuppet puppet; puppets_[]) {
puppet.update(delta);
totalBufferSize += puppet.totalBufferSize;
}
if (totalBufferSize > staging_.size)
staging_.resize(totalBufferSize);
// Then fill the staging buffer and enqueue transfer commands.
auto cmds = cmdbuffer.beginTransferPass();
cmds.insertBarrier(NioPipelineStage.transfer, NioPipelineStage.all);
size_t vtxStart = 0;
foreach(i, ref NioPuppet puppet; puppets_[]) {
size_t vtxEnd = staging_.upload(vtxStart, cast(void[])puppet.vertices);
size_t idxEnd = staging_.upload(vtxEnd, cast(void[])puppet.indices);
cmds.copy(
NioBufferSrcInfo(
buffer: staging_.buffer,
offset: cast(uint)vtxStart,
length: cast(uint)(vtxEnd-vtxStart)
),
NioBufferDstInfo(
buffer: puppet.vertexBuffer,
offset: 0,
)
);
cmds.copy(
NioBufferSrcInfo(
buffer: staging_.buffer,
offset: cast(uint)vtxEnd,
length: cast(uint)(idxEnd-vtxEnd)
),
NioBufferDstInfo(
buffer: puppet.indexBuffer,
offset: 0,
)
);
vtxStart = idxEnd;
}
cmds.endEncoding();
}
/// Function which draws an individual puppet into the scene.
void drawPuppet(NioPuppet puppet) {
}
public:
/**
The Niobium device being used to render the scene.
*/
@property NioDevice device() => device_;
/// Destructor
~this() {
queue_.release();
staging_.release();
}
/// Constructor
this(NioDevice device) {
this.device_ = device;
this.queue_ = device.createQueue(NioCommandQueueDescriptor(32));
this.staging_ = nogc_new!NioStagingBuffer(device_);
}
/**
Updates all of the puppets currently active in this scene,
preparing all the puppets for rendering a frame.
Params:
delta = The time since the last frame.
*/
void update(float delta) {
NioCommandBuffer cmdbuffer = queue_.fetch();
this.updatePuppets(cmdbuffer, delta);
foreach(ref NioPuppet puppet; puppets_) {
this.drawPuppet(puppet);
}
queue_.commit(cmdbuffer);
cmdbuffer.await();
cmdbuffer.release();
}
/**
Blits the scene to the given target texture.
Notes:
This can be called multiple times with minimal overhead,
as the internal drawing is done in $(D update).
Params:
target = The target to render the scene to.
*/
void blit(NioTexture target) {
}
}
================================================
FILE: source/inochi2d/nio/staging.d
================================================
module inochi2d.nio.staging;
import nulib.collections;
import niobium;
import numem;
/**
A managed staging buffer.
*/
class NioStagingBuffer : NuRefCounted {
private:
@nogc:
NioDevice device_;
NioBuffer buffer_;
size_t alignment_;
/// Creates initial 32 mb buffer.
void createBuffer() {
buffer_ = device_.createBuffer(NioBufferDescriptor(
storage: NioStorageMode.sharedStorage,
usage: NioBufferUsage.transfer,
size: 33_554_432
));
}
public:
/**
The underlying staging buffer.
*/
@property NioBuffer buffer() => buffer_;
/**
Alignment of allocations in the buffer.
*/
@property size_t alignment() => alignment_;
/**
Size of the buffer.
*/
@property size_t size() => buffer_.size();
// Destructor
~this() {
buffer_.release();
}
/**
Creates a new managed staging buffer.
Params:
device = The device that owns the staging buffer.
alignment = The increments that the staging buffer will grow.
*/
this(NioDevice device, size_t alignment = 33_554_432) {
this.device_ = device;
this.alignment_ = alignment;
this.createBuffer();
}
/**
Resizes the buffer.
Params:
newSize = The new size to request from the memory pool.
Notes:
The size will be aligned to $(D alignment).
*/
void resize(size_t newSize) {
if (newSize > buffer_.size) {
buffer_ = device_.createBuffer(NioBufferDescriptor(
storage: NioStorageMode.sharedStorage,
usage: NioBufferUsage.transfer,
size: cast(uint)nu_alignup(newSize, alignment_)
));
}
}
/**
Uploads data to the buffer at the given offset.
Params:
offset = Offset into the staging buffer to upload to.
data = The data to upload.
Returns:
The ending offset of the upload.
*/
ptrdiff_t upload(size_t offset, void[] data) {
if (offset+data.length > this.size)
return -1;
if (auto mapped = buffer_.map()) {
mapped[offset..offset+data.length] = data[0..$];
buffer_.unmap();
}
return offset+data.length;
}
}
================================================
FILE: source/session/package.d
================================================
module session;
public import session.widgets;
================================================
FILE: source/session/widgets/package.d
================================================
module session.widgets;
public import session.widgets.scene;
================================================
FILE: source/session/widgets/scene.d
================================================
module session.widgets.scene;
import inui.widgets;
import inui.app;
import inochi2d;
import std.stdio : writeln;
import std.file : exists;
import inui.core.msgbox;
/**
The Inochi2D Scene
*/
class Scene : View {
private:
Puppet[] puppets;
protected:
override
void onDocked(View to) { }
public:
/**
Whether the view is "open" and being rendered.
*/
override @property bool isOpen() => true;
this() {
super("in_scene", "Scene");
this.styleClass = "scene";
}
}
================================================
FILE: tl/placeholder.txt
================================================
This placeholder exists just so that it's present on GitHub
================================================
FILE: tl/template.pot
================================================
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-07-27 00:24+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: source/session/framesend.d:31
msgid ""
"Could not start texture sharing, it will be disabled. Is the library missing?"
msgstr ""
#: source/session/framesend.d:32
msgid "Frame-sending started successfully!"
msgstr ""
#: source/session/panels/tracking.d:88
msgid "Reset"
msgstr ""
#: source/session/panels/tracking.d:92
msgid "Not tracked"
msgstr ""
#: source/session/panels/tracking.d:107
msgid "X"
msgstr ""
#: source/session/panels/tracking.d:112
msgid "Y"
msgstr ""
#: source/session/panels/tracking.d:117
msgid "Z"
msgstr ""
#: source/session/panels/tracking.d:122
msgid "Roll"
msgstr ""
#: source/session/panels/tracking.d:127
msgid "Pitch"
msgstr ""
#: source/session/panels/tracking.d:132
msgid "Yaw"
msgstr ""
#: source/session/panels/tracking.d:151
msgid "Inverse"
msgstr ""
#: source/session/panels/tracking.d:153
msgid "Dampen"
msgstr ""
#: source/session/panels/tracking.d:156
msgid "Tracking In"
msgstr ""
#: source/session/panels/tracking.d:183
msgid "Tracking Out"
msgstr ""
#: source/session/panels/tracking.d:198
msgid "Refresh"
msgstr ""
#: source/session/panels/tracking.d:205
msgid "Save to File"
msgstr ""
#: source/session/panels/tracking.d:225
msgid "No settings available."
msgstr ""
#: source/session/panels/tracking.d:230
msgid "No puppet selected"
msgstr ""
#: source/session/panels/tracking.d:235
msgid "Tracking"
msgstr ""
#: source/session/tracking/package.d:352
#, c-format
msgid "%s (X)"
msgstr ""
#: source/session/tracking/package.d:355
#, c-format
msgid "%s (Y)"
msgstr ""
#: source/session/tracking/package.d:358
#, c-format
msgid "%s (Z)"
msgstr ""
#: source/session/tracking/package.d:361
#, c-format
msgid "%s (Roll)"
msgstr ""
#: source/session/tracking/package.d:364
#, c-format
msgid "%s (Pitch)"
msgstr ""
#: source/session/tracking/package.d:367
#, c-format
msgid "%s (Yaw)"
msgstr ""
#: source/session/windows/main.d:46 source/session/windows/spaceedit.d:22
#: source/session/windows/spaceedit.d:181
msgid "Error"
msgstr ""
#: source/session/windows/main.d:75
msgid "File"
msgstr ""
#: source/session/windows/main.d:77
msgid "Exit"
msgstr ""
#: source/session/windows/main.d:84
msgid "View"
msgstr ""
#: source/session/windows/main.d:86
msgid "Panels"
msgstr ""
#: source/session/windows/main.d:97
msgid "Configuration"
msgstr ""
#: source/session/windows/main.d:99 source/session/windows/spaceedit.d:213
msgid "Virtual Spaces"
msgstr ""
#: source/session/windows/main.d:106
msgid "Plugins"
msgstr ""
#: source/session/windows/main.d:112
msgid "Help"
msgstr ""
#: source/session/windows/main.d:113
msgid "About"
msgstr ""
#: source/session/windows/main.d:122
msgid "Double-click to show/hide UI"
msgstr ""
#: source/session/windows/main.d:126 source/session/windows/main.d:128
msgid "Donate"
msgstr ""
#: source/session/windows/main.d:164
msgid "Inochi Session"
msgstr ""
#: source/session/windows/main.d:165
msgid ""
"THIS IS BETA SOFTWARE\n"
"\n"
"This software is incomplete, please lower your expectations."
msgstr ""
#: source/session/windows/spaceedit.d:55 source/session/windows/spaceedit.d:70
msgid "Delete"
msgstr ""
#: source/session/windows/spaceedit.d:130
#: source/session/windows/spaceedit.d:195
msgid ""
msgstr ""
#: source/session/windows/spaceedit.d:138
msgid "No zone selected for editing..."
msgstr ""
#: source/session/windows/spaceedit.d:141
msgid "Zone Name"
msgstr ""
#: source/session/windows/spaceedit.d:150
msgid "Unset"
msgstr ""
#: source/session/windows/spaceedit.d:175
msgid "Save Changes"
msgstr ""
#: source/session/windows/spaceedit.d:206
msgid "Save"
msgstr ""
================================================
FILE: vcvars.ps1
================================================
function Invoke-VSDevEnvironment {
$vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
$installationPath = & $vswhere -prerelease -legacy -latest -property installationPath
$Command = Join-Path $installationPath "Common7\Tools\vsdevcmd.bat"
& "${env:COMSPEC}" /s /c "`"$Command`" -no_logo && set" | Foreach-Object {
if ($_ -match '^([^=]+)=(.*)') {
[System.Environment]::SetEnvironmentVariable($matches[1], $matches[2])
}
}
}
Invoke-VSDevEnvironment
gitextract_zwm6wzm0/ ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── bug-report.yml │ │ ├── config.yml │ │ └── feature_request.yml │ └── workflows/ │ ├── build.yml │ ├── pr-test.yml │ ├── publish-gh.yml │ ├── publish-itch.yml │ ├── release-nightly.yml │ └── release.yml ├── .gitignore ├── LICENSE ├── README.md ├── build-aux/ │ ├── linux/ │ │ ├── inochi-session.appdata.xml │ │ └── inochi-session.desktop │ ├── osx/ │ │ ├── BuildUniversal.sh │ │ ├── Info.plist │ │ ├── gendmg.sh │ │ └── osxbundle.sh │ └── windows/ │ ├── inochi-session.rc │ └── version.h ├── dub.sdl ├── genpot.sh ├── gentl.sh ├── imgui.ini ├── res/ │ ├── licenses/ │ │ ├── LICENSE-FreeType │ │ ├── LICENSE-Lua │ │ ├── LICENSE-Spout2 │ │ └── LICENSE-imgui │ ├── shaders/ │ │ ├── batch.frag │ │ └── batch.vert │ ├── style.css │ └── version.txt ├── source/ │ ├── app.d │ ├── inochi2d/ │ │ └── nio/ │ │ ├── puppet.d │ │ ├── scene.d │ │ └── staging.d │ └── session/ │ ├── package.d │ └── widgets/ │ ├── package.d │ └── scene.d ├── tl/ │ ├── placeholder.txt │ └── template.pot └── vcvars.ps1
Condensed preview — 43 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (63K chars).
[
{
"path": ".github/FUNDING.yml",
"chars": 47,
"preview": "github: [LunaTheFoxgirl]\npatreon: LunaFoxgirlVT"
},
{
"path": ".github/ISSUE_TEMPLATE/bug-report.yml",
"chars": 2334,
"preview": "name: Bug Report\ndescription: Report an issue with Inochi Session\ntitle: \"[BUG]\"\nlabels: [\"Bug\", \"Triage\"] \nbody:\n - ty"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 195,
"preview": "blank_issues_enabled: false\r\ncontact_links:\r\n - name: Discord Chat\r\n url: https://discord.com/invite/abnxwN6r9v\r\n "
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.yml",
"chars": 1711,
"preview": "name: Feature request\ndescription: Suggest an idea for Inochi Session\ntitle: \"[Feature Request]\"\nlabels: [\"Enhancement\","
},
{
"path": ".github/workflows/build.yml",
"chars": 5750,
"preview": "name: 'Build Inochi Session'\nrun-name: 'Build Inochi Session (${{ inputs.variant }})...'\n\non:\n workflow_call:\n input"
},
{
"path": ".github/workflows/pr-test.yml",
"chars": 1443,
"preview": "# This workflow uses actions that are not certified by GitHub.\n# They are provided by a third-party and are governed by\n"
},
{
"path": ".github/workflows/publish-gh.yml",
"chars": 1020,
"preview": "name: 'Publish to GitHub'\n\npermissions:\n contents: write\n\non:\n workflow_call:\n inputs:\n tag:\n required:"
},
{
"path": ".github/workflows/publish-itch.yml",
"chars": 1525,
"preview": "name: 'Publish to itch.io'\n\non:\n workflow_call:\n inputs:\n postfix:\n required: false\n type: string"
},
{
"path": ".github/workflows/release-nightly.yml",
"chars": 881,
"preview": "# This workflow uses actions that are not certified by GitHub.\n# They are provided by a third-party and are governed by\n"
},
{
"path": ".github/workflows/release.yml",
"chars": 1105,
"preview": "# This workflow uses actions that are not certified by GitHub.\n# They are provided by a third-party and are governed by\n"
},
{
"path": ".gitignore",
"chars": 166,
"preview": ".dub\ndocs.json\n__dummy.html\ndocs/\n*.exe\n*.pdb\n*.o\n*.obj\n*.lst\n*.res\n\nout/\ndub.selections.json\n__dummy_docs/\n\n# Redub Jun"
},
{
"path": "LICENSE",
"chars": 1325,
"preview": "BSD 2-Clause License\n\nCopyright (c) 2020, Inochi2D Project\nAll rights reserved.\n\nRedistribution and use in source and bi"
},
{
"path": "README.md",
"chars": 420,
"preview": "# Inochi Session\n` ]\nthen\n echo \"No translations, skipping...\"\nelse\n fo"
},
{
"path": "imgui.ini",
"chars": 249,
"preview": "[Window][WindowOverViewport_11111111]\nPos=0,0\nSize=1065,754\nCollapsed=0\n\n[Window][Debug##Default]\nPos=60,60\nSize=400,400"
},
{
"path": "res/licenses/LICENSE-FreeType",
"chars": 6742,
"preview": " The FreeType Project LICENSE\n ----------------------------\n\n "
},
{
"path": "res/licenses/LICENSE-Lua",
"chars": 1064,
"preview": "Copyright © 1994–2021 Lua.org, PUC-Rio.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of"
},
{
"path": "res/licenses/LICENSE-Spout2",
"chars": 1320,
"preview": "BSD 2-Clause License\n\nCopyright (c) 2020, Lynn Jarvis\nAll rights reserved.\n\nRedistribution and use in source and binary "
},
{
"path": "res/licenses/LICENSE-imgui",
"chars": 1082,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2014-2022 Omar Cornut\n\nPermission is hereby granted, free of charge, to any person "
},
{
"path": "res/shaders/batch.frag",
"chars": 401,
"preview": "#version 330\nin vec2 texUVs;\nin vec4 exColor;\nlayout(location = 0) out vec4 outAlbedo;\nlayout(location = 1) out vec4 out"
},
{
"path": "res/shaders/batch.vert",
"chars": 280,
"preview": "#version 330\nuniform mat4 vp;\nlayout(location = 0) in vec2 verts;\nlayout(location = 1) in vec2 uvs;\nlayout(location = 2)"
},
{
"path": "res/style.css",
"chars": 45,
"preview": ".scene {\n width: 100%;\n height: 100%;\n}"
},
{
"path": "res/version.txt",
"chars": 5,
"preview": "0.8.7"
},
{
"path": "source/app.d",
"chars": 560,
"preview": "module app;\nimport session;\nimport inui;\n\nvoid main(string[] args) {\n AppInfo info = {\n name: \"Inochi Session\""
},
{
"path": "source/inochi2d/nio/puppet.d",
"chars": 4974,
"preview": "module inochi2d.nio.puppet;\nimport inochi2d;\nimport niobium;\nimport numem;\nimport nulib.collections;\nimport nulib.math :"
},
{
"path": "source/inochi2d/nio/scene.d",
"chars": 3842,
"preview": "module inochi2d.nio.scene;\nimport inochi2d.nio.staging;\nimport inochi2d.nio.puppet;\nimport inochi2d;\nimport niobium;\nimp"
},
{
"path": "source/inochi2d/nio/staging.d",
"chars": 2447,
"preview": "module inochi2d.nio.staging;\nimport nulib.collections;\nimport niobium;\nimport numem;\n\n/**\n A managed staging buffer.\n"
},
{
"path": "source/session/package.d",
"chars": 47,
"preview": "module session;\n\npublic import session.widgets;"
},
{
"path": "source/session/widgets/package.d",
"chars": 61,
"preview": "module session.widgets;\n\npublic import session.widgets.scene;"
},
{
"path": "source/session/widgets/scene.d",
"chars": 525,
"preview": "module session.widgets.scene;\nimport inui.widgets;\nimport inui.app;\nimport inochi2d;\n\nimport std.stdio : writeln;\nimport"
},
{
"path": "tl/placeholder.txt",
"chars": 59,
"preview": "This placeholder exists just so that it's present on GitHub"
},
{
"path": "tl/template.pot",
"chars": 4169,
"preview": "# SOME DESCRIPTIVE TITLE.\n# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same "
},
{
"path": "vcvars.ps1",
"chars": 581,
"preview": "function Invoke-VSDevEnvironment {\n $vswhere = \"${env:ProgramFiles(x86)}\\Microsoft Visual Studio\\Installer\\vswhere.ex"
}
]
About this extraction
This page contains the full source code of the Inochi2D/inochi-session GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 43 files (56.7 KB), approximately 16.0k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.