
# DCC Model Viewer

PS3版のDREAM C CLUB ZERO(以下ZERO)及びDREAM C CLUB Gogo.(以下Gogo.)のモデルを表示するソフトです。


## 動作確認環境

以下の環境で開発、動作確認を行っています。

* OS : Windows 10 64bit Home
* CPU : Ryzen 9 3900X
* Memory : 32GB
* GPU : RTX 3080 Ti
* HMD : Valve Index(コントローラはVIVEコントローラを使用) / Meta Quest2(Quest Link接続、Air Link接続)


## 使用方法

### ゲームデータの用意

1. ゲームデータの格納

ZEROもしくはGogo.のゲームデータを吸い出し、GAMEDATA\ZERO、GAMEDATA\GOGOフォルダに格納します。

GAMEDATA\ZERO\2dbg
GAMEDATA\ZERO\2dbg2
...

GAMEDATA\GOGO\2dbg
GAMEDATA\GOGO\2dbg2
...

と格納します。


2. 音声ファイルの格納

ゲームデータより曲音声データを展開し、SONGDATAフォルダに格納します。
(音声ファイルは格納しなくても動作します)

音声ファイルは以下に格納されています。

* ZERO
snd\song00_streamfiles.awb
snd\song01_streamfiles.awb
...

* Gogo.
snd\song01.awb
snd\song02.awb
...

awbファイルをを展開して、wavファイルに変換します。
各曲のフォルダを作成しているので、変換したwavファイルを格納します。

* 00000.wav : BGM
* 00001.wav : BGM(ZEROバージョン)
* 00002.wav : 亜麻音音声
* 00003.wav : 亜麻音音声(酔い)
* 00004.wav : みお音声
* 00005.wav : みお音声(酔い)
...

Gogo.の場合も同様に格納します。

* 00000.wav : BGM
* 00001.wav : 花里愛音声
* 00002.wav : 花里愛音声(酔い)
* 00003.wav : 萌黄音声
* 00004.wav : 萌黄音声(酔い)
...


3. 設定ファイルの置き換え

ZERO、Gogo.両方のゲームデータがある場合は不要です。

ZEROもしくはGogo.の一方しかない場合、用意できたゲームデータに合わせて、
selector_GogoOnly.luaもしくはselector_ZEROOnly.luaを、selector.luaに置き換えてください。


4. 起動方法(Windowモード)

DCCModelViewer.exeを実行してください。
設定ファイル、ゲームデータが正しく格納されている場合起動します。


5. 起動方法(VRモード、Valve Index)

SteamVRアプリがインストール済みでValve IndexがPCに接続されている場合、DCCModelViewer-vr.batを実行してください。
SteamVRが立ち上がり、VRモードで起動します。


6. 起動方法(VRモード、Meta Quest2)

Meta Quest2とPCを接続してください。Meta Quest2からSteamVRを立ち上げます。
SteamVRが起動している状態でDCCModelViewer-vr.batを実行すると、VRモードで起動します。


### 操作方法

標準では以下のキー設定となっています。設定ファイルで変更可能です。

* A,S,D,W : 前後左右移動
* Shift + S,W : 上下移動
* Shift + A,D : 次のカメラ、前のカメラに切り替える。
* Ctrl + A,S,D,W : 上下左右回転(ウィンドウモードのみ)

* Space : VRモードでは、押している間ホストガールに合わせて視点が動く。
			ウィンドウモードでは、ホストガールの追尾する、しないの切り替え。

* R : 曲のリセット ※LuaスクリプトのSelect()を呼び出す。後述「モデルの配置」を参照。
* N : 次の曲 ※LuaスクリプトのNext()を呼び出す。後述
* P : 前の曲 ※LuaスクリプトのPrev()を呼び出す。後述

* Up, Down : ホストガールの明るさを変更する。
* Left, Right : ステージの明るさを変更する。

* J,U : トーンマップによる色の調整。ガンマを調整する。
* K,I : トーンマップによる色の調整。露出を調整する。
* L,O : トーンマップによる色の調整。強度を調整する。

以下はVIVEコントローラーを想定した設定です。他のVR用コントローラーでは上手く動かない可能性があります。

* トラックパッドの中央部分を押下 : 曲のリセット
* トラックパッドの右部分を押下 : 次の曲
* トラックパッドの左部分を押下 : 前の曲
* トラックパッドの上下部分を押下 : 上下移動
* トラックパッドをスワイプ : 前後左右移動
* トリガー : ホストガールの追尾する、しないの切り替え。
* メニューボタン : ホストガールの追尾する、しないの切り替え。
* グリップボタン : 次のカメラに切り替える。

### モデルの配置

楽曲やホストガールの選択、配置などはselector.luaのluaスクリプトで決定されます。
3つの関数Select()、Next()、Prev()の実装が必須です。

Select()関数で、楽曲やホストガールの設定(以下"ショー"と呼ぶ)をテーブルに格納して返す必要があります。
テーブルには以下のフィールドを設定する必要があります。

* karaoke: カラオケを表す文字列。
* hg_settings: ホストガールの設定の配列。各要素に以下の内容を設定する必要がある。
	* hg_number: ホストガールを表す番号。0:亜麻音～12:あすか、13:花里愛～22:アンジュとなる。
	* position: ホストガールの位置。XYZの3つの数値を指定する。
	* hg_costume: ホストガールのコスチューム。事前定義された変数COSTUME[]から取得する。uni01:亜麻音～uni13:あすか、uni15:花里愛～uni24:アンジュが指定可能。
	* cast_off: ホストガールの標準アクセサリーを外す設定。みお、魔璃、桜華でのみ有効になる。
	* alternative_face_pattern_number: 歌えない楽曲の場合、どのホストガールの顔パターンを使用するかの設定。

Next()関数、Prev()関数でショーの種類を変更します。

同梱のselector.luaでは、以下のショーを定義しています。
1. ランダムに曲を選択し、歌えるホストガールをセンターに、歌えないホストガールをバックダンサーにします。
2. 1と同じですが、服装がランダムになります。
3. ZEROの曲を選択し、ZEROのホストガールを3人配置します。服装はGogo.の服装とします。
4. Gogo.の曲を選択し、Gogo.のホストガールを3人配置します。服装はZEROの服装とします。
5. ランダムに曲を選択し、ランダムなホストガールを5人配置します。服装もランダムで選択します。

詳細は、selector.luaを確認してください。


### 設定ファイル

描画設定、物理演算の調整、キー設定などを変更したい場合、setting.jsonに記載します。
詳細はsetting.json及び後述のキーコンフィグを参照してください。
jsonの構文エラーとなった場合、log.txtにエラー内容を出力しプログラムが終了します。


### キーコンフィグ

setting.jsonで変更可能です。指定できるキー名は以下のとおりです。

* A～Z
* NumPad0～NumPad9
* F1～F24
* D0～D9
* Tab, Enter, Escape, Space, PageUp, PageDown, End, Home, Left, Up, Right, Down, Delete
* OemSemicolon, OemPlus, OemComma, OemMinus, OemPeriod, OemQuestion, OemTilde, OemOpenBrackets, OemPipe, OemCloseBrackets, OemQuotes, OemBackslash

以下はVIVEコントローラーを想定した設定です。他のVR用コントローラーでは上手く動かない可能性があります。

* Controller.Button.Touchpad.Center : トラックパッドの中央部分を押下
*	Controller.Swipe.Touchpad.Up : トラックパッドの上部分を押下
*	Controller.Swipe.Touchpad.Down : トラックパッドの下部分を押下
*	Controller.Swipe.Touchpad.Left : トラックパッドの左部分を押下
*	Controller.Swipe.Touchpad.Right : トラックパッドの右部分を押下
*	Controller.Button.Touchpad.Up : トラックパッド上で中央から上にスワイプ
*	Controller.Button.Touchpad.Down : トラックパッド上で中央から下にスワイプ
*	Controller.Button.Touchpad.Left : トラックパッド上で中央から左にスワイプ
*	Controller.Button.Touchpad.Right : トラックパッド上で中央から右にスワイプ
*	Controller.Button.Trigger : トリガーボタン
*	Controller.Button.Menu : メニューボタン
*	Controller.Button.Grip : グリップボタン

装飾キーとして、Ctrlとの同時押し"C-"、Shiftとの同時押し"S-"が指定可能です。
例えば、"C-S-A"は、CtrlとShiftを押しながらAとなります。


指定できるアクションは以下のとおりです。

* "Application.Camera.Up": カメラの移動。上
* "Application.Camera.Down": カメラの移動。下
* "Application.Camera.Left": カメラの移動。左
* "Application.Camera.Right": カメラの移動。右
* "Application.Camera.Forward": カメラの移動。前
* "Application.Camera.Backward": カメラの移動。後ろ
* "Application.Camera.Rotate.Up": カメラの回転。上
* "Application.Camera.Rotate.Down": カメラの回転。下
* "Application.Camera.Rotate.Left": カメラの回転。左
* "Application.Camera.Rotate.Right": カメラの回転。右
* "Application.Camera.Homeing.Enable": ホストガールの動きに合わせてカメラを動かす
* "Application.Camera.Homeing.Toggle": ホストガールの動きに合わせてカメラを動かす設定をトグルする
* "Application.Camera.VR.Rotate.Up": VR用カメラの回転。上。VR酔いしないように一定角度回転する。
* "Application.Camera.VR.Rotate.Down": VR用カメラの回転。下
* "Application.Camera.VR.Rotate.Left": VR用カメラの回転。左
* "Application.Camera.VR.Rotate.Right": VR用カメラの回転。右
* "Application.Camera.Next": 次のカメラに切り替える。
* "Application.Camera.Prev": 前のカメラに切り替える。
* "Application.Show.Reset": 現在の曲を終了し、次の曲を開始する。(LuaスクリプトのSelect()を呼び出す)
* "Application.Show.Next": 次の曲設定に変更する。(LuaスクリプトのNext()を呼び出す)
* "Application.Show.Prev": 前の曲設定に変更する。(LuaスクリプトのPrev()を呼び出す)
* "Application.Render.Tonemap.Gamma.Up": 描画設定を変更する。トーンマップによる色の調整。ガンマを上げる
* "Application.Render.Tonemap.Gamma.Down": 描画設定を変更する。トーンマップによる色の調整。ガンマを下げる
* "Application.Render.Tonemap.Exposure.Up": 描画設定を変更する。トーンマップによる色の調整。露出を上げる
* "Application.Render.Tonemap.Exposure.Down": 描画設定を変更する。トーンマップによる色の調整。露出を下げる
* "Application.Render.Tonemap.Saturation.Up": 描画設定を変更する。トーンマップによる色の調整。強度を上げる
* "Application.Render.Tonemap.Saturation.Down": 描画設定を変更する。トーンマップによる色の調整。強度を下げる 
* "Application.Render.Tonemap.Bleach.Up": 描画設定を変更する。トーンマップによる色の調整。Bleachを上げる。明るいところがより明るくなる。強くすると白飛びする。
* "Application.Render.Tonemap.Bleach.Down": 描画設定を変更する。トーンマップによる色の調整。Bleachを上げる。
* "Application.Render.Tonemap.Defog.Up": 描画設定を変更する。トーンマップによる色の調整。Defogを上げる。FogColorで設定された色が減算される。
* "Application.Render.Tonemap.Defog.Down": 描画設定を変更する。トーンマップによる色の調整。Defogを下げる。
* "Application.Render.Specular.Val.Up": 描画設定を変更する。
* "Application.Render.Specular.Val.Down": 描画設定を変更する。
* "Application.Render.Specular.Rate.Up": 描画設定を変更する。
* "Application.Render.Specular.Rate.Down": 描画設定を変更する。


## コスチュームの追加に関して

costume_list.jsonで使用するコスチュームを定義しています。
costume_list.jsonの内容に関してはファイル内に記載しています。
DLCのデータを入手できる場合、costume_list.jsonに追加することで使用できるかもしれません。


## 曲の追加に関して

karaoke_list.jsonで使用する曲を定義しています。
karaoke_list.jsonの内容に関してはファイル内に記載しています。
DLCのデータを入手できる場合、karaoke_list.jsonに追加することで使用できるかもしれません。


## 既知の問題など

* 物理演算は最低限揺れる程度の実装です。突き抜けや不自然な動きが多発します。
* 口パクが不自然です。
* 店内モニターには描画内容をそのまま表示しているため、VRでは歪んでいます。
* エラーチェックは最低限しか行っていません。予期せぬタイミングでプログラムが終了する可能性があります。


## 注意事項など

* 当ソフトウェアが原因で何らかの損害や障害等が発生したとしても、一切責任を負わないものとします。
* 当ソフトウェアの無断転載・無断商用利用は禁止です。


## ライセンス表記

当ソフトウェアは以下のライブラリ、ソースコードを使用しています。

* OpenVR
Copyright (c) 2015, Valve Corporation
https://github.com/ValveSoftware/openvr/blob/master/LICENSE

* PhysX
Copyright (c) 2021 NVIDIA Corporation. All rights reserved.
https://github.com/NVIDIAGameWorks/PhysX/blob/4.1/LICENSE.md

* nlohmann json
Copyright (c) 2013-2022 Niels Lohmann
https://github.com/nlohmann/json/blob/develop/LICENSE.MIT

* Lua
Copyright © 1994–2021 Lua.org, PUC-Rio
https://www.lua.org/license.html

* spdlog
Copyright (c) 2016 Gabi Melman.                                       
https://github.com/gabime/spdlog/blob/master/LICENSE

* ReShade
Copyright 2014 Patrick Mours. All rights reserved.
https://github.com/crosire/reshade/blob/main/LICENSE.md

* OpenCV
Copyright (C) 2022-2023, Southern University of Science And Technology, all rights reserved.
https://github.com/opencv/opencv/blob/master/LICENSE


