diff --git a/LittleCat_Model.zip b/LittleCat_Model.zip new file mode 100644 index 0000000..4cd9365 Binary files /dev/null and b/LittleCat_Model.zip differ diff --git a/LittleCat_Model/Alternate Textures/black/texture_00.png b/LittleCat_Model/Alternate Textures/black/texture_00.png new file mode 100644 index 0000000..f46a146 Binary files /dev/null and b/LittleCat_Model/Alternate Textures/black/texture_00.png differ diff --git a/LittleCat_Model/Alternate Textures/calico/texture_00.png b/LittleCat_Model/Alternate Textures/calico/texture_00.png new file mode 100644 index 0000000..ca3b442 Binary files /dev/null and b/LittleCat_Model/Alternate Textures/calico/texture_00.png differ diff --git a/LittleCat_Model/Alternate Textures/texture guide.png b/LittleCat_Model/Alternate Textures/texture guide.png new file mode 100644 index 0000000..313ca94 Binary files /dev/null and b/LittleCat_Model/Alternate Textures/texture guide.png differ diff --git a/LittleCat_Model/Alternate Textures/white/texture_00.png b/LittleCat_Model/Alternate Textures/white/texture_00.png new file mode 100644 index 0000000..8721d92 Binary files /dev/null and b/LittleCat_Model/Alternate Textures/white/texture_00.png differ diff --git a/LittleCat_Model/LittleCat_vts/LittleCat.2048/texture_00.png b/LittleCat_Model/LittleCat_vts/LittleCat.2048/texture_00.png new file mode 100644 index 0000000..1390183 Binary files /dev/null and b/LittleCat_Model/LittleCat_vts/LittleCat.2048/texture_00.png differ diff --git a/LittleCat_Model/LittleCat_vts/LittleCat.cdi3.json b/LittleCat_Model/LittleCat_vts/LittleCat.cdi3.json new file mode 100644 index 0000000..84a0c7c --- /dev/null +++ b/LittleCat_Model/LittleCat_vts/LittleCat.cdi3.json @@ -0,0 +1,271 @@ +{ + "Version": 3, + "Parameters": [ + { + "Id": "ParamAngleX", + "GroupId": "", + "Name": "Angle X" + }, + { + "Id": "ParamAngleY", + "GroupId": "", + "Name": "Angle Y" + }, + { + "Id": "ParamAngleZ", + "GroupId": "", + "Name": "Angle Z" + }, + { + "Id": "ParamEyeLOpen", + "GroupId": "", + "Name": "EyeL Open" + }, + { + "Id": "ParamEyeLSmile", + "GroupId": "", + "Name": "EyeL Smile" + }, + { + "Id": "ParamEyeROpen", + "GroupId": "", + "Name": "EyeR Open" + }, + { + "Id": "ParamEyeRSmile", + "GroupId": "", + "Name": "EyeR Smile" + }, + { + "Id": "ParamEyeBallX", + "GroupId": "", + "Name": "Eyeball X" + }, + { + "Id": "ParamEyeBallY", + "GroupId": "", + "Name": "Eyeball Y" + }, + { + "Id": "ParamBrowLY", + "GroupId": "", + "Name": "BrowL Y" + }, + { + "Id": "ParamBrowRY", + "GroupId": "", + "Name": "BrowR Y" + }, + { + "Id": "ParamBrowLX", + "GroupId": "", + "Name": "BrowL X" + }, + { + "Id": "ParamBrowRX", + "GroupId": "", + "Name": "BrowR X" + }, + { + "Id": "ParamBrowLAngle", + "GroupId": "", + "Name": "BrowL Angle" + }, + { + "Id": "ParamBrowRAngle", + "GroupId": "", + "Name": "BrowR Angle" + }, + { + "Id": "ParamBrowLForm", + "GroupId": "", + "Name": "BrowL Form" + }, + { + "Id": "ParamBrowRForm", + "GroupId": "", + "Name": "BrowR Form" + }, + { + "Id": "ParamMouthForm", + "GroupId": "", + "Name": "Mouth Form" + }, + { + "Id": "ParamMouthOpenY", + "GroupId": "", + "Name": "Mouth Open" + }, + { + "Id": "ParamCheek", + "GroupId": "", + "Name": "Cheek" + }, + { + "Id": "ParamBodyAngleX", + "GroupId": "", + "Name": "Body X" + }, + { + "Id": "ParamBodyAngleY", + "GroupId": "", + "Name": "Body Y" + }, + { + "Id": "ParamBodyAngleZ", + "GroupId": "", + "Name": "Body Z" + }, + { + "Id": "ParamBreath", + "GroupId": "", + "Name": "Breathing" + }, + { + "Id": "ParamArms", + "GroupId": "", + "Name": "Arms" + }, + { + "Id": "Param_Angle_Rotation2", + "GroupId": "ParamGroup", + "Name": "[0]tail wiggle" + }, + { + "Id": "Param_Angle_Rotation3", + "GroupId": "ParamGroup", + "Name": "[1]tail wiggle" + }, + { + "Id": "Param_Angle_Rotation4", + "GroupId": "ParamGroup", + "Name": "[2]tail wiggle" + }, + { + "Id": "Param_Angle_Rotation5", + "GroupId": "ParamGroup", + "Name": "[3]tail wiggle" + }, + { + "Id": "Param_Angle_Rotation6", + "GroupId": "ParamGroup", + "Name": "[4]tail wiggle" + }, + { + "Id": "Param_Angle_Rotation7", + "GroupId": "ParamGroup", + "Name": "[5]tail wiggle" + }, + { + "Id": "Param_Angle_Rotation10", + "GroupId": "ParamGroup2", + "Name": "[0]ear L wiggle" + }, + { + "Id": "Param_Angle_Rotation11", + "GroupId": "ParamGroup2", + "Name": "[1]ear L wiggle" + }, + { + "Id": "Param_Angle_Rotation12", + "GroupId": "ParamGroup3", + "Name": "[0]ear R wiggle" + }, + { + "Id": "Param_Angle_Rotation13", + "GroupId": "ParamGroup3", + "Name": "[1]ear R wiggle" + } + ], + "ParameterGroups": [ + { + "Id": "ParamGroup", + "GroupId": "", + "Name": "tail wiggle" + }, + { + "Id": "ParamGroup2", + "GroupId": "", + "Name": "ear L wiggle" + }, + { + "Id": "ParamGroup3", + "GroupId": "", + "Name": "ear L wiggle" + } + ], + "Parts": [ + { + "Id": "Part", + "Name": "ear L" + }, + { + "Id": "headfolder", + "Name": "head" + }, + { + "Id": "Part3", + "Name": "ear R" + }, + { + "Id": "tail_Skinning", + "Name": "tail(Skinning)" + }, + { + "Id": "PartSketch0", + "Name": "[ Guide Image]" + }, + { + "Id": "ArtMesh_Skinning2", + "Name": "inner ear L(Skinning)" + }, + { + "Id": "ArtMesh_Skinning", + "Name": "inner ear L(Skinning)" + }, + { + "Id": "ArtMesh0_Skinning2", + "Name": "ear L(Skinning)" + }, + { + "Id": "ArtMesh0_Skinning", + "Name": "ear L(Skinning)" + }, + { + "Id": "face", + "Name": "face" + }, + { + "Id": "ArtMesh4_Skinning2", + "Name": "inner ear R(Skinning)" + }, + { + "Id": "ArtMesh4_Skinning", + "Name": "inner ear R(Skinning)" + }, + { + "Id": "ArtMesh5_Skinning2", + "Name": "ear R(Skinning)" + }, + { + "Id": "ArtMesh5_Skinning", + "Name": "ear R(Skinning)" + }, + { + "Id": "mouth", + "Name": "mouth" + }, + { + "Id": "base", + "Name": "base" + }, + { + "Id": "open", + "Name": "open" + }, + { + "Id": "Part2", + "Name": "inner mouth" + } + ] +} \ No newline at end of file diff --git a/LittleCat_Model/LittleCat_vts/LittleCat.moc3 b/LittleCat_Model/LittleCat_vts/LittleCat.moc3 new file mode 100644 index 0000000..8e0dddd Binary files /dev/null and b/LittleCat_Model/LittleCat_vts/LittleCat.moc3 differ diff --git a/LittleCat_Model/LittleCat_vts/LittleCat.model3.json b/LittleCat_Model/LittleCat_vts/LittleCat.model3.json new file mode 100644 index 0000000..b0cc758 --- /dev/null +++ b/LittleCat_Model/LittleCat_vts/LittleCat.model3.json @@ -0,0 +1,29 @@ +{ + "Version": 3, + "FileReferences": { + "Moc": "LittleCat.moc3", + "Textures": [ + "LittleCat.2048/texture_00.png" + ], + "Physics": "LittleCat.physics3.json", + "DisplayInfo": "LittleCat.cdi3.json" + }, + "Groups": [ + { + "Target": "Parameter", + "Name": "EyeBlink", + "Ids": [ + "ParamEyeLOpen", + "ParamEyeROpen" + ] + }, + { + "Target": "Parameter", + "Name": "LipSync", + "Ids": [ + "ParamMouthForm", + "ParamMouthOpenY" + ] + } + ] +} \ No newline at end of file diff --git a/LittleCat_Model/LittleCat_vts/LittleCat.physics3.json b/LittleCat_Model/LittleCat_vts/LittleCat.physics3.json new file mode 100644 index 0000000..3b56d8f --- /dev/null +++ b/LittleCat_Model/LittleCat_vts/LittleCat.physics3.json @@ -0,0 +1,451 @@ +{ + "Version": 3, + "Meta": { + "PhysicsSettingCount": 3, + "TotalInputCount": 8, + "TotalOutputCount": 11, + "VertexCount": 16, + "EffectiveForces": { + "Gravity": { + "X": 0, + "Y": -1 + }, + "Wind": { + "X": 0, + "Y": 0 + } + }, + "PhysicsDictionary": [ + { + "Id": "PhysicsSetting1", + "Name": "tail wiggle" + }, + { + "Id": "PhysicsSetting2", + "Name": "ear wiggle" + }, + { + "Id": "PhysicsSetting3", + "Name": "arms" + } + ] + }, + "PhysicsSettings": [ + { + "Id": "PhysicsSetting1", + "Input": [ + { + "Source": { + "Target": "Parameter", + "Id": "ParamBodyAngleX" + }, + "Weight": 100, + "Type": "X", + "Reflect": false + }, + { + "Source": { + "Target": "Parameter", + "Id": "ParamBodyAngleZ" + }, + "Weight": 100, + "Type": "Angle", + "Reflect": false + } + ], + "Output": [ + { + "Destination": { + "Target": "Parameter", + "Id": "Param_Angle_Rotation2" + }, + "VertexIndex": 1, + "Scale": 33.072, + "Weight": 100, + "Type": "Angle", + "Reflect": false + }, + { + "Destination": { + "Target": "Parameter", + "Id": "Param_Angle_Rotation3" + }, + "VertexIndex": 2, + "Scale": 33.978, + "Weight": 100, + "Type": "Angle", + "Reflect": false + }, + { + "Destination": { + "Target": "Parameter", + "Id": "Param_Angle_Rotation4" + }, + "VertexIndex": 3, + "Scale": 34.41, + "Weight": 100, + "Type": "Angle", + "Reflect": false + }, + { + "Destination": { + "Target": "Parameter", + "Id": "Param_Angle_Rotation5" + }, + "VertexIndex": 4, + "Scale": 32.674, + "Weight": 100, + "Type": "Angle", + "Reflect": false + }, + { + "Destination": { + "Target": "Parameter", + "Id": "Param_Angle_Rotation6" + }, + "VertexIndex": 5, + "Scale": 27.941, + "Weight": 100, + "Type": "Angle", + "Reflect": false + }, + { + "Destination": { + "Target": "Parameter", + "Id": "Param_Angle_Rotation7" + }, + "VertexIndex": 6, + "Scale": 24.302, + "Weight": 100, + "Type": "Angle", + "Reflect": false + } + ], + "Vertices": [ + { + "Position": { + "X": 0, + "Y": 0 + }, + "Mobility": 1, + "Delay": 1, + "Acceleration": 1, + "Radius": 0 + }, + { + "Position": { + "X": 0, + "Y": 10 + }, + "Mobility": 0.85, + "Delay": 0.85, + "Acceleration": 1.2, + "Radius": 10 + }, + { + "Position": { + "X": 0, + "Y": 20 + }, + "Mobility": 0.85, + "Delay": 0.85, + "Acceleration": 1.2, + "Radius": 10 + }, + { + "Position": { + "X": 0, + "Y": 30 + }, + "Mobility": 0.85, + "Delay": 0.85, + "Acceleration": 1.2, + "Radius": 10 + }, + { + "Position": { + "X": 0, + "Y": 40 + }, + "Mobility": 0.85, + "Delay": 0.85, + "Acceleration": 1.2, + "Radius": 10 + }, + { + "Position": { + "X": 0, + "Y": 50 + }, + "Mobility": 0.85, + "Delay": 0.85, + "Acceleration": 1.2, + "Radius": 10 + }, + { + "Position": { + "X": 0, + "Y": 60 + }, + "Mobility": 0.85, + "Delay": 0.85, + "Acceleration": 1.2, + "Radius": 10 + }, + { + "Position": { + "X": 0, + "Y": 70 + }, + "Mobility": 0.85, + "Delay": 0.85, + "Acceleration": 1.2, + "Radius": 10 + }, + { + "Position": { + "X": 0, + "Y": 80 + }, + "Mobility": 0.85, + "Delay": 0.85, + "Acceleration": 1.2, + "Radius": 10 + }, + { + "Position": { + "X": 0, + "Y": 90 + }, + "Mobility": 0.85, + "Delay": 0.85, + "Acceleration": 1.2, + "Radius": 10 + }, + { + "Position": { + "X": 0, + "Y": 100 + }, + "Mobility": 0.85, + "Delay": 0.85, + "Acceleration": 1.2, + "Radius": 10 + } + ], + "Normalization": { + "Position": { + "Minimum": -10, + "Default": 0, + "Maximum": 10 + }, + "Angle": { + "Minimum": -10, + "Default": 0, + "Maximum": 10 + } + } + }, + { + "Id": "PhysicsSetting2", + "Input": [ + { + "Source": { + "Target": "Parameter", + "Id": "ParamAngleX" + }, + "Weight": 60, + "Type": "X", + "Reflect": false + }, + { + "Source": { + "Target": "Parameter", + "Id": "ParamAngleZ" + }, + "Weight": 60, + "Type": "Angle", + "Reflect": false + }, + { + "Source": { + "Target": "Parameter", + "Id": "ParamBodyAngleX" + }, + "Weight": 40, + "Type": "X", + "Reflect": false + }, + { + "Source": { + "Target": "Parameter", + "Id": "ParamBodyAngleZ" + }, + "Weight": 40, + "Type": "Angle", + "Reflect": false + } + ], + "Output": [ + { + "Destination": { + "Target": "Parameter", + "Id": "Param_Angle_Rotation10" + }, + "VertexIndex": 1, + "Scale": 7.857, + "Weight": 100, + "Type": "Angle", + "Reflect": false + }, + { + "Destination": { + "Target": "Parameter", + "Id": "Param_Angle_Rotation11" + }, + "VertexIndex": 2, + "Scale": 8.996, + "Weight": 100, + "Type": "Angle", + "Reflect": false + }, + { + "Destination": { + "Target": "Parameter", + "Id": "Param_Angle_Rotation12" + }, + "VertexIndex": 1, + "Scale": 7.857, + "Weight": 100, + "Type": "Angle", + "Reflect": false + }, + { + "Destination": { + "Target": "Parameter", + "Id": "Param_Angle_Rotation13" + }, + "VertexIndex": 2, + "Scale": 8.996, + "Weight": 100, + "Type": "Angle", + "Reflect": false + } + ], + "Vertices": [ + { + "Position": { + "X": 0, + "Y": 0 + }, + "Mobility": 1, + "Delay": 1, + "Acceleration": 1, + "Radius": 0 + }, + { + "Position": { + "X": 0, + "Y": 10 + }, + "Mobility": 0.97, + "Delay": 0.8, + "Acceleration": 0.5, + "Radius": 10 + }, + { + "Position": { + "X": 0, + "Y": 18 + }, + "Mobility": 0.95, + "Delay": 0.8, + "Acceleration": 0.8, + "Radius": 8 + } + ], + "Normalization": { + "Position": { + "Minimum": -10, + "Default": 0, + "Maximum": 10 + }, + "Angle": { + "Minimum": -10, + "Default": 0, + "Maximum": 10 + } + } + }, + { + "Id": "PhysicsSetting3", + "Input": [ + { + "Source": { + "Target": "Parameter", + "Id": "ParamBodyAngleY" + }, + "Weight": 100, + "Type": "X", + "Reflect": false + }, + { + "Source": { + "Target": "Parameter", + "Id": "ParamBodyAngleZ" + }, + "Weight": 100, + "Type": "Angle", + "Reflect": false + } + ], + "Output": [ + { + "Destination": { + "Target": "Parameter", + "Id": "ParamArms" + }, + "VertexIndex": 1, + "Scale": 32.201, + "Weight": 100, + "Type": "Angle", + "Reflect": false + } + ], + "Vertices": [ + { + "Position": { + "X": 0, + "Y": 0 + }, + "Mobility": 1, + "Delay": 1, + "Acceleration": 1, + "Radius": 0 + }, + { + "Position": { + "X": 0, + "Y": 10 + }, + "Mobility": 0.9, + "Delay": 0.6, + "Acceleration": 1.5, + "Radius": 10 + } + ], + "Normalization": { + "Position": { + "Minimum": -10, + "Default": 0, + "Maximum": 10 + }, + "Angle": { + "Minimum": -10, + "Default": 0, + "Maximum": 10 + } + } + } + ] +} \ No newline at end of file diff --git a/LittleCat_Model/LittleCat_vts/LittleCat.vtube.json b/LittleCat_Model/LittleCat_vts/LittleCat.vtube.json new file mode 100644 index 0000000..ed2e6a7 --- /dev/null +++ b/LittleCat_Model/LittleCat_vts/LittleCat.vtube.json @@ -0,0 +1,427 @@ +{ + "Version": 1, + "Name": "LittleCat", + "ModelID": "bf2854026f4a4fa9a83f3afb6d1a4adb", + "FileReferences": { + "Icon": "LittleCatIcon.png", + "Model": "LittleCat.model3.json", + "IdleAnimation": "", + "IdleAnimationWhenTrackingLost": "" + }, + "ModelSaveMetadata": { + "LastSavedVTubeStudioVersion": "1.17.0", + "LastSavedPlatform": "Steam", + "LastSavedDateUTC": "Monday, 07 March 2022, 21:52:21", + "LastSavedDateLocalTime": "Monday, 07 March 2022, 15:52:21", + "LastSavedDateUnixMillisecondTimestamp": "1646689941624" + }, + "SavedModelPosition": { + "Position": { + "x": -2.444459915161133, + "y": -8.444442749023438, + "z": 0.0 + }, + "Rotation": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 1.0 + }, + "Scale": { + "x": 0.5478765368461609, + "y": 0.5478765368461609, + "z": 1.0 + } + }, + "ModelPositionMovement": { + "Use": false, + "X": 6, + "Y": 8, + "Z": 11, + "SmoothingX": 10, + "SmoothingY": 10, + "SmoothingZ": 10 + }, + "PhysicsSettings": { + "Use": true, + "UseLegacyPhysics": false, + "Live2DPhysicsFPS": 3, + "PhysicsStrength": 50, + "WindStrength": 0 + }, + "GeneralSettings": { + "TimeUntilTrackingLostIdleAnimation": 0.0 + }, + "ParameterSettings": [ + { + "Name": "Face Left/Right Rotation", + "Input": "FaceAngleX", + "InputRangeLower": -30.0, + "InputRangeUpper": 30.0, + "OutputRangeLower": -30.0, + "OutputRangeUpper": 30.0, + "ClampInput": false, + "ClampOutput": false, + "UseBlinking": false, + "UseBreathing": false, + "OutputLive2D": "ParamAngleX", + "Smoothing": 15, + "Minimized": false + }, + { + "Name": "Face Up/Down Rotation", + "Input": "FaceAngleY", + "InputRangeLower": -20.0, + "InputRangeUpper": 20.0, + "OutputRangeLower": -30.0, + "OutputRangeUpper": 30.0, + "ClampInput": false, + "ClampOutput": false, + "UseBlinking": false, + "UseBreathing": false, + "OutputLive2D": "ParamAngleY", + "Smoothing": 15, + "Minimized": false + }, + { + "Name": "Face Lean Rotation", + "Input": "FaceAngleZ", + "InputRangeLower": -30.0, + "InputRangeUpper": 30.0, + "OutputRangeLower": -30.0, + "OutputRangeUpper": 30.0, + "ClampInput": false, + "ClampOutput": false, + "UseBlinking": false, + "UseBreathing": false, + "OutputLive2D": "ParamAngleZ", + "Smoothing": 30, + "Minimized": false + }, + { + "Name": "Eye Open Left", + "Input": "EyeOpenLeft", + "InputRangeLower": 0.0, + "InputRangeUpper": 1.0, + "OutputRangeLower": 0.0, + "OutputRangeUpper": 1.899999976158142, + "ClampInput": false, + "ClampOutput": false, + "UseBlinking": false, + "UseBreathing": false, + "OutputLive2D": "ParamEyeLOpen", + "Smoothing": 10, + "Minimized": false + }, + { + "Name": "Eye Smile Left", + "Input": "MouthSmile", + "InputRangeLower": 0.0, + "InputRangeUpper": 1.0, + "OutputRangeLower": 0.0, + "OutputRangeUpper": 1.0, + "ClampInput": false, + "ClampOutput": false, + "UseBlinking": false, + "UseBreathing": false, + "OutputLive2D": "ParamEyeLSmile", + "Smoothing": 10, + "Minimized": false + }, + { + "Name": "Eye Open Right", + "Input": "EyeOpenRight", + "InputRangeLower": 0.0, + "InputRangeUpper": 1.0, + "OutputRangeLower": 0.0, + "OutputRangeUpper": 1.899999976158142, + "ClampInput": false, + "ClampOutput": false, + "UseBlinking": false, + "UseBreathing": false, + "OutputLive2D": "ParamEyeROpen", + "Smoothing": 10, + "Minimized": false + }, + { + "Name": "Eye Smile Right", + "Input": "MouthSmile", + "InputRangeLower": 0.0, + "InputRangeUpper": 1.0, + "OutputRangeLower": 0.0, + "OutputRangeUpper": 1.0, + "ClampInput": false, + "ClampOutput": false, + "UseBlinking": false, + "UseBreathing": false, + "OutputLive2D": "ParamEyeRSmile", + "Smoothing": 10, + "Minimized": false + }, + { + "Name": "Eye X", + "Input": "EyeRightX", + "InputRangeLower": -1.0, + "InputRangeUpper": 1.0, + "OutputRangeLower": 1.0, + "OutputRangeUpper": -1.0, + "ClampInput": false, + "ClampOutput": false, + "UseBlinking": false, + "UseBreathing": false, + "OutputLive2D": "ParamEyeBallX", + "Smoothing": 8, + "Minimized": false + }, + { + "Name": "Eye Y", + "Input": "EyeRightY", + "InputRangeLower": -1.0, + "InputRangeUpper": 1.0, + "OutputRangeLower": -1.0, + "OutputRangeUpper": 1.0, + "ClampInput": false, + "ClampOutput": false, + "UseBlinking": false, + "UseBreathing": false, + "OutputLive2D": "ParamEyeBallY", + "Smoothing": 8, + "Minimized": false + }, + { + "Name": "Brow Height Left", + "Input": "Brows", + "InputRangeLower": 0.0, + "InputRangeUpper": 1.0, + "OutputRangeLower": -1.0, + "OutputRangeUpper": 1.0, + "ClampInput": false, + "ClampOutput": false, + "UseBlinking": false, + "UseBreathing": false, + "OutputLive2D": "ParamBrowLY", + "Smoothing": 10, + "Minimized": false + }, + { + "Name": "Brow Height Right", + "Input": "Brows", + "InputRangeLower": 0.0, + "InputRangeUpper": 1.0, + "OutputRangeLower": -1.0, + "OutputRangeUpper": 1.0, + "ClampInput": false, + "ClampOutput": false, + "UseBlinking": false, + "UseBreathing": false, + "OutputLive2D": "ParamBrowRY", + "Smoothing": 10, + "Minimized": false + }, + { + "Name": "Brow Form Left", + "Input": "Brows", + "InputRangeLower": 0.0, + "InputRangeUpper": 1.0, + "OutputRangeLower": -1.0, + "OutputRangeUpper": 1.0, + "ClampInput": false, + "ClampOutput": false, + "UseBlinking": false, + "UseBreathing": false, + "OutputLive2D": "ParamBrowLForm", + "Smoothing": 15, + "Minimized": false + }, + { + "Name": "Brow Form Right", + "Input": "Brows", + "InputRangeLower": 0.0, + "InputRangeUpper": 1.0, + "OutputRangeLower": -1.0, + "OutputRangeUpper": 1.0, + "ClampInput": false, + "ClampOutput": false, + "UseBlinking": false, + "UseBreathing": false, + "OutputLive2D": "ParamBrowRForm", + "Smoothing": 15, + "Minimized": false + }, + { + "Name": "Mouth Smile", + "Input": "MouthSmile", + "InputRangeLower": 0.0, + "InputRangeUpper": 1.0, + "OutputRangeLower": -1.0, + "OutputRangeUpper": 1.0, + "ClampInput": false, + "ClampOutput": false, + "UseBlinking": false, + "UseBreathing": false, + "OutputLive2D": "ParamMouthForm", + "Smoothing": 0, + "Minimized": false + }, + { + "Name": "Mouth Open", + "Input": "MouthOpen", + "InputRangeLower": 0.20000000298023225, + "InputRangeUpper": 1.0, + "OutputRangeLower": 0.0, + "OutputRangeUpper": 2.0999999046325685, + "ClampInput": false, + "ClampOutput": false, + "UseBlinking": false, + "UseBreathing": false, + "OutputLive2D": "ParamMouthOpenY", + "Smoothing": 0, + "Minimized": false + }, + { + "Name": "Blush when smiling", + "Input": "MouthSmile", + "InputRangeLower": 0.0, + "InputRangeUpper": 1.0, + "OutputRangeLower": 0.5, + "OutputRangeUpper": 1.0, + "ClampInput": false, + "ClampOutput": false, + "UseBlinking": false, + "UseBreathing": false, + "OutputLive2D": "ParamCheek", + "Smoothing": 45, + "Minimized": false + }, + { + "Name": "Body Rotation X", + "Input": "FaceAngleX", + "InputRangeLower": -30.0, + "InputRangeUpper": 30.0, + "OutputRangeLower": -10.0, + "OutputRangeUpper": 10.0, + "ClampInput": false, + "ClampOutput": false, + "UseBlinking": false, + "UseBreathing": false, + "OutputLive2D": "ParamBodyAngleX", + "Smoothing": 20, + "Minimized": false + }, + { + "Name": "Body Rotation Y", + "Input": "FaceAngleY", + "InputRangeLower": -15.0, + "InputRangeUpper": 20.0, + "OutputRangeLower": -10.0, + "OutputRangeUpper": 10.0, + "ClampInput": false, + "ClampOutput": false, + "UseBlinking": false, + "UseBreathing": false, + "OutputLive2D": "ParamBodyAngleY", + "Smoothing": 20, + "Minimized": false + }, + { + "Name": "Body Rotation Z", + "Input": "FaceAngleZ", + "InputRangeLower": -30.0, + "InputRangeUpper": 30.0, + "OutputRangeLower": -10.0, + "OutputRangeUpper": 10.0, + "ClampInput": false, + "ClampOutput": false, + "UseBlinking": false, + "UseBreathing": false, + "OutputLive2D": "ParamBodyAngleZ", + "Smoothing": 20, + "Minimized": false + }, + { + "Name": "Auto Breath", + "Input": "", + "InputRangeLower": 0.0, + "InputRangeUpper": 1.0, + "OutputRangeLower": 0.0, + "OutputRangeUpper": 1.0, + "ClampInput": false, + "ClampOutput": false, + "UseBlinking": false, + "UseBreathing": true, + "OutputLive2D": "ParamBreath", + "Smoothing": 0, + "Minimized": false + } + ], + "Hotkeys": [ + { + "HotkeyID": "0f83ae40507a40a29e008f163be5ec6e", + "Name": "change texture", + "Action": "ReloadTextures", + "File": "", + "Position": { + "X": 0.0, + "Y": 0.0, + "Z": 0.0, + "Rotation": 0.0 + }, + "ColorOverlay": { + "On": false, + "Display": -1, + "WindowName": "", + "IncludeLeft": false, + "IncludeMid": false, + "IncludeRight": false, + "BaseValue": 0, + "OverlayValue": 0, + "Smoothing": 0, + "IncludeItems": false + }, + "HandGestureSettings": { + "GestureLeft": "", + "GestureRight": "", + "GestureCombinator": "AND", + "AllowMirroredGesture": false, + "DeactivateExpWhenGestureNotDetected": false, + "SecondsUntilDetection": 0.5, + "SecondsDetected": 0.0, + "PercentDetected": 0.0 + }, + "Triggers": { + "Trigger1": "N1", + "Trigger2": "", + "ScreenButton": -1 + }, + "IsGlobal": true, + "IsActive": true, + "Minimized": false, + "StopsOnLastFrame": false, + "DeactivateAfterKeyUp": false, + "DeactivateAfterSeconds": false, + "DeactivateAfterSecondsAmount": 10.0, + "FadeSecondsAmount": 0.5, + "OnScreenHotkeyColor": { + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + } + } + ], + "HotkeySettings": { + "UseOnScreenHotkeys": false, + "UseKeyboardHotkeys": true, + "SendOnScreenHotkeysToPC": true, + "OnScreenHotkeyAlpha": 75 + }, + "ArtMeshDetails": { + "ArtMeshesExcludedFromPinning": [], + "ArtMeshesThatDeleteItemsOnDrop": [], + "ArtMeshSceneLightingMultipliers": [] + }, + "PhysicsCustomizationSettings": { + "PhysicsMultipliersPerPhysicsGroup": [], + "WindMultipliersPerPhysicsGroup": [] + } +} \ No newline at end of file diff --git a/LittleCat_Model/LittleCat_vts/LittleCatIcon.png.png b/LittleCat_Model/LittleCat_vts/LittleCatIcon.png.png new file mode 100644 index 0000000..2912129 Binary files /dev/null and b/LittleCat_Model/LittleCat_vts/LittleCatIcon.png.png differ diff --git a/LittleCat_Model/LittleCat_vts/items_pinned_to_model.json b/LittleCat_Model/LittleCat_vts/items_pinned_to_model.json new file mode 100644 index 0000000..801b82b --- /dev/null +++ b/LittleCat_Model/LittleCat_vts/items_pinned_to_model.json @@ -0,0 +1,14 @@ +{ + "FileMetadata": { + "LastSavedVTubeStudioVersion": "1.17.0", + "LastSavedPlatform": "Steam", + "LastSavedDateUTC": "Monday, 07 March 2022, 21:52:21", + "LastSavedDateLocalTime": "Monday, 07 March 2022, 15:52:21", + "LastSavedDateUnixMillisecondTimestamp": "1646689941998" + }, + "SceneName": "", + "SceneGroupName": "", + "SceneModel": "", + "SceneID": "", + "Items": [] +} \ No newline at end of file diff --git a/LittleCat_Model/README.txt b/LittleCat_Model/README.txt new file mode 100644 index 0000000..c1a101d --- /dev/null +++ b/LittleCat_Model/README.txt @@ -0,0 +1,3 @@ +This model was made by Ezri! + +These files can be edited and used in personal or commercial projects. The model itself cannot be resold even if edited. diff --git a/frontend/public/live2d/models/little-cat/LittleCat.2048/texture_00.png b/frontend/public/live2d/models/little-cat/LittleCat.2048/texture_00.png new file mode 100644 index 0000000..f46a146 Binary files /dev/null and b/frontend/public/live2d/models/little-cat/LittleCat.2048/texture_00.png differ diff --git a/frontend/public/live2d/models/little-cat/LittleCat.cdi3.json b/frontend/public/live2d/models/little-cat/LittleCat.cdi3.json new file mode 100644 index 0000000..84a0c7c --- /dev/null +++ b/frontend/public/live2d/models/little-cat/LittleCat.cdi3.json @@ -0,0 +1,271 @@ +{ + "Version": 3, + "Parameters": [ + { + "Id": "ParamAngleX", + "GroupId": "", + "Name": "Angle X" + }, + { + "Id": "ParamAngleY", + "GroupId": "", + "Name": "Angle Y" + }, + { + "Id": "ParamAngleZ", + "GroupId": "", + "Name": "Angle Z" + }, + { + "Id": "ParamEyeLOpen", + "GroupId": "", + "Name": "EyeL Open" + }, + { + "Id": "ParamEyeLSmile", + "GroupId": "", + "Name": "EyeL Smile" + }, + { + "Id": "ParamEyeROpen", + "GroupId": "", + "Name": "EyeR Open" + }, + { + "Id": "ParamEyeRSmile", + "GroupId": "", + "Name": "EyeR Smile" + }, + { + "Id": "ParamEyeBallX", + "GroupId": "", + "Name": "Eyeball X" + }, + { + "Id": "ParamEyeBallY", + "GroupId": "", + "Name": "Eyeball Y" + }, + { + "Id": "ParamBrowLY", + "GroupId": "", + "Name": "BrowL Y" + }, + { + "Id": "ParamBrowRY", + "GroupId": "", + "Name": "BrowR Y" + }, + { + "Id": "ParamBrowLX", + "GroupId": "", + "Name": "BrowL X" + }, + { + "Id": "ParamBrowRX", + "GroupId": "", + "Name": "BrowR X" + }, + { + "Id": "ParamBrowLAngle", + "GroupId": "", + "Name": "BrowL Angle" + }, + { + "Id": "ParamBrowRAngle", + "GroupId": "", + "Name": "BrowR Angle" + }, + { + "Id": "ParamBrowLForm", + "GroupId": "", + "Name": "BrowL Form" + }, + { + "Id": "ParamBrowRForm", + "GroupId": "", + "Name": "BrowR Form" + }, + { + "Id": "ParamMouthForm", + "GroupId": "", + "Name": "Mouth Form" + }, + { + "Id": "ParamMouthOpenY", + "GroupId": "", + "Name": "Mouth Open" + }, + { + "Id": "ParamCheek", + "GroupId": "", + "Name": "Cheek" + }, + { + "Id": "ParamBodyAngleX", + "GroupId": "", + "Name": "Body X" + }, + { + "Id": "ParamBodyAngleY", + "GroupId": "", + "Name": "Body Y" + }, + { + "Id": "ParamBodyAngleZ", + "GroupId": "", + "Name": "Body Z" + }, + { + "Id": "ParamBreath", + "GroupId": "", + "Name": "Breathing" + }, + { + "Id": "ParamArms", + "GroupId": "", + "Name": "Arms" + }, + { + "Id": "Param_Angle_Rotation2", + "GroupId": "ParamGroup", + "Name": "[0]tail wiggle" + }, + { + "Id": "Param_Angle_Rotation3", + "GroupId": "ParamGroup", + "Name": "[1]tail wiggle" + }, + { + "Id": "Param_Angle_Rotation4", + "GroupId": "ParamGroup", + "Name": "[2]tail wiggle" + }, + { + "Id": "Param_Angle_Rotation5", + "GroupId": "ParamGroup", + "Name": "[3]tail wiggle" + }, + { + "Id": "Param_Angle_Rotation6", + "GroupId": "ParamGroup", + "Name": "[4]tail wiggle" + }, + { + "Id": "Param_Angle_Rotation7", + "GroupId": "ParamGroup", + "Name": "[5]tail wiggle" + }, + { + "Id": "Param_Angle_Rotation10", + "GroupId": "ParamGroup2", + "Name": "[0]ear L wiggle" + }, + { + "Id": "Param_Angle_Rotation11", + "GroupId": "ParamGroup2", + "Name": "[1]ear L wiggle" + }, + { + "Id": "Param_Angle_Rotation12", + "GroupId": "ParamGroup3", + "Name": "[0]ear R wiggle" + }, + { + "Id": "Param_Angle_Rotation13", + "GroupId": "ParamGroup3", + "Name": "[1]ear R wiggle" + } + ], + "ParameterGroups": [ + { + "Id": "ParamGroup", + "GroupId": "", + "Name": "tail wiggle" + }, + { + "Id": "ParamGroup2", + "GroupId": "", + "Name": "ear L wiggle" + }, + { + "Id": "ParamGroup3", + "GroupId": "", + "Name": "ear L wiggle" + } + ], + "Parts": [ + { + "Id": "Part", + "Name": "ear L" + }, + { + "Id": "headfolder", + "Name": "head" + }, + { + "Id": "Part3", + "Name": "ear R" + }, + { + "Id": "tail_Skinning", + "Name": "tail(Skinning)" + }, + { + "Id": "PartSketch0", + "Name": "[ Guide Image]" + }, + { + "Id": "ArtMesh_Skinning2", + "Name": "inner ear L(Skinning)" + }, + { + "Id": "ArtMesh_Skinning", + "Name": "inner ear L(Skinning)" + }, + { + "Id": "ArtMesh0_Skinning2", + "Name": "ear L(Skinning)" + }, + { + "Id": "ArtMesh0_Skinning", + "Name": "ear L(Skinning)" + }, + { + "Id": "face", + "Name": "face" + }, + { + "Id": "ArtMesh4_Skinning2", + "Name": "inner ear R(Skinning)" + }, + { + "Id": "ArtMesh4_Skinning", + "Name": "inner ear R(Skinning)" + }, + { + "Id": "ArtMesh5_Skinning2", + "Name": "ear R(Skinning)" + }, + { + "Id": "ArtMesh5_Skinning", + "Name": "ear R(Skinning)" + }, + { + "Id": "mouth", + "Name": "mouth" + }, + { + "Id": "base", + "Name": "base" + }, + { + "Id": "open", + "Name": "open" + }, + { + "Id": "Part2", + "Name": "inner mouth" + } + ] +} \ No newline at end of file diff --git a/frontend/public/live2d/models/little-cat/LittleCat.moc3 b/frontend/public/live2d/models/little-cat/LittleCat.moc3 new file mode 100644 index 0000000..8e0dddd Binary files /dev/null and b/frontend/public/live2d/models/little-cat/LittleCat.moc3 differ diff --git a/frontend/public/live2d/models/little-cat/LittleCat.model3.json b/frontend/public/live2d/models/little-cat/LittleCat.model3.json new file mode 100644 index 0000000..b0cc758 --- /dev/null +++ b/frontend/public/live2d/models/little-cat/LittleCat.model3.json @@ -0,0 +1,29 @@ +{ + "Version": 3, + "FileReferences": { + "Moc": "LittleCat.moc3", + "Textures": [ + "LittleCat.2048/texture_00.png" + ], + "Physics": "LittleCat.physics3.json", + "DisplayInfo": "LittleCat.cdi3.json" + }, + "Groups": [ + { + "Target": "Parameter", + "Name": "EyeBlink", + "Ids": [ + "ParamEyeLOpen", + "ParamEyeROpen" + ] + }, + { + "Target": "Parameter", + "Name": "LipSync", + "Ids": [ + "ParamMouthForm", + "ParamMouthOpenY" + ] + } + ] +} \ No newline at end of file diff --git a/frontend/public/live2d/models/little-cat/LittleCat.physics3.json b/frontend/public/live2d/models/little-cat/LittleCat.physics3.json new file mode 100644 index 0000000..3b56d8f --- /dev/null +++ b/frontend/public/live2d/models/little-cat/LittleCat.physics3.json @@ -0,0 +1,451 @@ +{ + "Version": 3, + "Meta": { + "PhysicsSettingCount": 3, + "TotalInputCount": 8, + "TotalOutputCount": 11, + "VertexCount": 16, + "EffectiveForces": { + "Gravity": { + "X": 0, + "Y": -1 + }, + "Wind": { + "X": 0, + "Y": 0 + } + }, + "PhysicsDictionary": [ + { + "Id": "PhysicsSetting1", + "Name": "tail wiggle" + }, + { + "Id": "PhysicsSetting2", + "Name": "ear wiggle" + }, + { + "Id": "PhysicsSetting3", + "Name": "arms" + } + ] + }, + "PhysicsSettings": [ + { + "Id": "PhysicsSetting1", + "Input": [ + { + "Source": { + "Target": "Parameter", + "Id": "ParamBodyAngleX" + }, + "Weight": 100, + "Type": "X", + "Reflect": false + }, + { + "Source": { + "Target": "Parameter", + "Id": "ParamBodyAngleZ" + }, + "Weight": 100, + "Type": "Angle", + "Reflect": false + } + ], + "Output": [ + { + "Destination": { + "Target": "Parameter", + "Id": "Param_Angle_Rotation2" + }, + "VertexIndex": 1, + "Scale": 33.072, + "Weight": 100, + "Type": "Angle", + "Reflect": false + }, + { + "Destination": { + "Target": "Parameter", + "Id": "Param_Angle_Rotation3" + }, + "VertexIndex": 2, + "Scale": 33.978, + "Weight": 100, + "Type": "Angle", + "Reflect": false + }, + { + "Destination": { + "Target": "Parameter", + "Id": "Param_Angle_Rotation4" + }, + "VertexIndex": 3, + "Scale": 34.41, + "Weight": 100, + "Type": "Angle", + "Reflect": false + }, + { + "Destination": { + "Target": "Parameter", + "Id": "Param_Angle_Rotation5" + }, + "VertexIndex": 4, + "Scale": 32.674, + "Weight": 100, + "Type": "Angle", + "Reflect": false + }, + { + "Destination": { + "Target": "Parameter", + "Id": "Param_Angle_Rotation6" + }, + "VertexIndex": 5, + "Scale": 27.941, + "Weight": 100, + "Type": "Angle", + "Reflect": false + }, + { + "Destination": { + "Target": "Parameter", + "Id": "Param_Angle_Rotation7" + }, + "VertexIndex": 6, + "Scale": 24.302, + "Weight": 100, + "Type": "Angle", + "Reflect": false + } + ], + "Vertices": [ + { + "Position": { + "X": 0, + "Y": 0 + }, + "Mobility": 1, + "Delay": 1, + "Acceleration": 1, + "Radius": 0 + }, + { + "Position": { + "X": 0, + "Y": 10 + }, + "Mobility": 0.85, + "Delay": 0.85, + "Acceleration": 1.2, + "Radius": 10 + }, + { + "Position": { + "X": 0, + "Y": 20 + }, + "Mobility": 0.85, + "Delay": 0.85, + "Acceleration": 1.2, + "Radius": 10 + }, + { + "Position": { + "X": 0, + "Y": 30 + }, + "Mobility": 0.85, + "Delay": 0.85, + "Acceleration": 1.2, + "Radius": 10 + }, + { + "Position": { + "X": 0, + "Y": 40 + }, + "Mobility": 0.85, + "Delay": 0.85, + "Acceleration": 1.2, + "Radius": 10 + }, + { + "Position": { + "X": 0, + "Y": 50 + }, + "Mobility": 0.85, + "Delay": 0.85, + "Acceleration": 1.2, + "Radius": 10 + }, + { + "Position": { + "X": 0, + "Y": 60 + }, + "Mobility": 0.85, + "Delay": 0.85, + "Acceleration": 1.2, + "Radius": 10 + }, + { + "Position": { + "X": 0, + "Y": 70 + }, + "Mobility": 0.85, + "Delay": 0.85, + "Acceleration": 1.2, + "Radius": 10 + }, + { + "Position": { + "X": 0, + "Y": 80 + }, + "Mobility": 0.85, + "Delay": 0.85, + "Acceleration": 1.2, + "Radius": 10 + }, + { + "Position": { + "X": 0, + "Y": 90 + }, + "Mobility": 0.85, + "Delay": 0.85, + "Acceleration": 1.2, + "Radius": 10 + }, + { + "Position": { + "X": 0, + "Y": 100 + }, + "Mobility": 0.85, + "Delay": 0.85, + "Acceleration": 1.2, + "Radius": 10 + } + ], + "Normalization": { + "Position": { + "Minimum": -10, + "Default": 0, + "Maximum": 10 + }, + "Angle": { + "Minimum": -10, + "Default": 0, + "Maximum": 10 + } + } + }, + { + "Id": "PhysicsSetting2", + "Input": [ + { + "Source": { + "Target": "Parameter", + "Id": "ParamAngleX" + }, + "Weight": 60, + "Type": "X", + "Reflect": false + }, + { + "Source": { + "Target": "Parameter", + "Id": "ParamAngleZ" + }, + "Weight": 60, + "Type": "Angle", + "Reflect": false + }, + { + "Source": { + "Target": "Parameter", + "Id": "ParamBodyAngleX" + }, + "Weight": 40, + "Type": "X", + "Reflect": false + }, + { + "Source": { + "Target": "Parameter", + "Id": "ParamBodyAngleZ" + }, + "Weight": 40, + "Type": "Angle", + "Reflect": false + } + ], + "Output": [ + { + "Destination": { + "Target": "Parameter", + "Id": "Param_Angle_Rotation10" + }, + "VertexIndex": 1, + "Scale": 7.857, + "Weight": 100, + "Type": "Angle", + "Reflect": false + }, + { + "Destination": { + "Target": "Parameter", + "Id": "Param_Angle_Rotation11" + }, + "VertexIndex": 2, + "Scale": 8.996, + "Weight": 100, + "Type": "Angle", + "Reflect": false + }, + { + "Destination": { + "Target": "Parameter", + "Id": "Param_Angle_Rotation12" + }, + "VertexIndex": 1, + "Scale": 7.857, + "Weight": 100, + "Type": "Angle", + "Reflect": false + }, + { + "Destination": { + "Target": "Parameter", + "Id": "Param_Angle_Rotation13" + }, + "VertexIndex": 2, + "Scale": 8.996, + "Weight": 100, + "Type": "Angle", + "Reflect": false + } + ], + "Vertices": [ + { + "Position": { + "X": 0, + "Y": 0 + }, + "Mobility": 1, + "Delay": 1, + "Acceleration": 1, + "Radius": 0 + }, + { + "Position": { + "X": 0, + "Y": 10 + }, + "Mobility": 0.97, + "Delay": 0.8, + "Acceleration": 0.5, + "Radius": 10 + }, + { + "Position": { + "X": 0, + "Y": 18 + }, + "Mobility": 0.95, + "Delay": 0.8, + "Acceleration": 0.8, + "Radius": 8 + } + ], + "Normalization": { + "Position": { + "Minimum": -10, + "Default": 0, + "Maximum": 10 + }, + "Angle": { + "Minimum": -10, + "Default": 0, + "Maximum": 10 + } + } + }, + { + "Id": "PhysicsSetting3", + "Input": [ + { + "Source": { + "Target": "Parameter", + "Id": "ParamBodyAngleY" + }, + "Weight": 100, + "Type": "X", + "Reflect": false + }, + { + "Source": { + "Target": "Parameter", + "Id": "ParamBodyAngleZ" + }, + "Weight": 100, + "Type": "Angle", + "Reflect": false + } + ], + "Output": [ + { + "Destination": { + "Target": "Parameter", + "Id": "ParamArms" + }, + "VertexIndex": 1, + "Scale": 32.201, + "Weight": 100, + "Type": "Angle", + "Reflect": false + } + ], + "Vertices": [ + { + "Position": { + "X": 0, + "Y": 0 + }, + "Mobility": 1, + "Delay": 1, + "Acceleration": 1, + "Radius": 0 + }, + { + "Position": { + "X": 0, + "Y": 10 + }, + "Mobility": 0.9, + "Delay": 0.6, + "Acceleration": 1.5, + "Radius": 10 + } + ], + "Normalization": { + "Position": { + "Minimum": -10, + "Default": 0, + "Maximum": 10 + }, + "Angle": { + "Minimum": -10, + "Default": 0, + "Maximum": 10 + } + } + } + ] +} \ No newline at end of file diff --git a/frontend/src/components/Live2DCat.tsx b/frontend/src/components/Live2DCat.tsx new file mode 100644 index 0000000..913b941 --- /dev/null +++ b/frontend/src/components/Live2DCat.tsx @@ -0,0 +1,87 @@ +import { useEffect, useRef } from 'react'; + +interface Props { + className?: string; +} + +export default function Live2DCat({ className }: Props) { + const canvasRef = useRef(null); + + useEffect(() => { + let mounted = true; + const canvas = canvasRef.current; + if (!canvas) return; + + let app: any = null; + + const init = async () => { + try { + await loadScript('/live2d/cubism/live2dcubismcore.min.js'); + const { Application, Ticker } = await import('pixi.js'); + const { Live2DModel } = await import('pixi-live2d-display/cubism4'); + (Live2DModel as any).registerTicker(Ticker as any); + + const w = canvas.clientWidth || 120; + const h = canvas.clientHeight || 120; + + app = new Application({ + view: canvas, + width: w, + height: h, + antialias: true, + resolution: Math.min(window.devicePixelRatio || 1, 2), + backgroundAlpha: 0, + autoDensity: true, + }); + if (!mounted) { app.destroy(true); return; } + + const model = await Live2DModel.from('/live2d/models/little-cat/LittleCat.model3.json', { + autoInteract: false, + }); + if (!mounted) { app.destroy(true); return; } + + // Scale to fit the small canvas + const sw = app.screen.width; + const sh = app.screen.height; + const s = Math.min((sw * 0.85) / model.width, (sh * 0.85) / model.height); + model.scale.set(s); + model.anchor.set(0.5, 0.5); + model.position.set(sw / 2, sh / 2); + + app.stage.addChild(model as any); + (model as any).isInteractive = () => false; + + try { model.motion('Idle'); } catch { /* */ } + + } catch (e) { + console.warn('[Live2DCat]', e); + } + }; + + init(); + + return () => { + mounted = false; + if (app) { app.destroy(true, { children: true }); } + }; + }, []); + + return ( + + ); +} + +function loadScript(src: string): Promise { + return new Promise((resolve, reject) => { + if (document.querySelector('script[src="' + src + '"]')) { resolve(); return; } + const s = document.createElement('script'); + s.src = src; + s.onload = () => resolve(); + s.onerror = () => reject(new Error('Failed ' + src)); + document.head.appendChild(s); + }); +} diff --git a/frontend/src/components/PetZone.tsx b/frontend/src/components/PetZone.tsx index 7c241c5..826a4f7 100644 --- a/frontend/src/components/PetZone.tsx +++ b/frontend/src/components/PetZone.tsx @@ -1,79 +1,17 @@ +import Live2DCat from './Live2DCat'; + export default function PetZone() { return ( -
+

🐱 Pet Zone

-
- {/* Orange fluffy cat */} -
-
- {/* Body */} -
- {/* Head */} -
- {/* Ears */} -
-
- {/* Eyes */} -
-
- {/* Nose */} -
-
- {/* Tail */} -
-
- {/* Paws */} -
-
-
-
-
+
+
+ Mochi
- - {/* Black shorthair cat - sleeping */} -
-
- {/* Sleeping body (curled up) */} -
- {/* Head tucked in */} -
- {/* Ears */} -
-
- {/* Closed eyes (sleeping) */} -
-
-
- {/* Tail curled around */} -
-
- {/* ZZZ */} -
Z z z
-
- Luna -
- -
); } diff --git a/frontend/tsconfig.tsbuildinfo b/frontend/tsconfig.tsbuildinfo index 13fd1c6..4f20b40 100644 --- a/frontend/tsconfig.tsbuildinfo +++ b/frontend/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"root":["./src/App.tsx","./src/main.tsx","./src/vite-env.d.ts","./src/components/AnimatedAvatar.tsx","./src/components/BackgroundScene.tsx","./src/components/ChatBubble.tsx","./src/components/Clock.tsx","./src/components/KiraAvatar.tsx","./src/components/MusicPlayer.tsx","./src/components/Notes.tsx","./src/components/Particles.tsx","./src/components/PetZone.tsx","./src/components/Timer.tsx","./src/components/Toolbar.tsx","./src/components/Wardrobe.tsx","./src/components/WelcomeScreen.tsx","./src/components/WhiteNoise.tsx","./src/components/scenes.ts","./src/hooks/useConversation.ts","./src/types/index.ts"],"version":"6.0.3"} \ No newline at end of file +{"root":["./src/App.tsx","./src/main.tsx","./src/vite-env.d.ts","./src/components/AnimatedAvatar.tsx","./src/components/BackgroundScene.tsx","./src/components/ChatBubble.tsx","./src/components/Clock.tsx","./src/components/KiraAvatar.tsx","./src/components/Live2DCat.tsx","./src/components/MusicPlayer.tsx","./src/components/Notes.tsx","./src/components/Particles.tsx","./src/components/PetZone.tsx","./src/components/Timer.tsx","./src/components/Toolbar.tsx","./src/components/Wardrobe.tsx","./src/components/WelcomeScreen.tsx","./src/components/WhiteNoise.tsx","./src/components/scenes.ts","./src/hooks/useConversation.ts","./src/types/index.ts"],"version":"6.0.3"} \ No newline at end of file