Full Code of Inochi2D/inochi-session for AI

v0_8 249f04772088 cached
43 files
56.7 KB
16.0k tokens
1 requests
Download .txt
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
![image](https://user-images.githubusercontent.com/7032834/181119161-f83e8e57-2f9e-409f-90bd-1b1b9c047bcc.png)

_[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
Download .txt
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![image](https://user-images.githubusercontent.com/7032834/181119161-f83e8e57-2f9e-409f-90bd-1b1b9c047b"
  },
  {
    "path": "build-aux/linux/inochi-session.appdata.xml",
    "chars": 1173,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<component type=\"desktop\">\n  <id>inochi-session</id>\n  <launchable type=\"desktop-"
  },
  {
    "path": "build-aux/linux/inochi-session.desktop",
    "chars": 106,
    "preview": "[Desktop Entry]\nName=inochi-session\nExec=inochi-session\nIcon=icon_x256\nType=Application\nCategories=Utility"
  },
  {
    "path": "build-aux/osx/BuildUniversal.sh",
    "chars": 1053,
    "preview": "# First build ARM64 version...\necho \"Building arm64 binary...\"\ndub build --build=release --config=osx-full --arch=arm64-"
  },
  {
    "path": "build-aux/osx/Info.plist",
    "chars": 1929,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "build-aux/osx/gendmg.sh",
    "chars": 1279,
    "preview": "DMGTITLE=\"Install Inochi Session\"\nDMGFILENAME=\"Install_Inochi_Session.dmg\"\n\nif [ -d \"out/Inochi Session.app\" ]; then\n   "
  },
  {
    "path": "build-aux/osx/osxbundle.sh",
    "chars": 1492,
    "preview": "echo \"Creating directory structure...\"\nLASTPWD=$PWD\n\n# Handle copying all the dylibs to their respective directories\n# A"
  },
  {
    "path": "build-aux/windows/inochi-session.rc",
    "chars": 869,
    "preview": "#include <windows.h>\n#include \"version.h\"\n\nIDI_ICON1          ICON           \"icon.ico\"\n\nVS_VERSION_INFO VERSIONINFO\nFIL"
  },
  {
    "path": "build-aux/windows/version.h",
    "chars": 620,
    "preview": "#ifndef VERSION_H\n#define VERSION_H\n\n#define VER_FILEVERSION 0,8,1,0\n#define VER_FILEVERSION_STR \"0.8.1\\0\"\n\n#define VER_"
  },
  {
    "path": "dub.sdl",
    "chars": 2876,
    "preview": "name \"inochi-session\"\ndescription \"App that allows you to stream with Inochi2D puppets\"\nauthors \"Inochi2D Project\"\ncopyr"
  },
  {
    "path": "genpot.sh",
    "chars": 111,
    "preview": "#!/bin/sh\nfind . -iname \"*.d\" | xargs xgettext --from-code=UTF-8 -o tl/template.pot -c --keyword=_ --keyword=__"
  },
  {
    "path": "gentl.sh",
    "chars": 210,
    "preview": "mkdir -p out/\n\nif [ -n `$(find tl/ -name \"*.po\" 2>/dev/null)` ]\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.

Copied to clipboard!