This commit is contained in:
liuliang 2024-12-06 21:22:11 +08:00
commit 0c1bdde5fb
583 changed files with 21926 additions and 0 deletions

2
Robo-Bus-A31-HMI/.gitattributes vendored Normal file
View File

@ -0,0 +1,2 @@
# Normalize EOL for all files that Git considers text files.
* text=auto eol=lf

3
Robo-Bus-A31-HMI/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
# Godot 4+ specific ignores
.godot/
/android/

BIN
Robo-Bus-A31-HMI/1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://vc7lcwu566lf"
path="res://.godot/imported/1.png-515c813a180ba5fd2e61c8e75c4cac47.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://1.png"
dest_files=["res://.godot/imported/1.png-515c813a180ba5fd2e61c8e75c4cac47.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
Robo-Bus-A31-HMI/2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 488 KiB

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b4hvmp46shkxc"
path="res://.godot/imported/2.png-3f238cfe6181f9f93f40cee36336f408.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://2.png"
dest_files=["res://.godot/imported/2.png-3f238cfe6181f9f93f40cee36336f408.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
Robo-Bus-A31-HMI/3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 KiB

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://eevtiqj5g6a8"
path="res://.godot/imported/3.png-ab9dc1e38b41816b4ae4b69d0cb53034.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://3.png"
dest_files=["res://.godot/imported/3.png-ab9dc1e38b41816b4ae4b69d0cb53034.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Binary file not shown.

View File

@ -0,0 +1,36 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://db3ivfmlvkbqg"
path="res://.godot/imported/Bicycle.glb-7b22dc4f1eb32e50e16d0e8b7fd07a8a.scn"
[deps]
source_file="res://Dynamic_Object/Bicycle.glb"
dest_files=["res://.godot/imported/Bicycle.glb-7b22dc4f1eb32e50e16d0e8b7fd07a8a.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
_subresources={}
gltf/naming_version=1
gltf/embedded_image_handling=1

Binary file not shown.

View File

@ -0,0 +1,36 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://cd1q5jujl2h6y"
path="res://.godot/imported/Bus.glb-fe60e0df890d48d1293e2943fb144d70.scn"
[deps]
source_file="res://Dynamic_Object/Bus.glb"
dest_files=["res://.godot/imported/Bus.glb-fe60e0df890d48d1293e2943fb144d70.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
_subresources={}
gltf/naming_version=1
gltf/embedded_image_handling=1

Binary file not shown.

View File

@ -0,0 +1,36 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://b0pahemy1qkd1"
path="res://.godot/imported/Car.glb-1199dffb6d42a3eb0e80f00d1d342574.scn"
[deps]
source_file="res://Dynamic_Object/Car.glb"
dest_files=["res://.godot/imported/Car.glb-1199dffb6d42a3eb0e80f00d1d342574.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
_subresources={}
gltf/naming_version=1
gltf/embedded_image_handling=1

Binary file not shown.

View File

@ -0,0 +1,36 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://cq3lofbpgvlq8"
path="res://.godot/imported/Motorcycle.glb-9777eb19b01c9b701ab25f408cef0d30.scn"
[deps]
source_file="res://Dynamic_Object/Motorcycle.glb"
dest_files=["res://.godot/imported/Motorcycle.glb-9777eb19b01c9b701ab25f408cef0d30.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
_subresources={}
gltf/naming_version=1
gltf/embedded_image_handling=1

Binary file not shown.

View File

@ -0,0 +1,36 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://bi8j0il14h746"
path="res://.godot/imported/Pedestrian.glb-b872e0f0b4072ecfc88f38f1426d7b63.scn"
[deps]
source_file="res://Dynamic_Object/Pedestrian.glb"
dest_files=["res://.godot/imported/Pedestrian.glb-b872e0f0b4072ecfc88f38f1426d7b63.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=false
animation/import_rest_as_RESET=true
import_script/path=""
_subresources={}
gltf/naming_version=1
gltf/embedded_image_handling=1

Binary file not shown.

View File

@ -0,0 +1,36 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://bek1wj82xqvdh"
path="res://.godot/imported/Pickup.glb-e536c785cf1b94a694896d0f5b2cf312.scn"
[deps]
source_file="res://Dynamic_Object/Pickup.glb"
dest_files=["res://.godot/imported/Pickup.glb-e536c785cf1b94a694896d0f5b2cf312.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
_subresources={}
gltf/naming_version=1
gltf/embedded_image_handling=1

Binary file not shown.

View File

@ -0,0 +1,36 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://1351pckwh6t"
path="res://.godot/imported/SUV.glb-6da455626a784834a3f3a7c490528383.scn"
[deps]
source_file="res://Dynamic_Object/SUV.glb"
dest_files=["res://.godot/imported/SUV.glb-6da455626a784834a3f3a7c490528383.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
_subresources={}
gltf/naming_version=1
gltf/embedded_image_handling=1

Binary file not shown.

View File

@ -0,0 +1,36 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://b5s3ls8nk77vy"
path="res://.godot/imported/Trailer.glb-f6461775df4db598c9293eeedbbae283.scn"
[deps]
source_file="res://Dynamic_Object/Trailer.glb"
dest_files=["res://.godot/imported/Trailer.glb-f6461775df4db598c9293eeedbbae283.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
_subresources={}
gltf/naming_version=1
gltf/embedded_image_handling=1

View File

@ -0,0 +1,34 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://bbusvhna43th1"
path="res://.godot/imported/Kufam-Italic-VariableFont_wght.ttf-5bbb9ca1090612b1f7d12e0f121e2334.fontdata"
[deps]
source_file="res://Kufam_Noto_Sans_SC/Kufam/Kufam-Italic-VariableFont_wght.ttf"
dest_files=["res://.godot/imported/Kufam-Italic-VariableFont_wght.ttf-5bbb9ca1090612b1f7d12e0f121e2334.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

View File

@ -0,0 +1,34 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://ccwywo8sib6tv"
path="res://.godot/imported/Kufam-VariableFont_wght.ttf-b13fc257a3bcab7e21cb2b486d852f0c.fontdata"
[deps]
source_file="res://Kufam_Noto_Sans_SC/Kufam/Kufam-VariableFont_wght.ttf"
dest_files=["res://.godot/imported/Kufam-VariableFont_wght.ttf-b13fc257a3bcab7e21cb2b486d852f0c.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

View File

@ -0,0 +1,93 @@
Copyright 2019 The Kufam Project Authors (https://github.com/originaltype/kufam)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
https://openfontlicense.org
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

View File

@ -0,0 +1,75 @@
Kufam Variable Font
===================
This download contains Kufam as both variable fonts and static fonts.
Kufam is a variable font with this axis:
wght
This means all the styles are contained in these files:
Kufam/Kufam-VariableFont_wght.ttf
Kufam/Kufam-Italic-VariableFont_wght.ttf
If your app fully supports variable fonts, you can now pick intermediate styles
that arent available as static fonts. Not all apps support variable fonts, and
in those cases you can use the static font files for Kufam:
Kufam/static/Kufam-Regular.ttf
Kufam/static/Kufam-Medium.ttf
Kufam/static/Kufam-SemiBold.ttf
Kufam/static/Kufam-Bold.ttf
Kufam/static/Kufam-ExtraBold.ttf
Kufam/static/Kufam-Black.ttf
Kufam/static/Kufam-Italic.ttf
Kufam/static/Kufam-MediumItalic.ttf
Kufam/static/Kufam-SemiBoldItalic.ttf
Kufam/static/Kufam-BoldItalic.ttf
Kufam/static/Kufam-ExtraBoldItalic.ttf
Kufam/static/Kufam-BlackItalic.ttf
Get started
-----------
1. Install the font files you want to use
2. Use your app's font picker to view the font family and all the
available styles
Learn more about variable fonts
-------------------------------
https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts
https://variablefonts.typenetwork.com
https://medium.com/variable-fonts
In desktop apps
https://theblog.adobe.com/can-variable-fonts-illustrator-cc
https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts
Online
https://developers.google.com/fonts/docs/getting_started
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide
https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts
Installing fonts
MacOS: https://support.apple.com/en-us/HT201749
Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux
Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows
Android Apps
https://developers.google.com/fonts/docs/android
https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts
License
-------
Please read the full license text (OFL.txt) to understand the permissions,
restrictions and requirements for usage, redistribution, and modification.
You can use them in your products & projects print or digital,
commercial or otherwise.
This isn't legal advice, please consider consulting a lawyer and see the full
license for all details.

View File

@ -0,0 +1,34 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://d0i3iaapvxahv"
path="res://.godot/imported/Kufam-Black.ttf-bfbe779ecdc46664bf8ff0470bb82e37.fontdata"
[deps]
source_file="res://Kufam_Noto_Sans_SC/Kufam/static/Kufam-Black.ttf"
dest_files=["res://.godot/imported/Kufam-Black.ttf-bfbe779ecdc46664bf8ff0470bb82e37.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

View File

@ -0,0 +1,34 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://dfvgaxixxm4gp"
path="res://.godot/imported/Kufam-BlackItalic.ttf-64bc5fe49a4729ce3b53b30792618c7a.fontdata"
[deps]
source_file="res://Kufam_Noto_Sans_SC/Kufam/static/Kufam-BlackItalic.ttf"
dest_files=["res://.godot/imported/Kufam-BlackItalic.ttf-64bc5fe49a4729ce3b53b30792618c7a.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

View File

@ -0,0 +1,34 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://di8ag117eoaw"
path="res://.godot/imported/Kufam-Bold.ttf-dd41d02697e5d160566fd1bd490db0c4.fontdata"
[deps]
source_file="res://Kufam_Noto_Sans_SC/Kufam/static/Kufam-Bold.ttf"
dest_files=["res://.godot/imported/Kufam-Bold.ttf-dd41d02697e5d160566fd1bd490db0c4.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

View File

@ -0,0 +1,34 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://vyrosto82xp6"
path="res://.godot/imported/Kufam-BoldItalic.ttf-9025890eb35130179cb6159c1c537931.fontdata"
[deps]
source_file="res://Kufam_Noto_Sans_SC/Kufam/static/Kufam-BoldItalic.ttf"
dest_files=["res://.godot/imported/Kufam-BoldItalic.ttf-9025890eb35130179cb6159c1c537931.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

View File

@ -0,0 +1,34 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://ccm2bf1bbgyci"
path="res://.godot/imported/Kufam-ExtraBold.ttf-199c14423ab5b6cc4c3d4975baefde1d.fontdata"
[deps]
source_file="res://Kufam_Noto_Sans_SC/Kufam/static/Kufam-ExtraBold.ttf"
dest_files=["res://.godot/imported/Kufam-ExtraBold.ttf-199c14423ab5b6cc4c3d4975baefde1d.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

View File

@ -0,0 +1,34 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://bv5rpk6730v3e"
path="res://.godot/imported/Kufam-ExtraBoldItalic.ttf-d29f43e67b6d36a1f7432fe7a4e3f52d.fontdata"
[deps]
source_file="res://Kufam_Noto_Sans_SC/Kufam/static/Kufam-ExtraBoldItalic.ttf"
dest_files=["res://.godot/imported/Kufam-ExtraBoldItalic.ttf-d29f43e67b6d36a1f7432fe7a4e3f52d.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

View File

@ -0,0 +1,34 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://4jq66bgxkd7t"
path="res://.godot/imported/Kufam-Italic.ttf-eb6012ef8256280051e2465cc834cc5b.fontdata"
[deps]
source_file="res://Kufam_Noto_Sans_SC/Kufam/static/Kufam-Italic.ttf"
dest_files=["res://.godot/imported/Kufam-Italic.ttf-eb6012ef8256280051e2465cc834cc5b.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

View File

@ -0,0 +1,34 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://cpg1vosvn7oli"
path="res://.godot/imported/Kufam-Medium.ttf-a8f14b8674c29c9ed3f530c2182c0f78.fontdata"
[deps]
source_file="res://Kufam_Noto_Sans_SC/Kufam/static/Kufam-Medium.ttf"
dest_files=["res://.godot/imported/Kufam-Medium.ttf-a8f14b8674c29c9ed3f530c2182c0f78.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

View File

@ -0,0 +1,34 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://ciibu7wxvflsj"
path="res://.godot/imported/Kufam-MediumItalic.ttf-07325f4e7c7ea0f0f3e71b85d0e2e062.fontdata"
[deps]
source_file="res://Kufam_Noto_Sans_SC/Kufam/static/Kufam-MediumItalic.ttf"
dest_files=["res://.godot/imported/Kufam-MediumItalic.ttf-07325f4e7c7ea0f0f3e71b85d0e2e062.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

View File

@ -0,0 +1,34 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://byadmq30yb25l"
path="res://.godot/imported/Kufam-Regular.ttf-bde7f176458ab3c60fcd3da80a2852d0.fontdata"
[deps]
source_file="res://Kufam_Noto_Sans_SC/Kufam/static/Kufam-Regular.ttf"
dest_files=["res://.godot/imported/Kufam-Regular.ttf-bde7f176458ab3c60fcd3da80a2852d0.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

View File

@ -0,0 +1,34 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://c3vbvk1oyl7xs"
path="res://.godot/imported/Kufam-SemiBold.ttf-76d12897ebc03ec4261ea5935c279e9f.fontdata"
[deps]
source_file="res://Kufam_Noto_Sans_SC/Kufam/static/Kufam-SemiBold.ttf"
dest_files=["res://.godot/imported/Kufam-SemiBold.ttf-76d12897ebc03ec4261ea5935c279e9f.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

View File

@ -0,0 +1,34 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://b84qd0eoegome"
path="res://.godot/imported/Kufam-SemiBoldItalic.ttf-eaad58f99d12b43b9988b4dfb70a7e85.fontdata"
[deps]
source_file="res://Kufam_Noto_Sans_SC/Kufam/static/Kufam-SemiBoldItalic.ttf"
dest_files=["res://.godot/imported/Kufam-SemiBoldItalic.ttf-eaad58f99d12b43b9988b4dfb70a7e85.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

View File

@ -0,0 +1,34 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://cwuux0oou7b10"
path="res://.godot/imported/NotoSansSC-VariableFont_wght.ttf-e2a7b093c6dff22224cc8664d532195f.fontdata"
[deps]
source_file="res://Kufam_Noto_Sans_SC/Noto_Sans_SC/NotoSansSC-VariableFont_wght.ttf"
dest_files=["res://.godot/imported/NotoSansSC-VariableFont_wght.ttf-e2a7b093c6dff22224cc8664d532195f.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

View File

@ -0,0 +1,93 @@
Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
https://openfontlicense.org
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

View File

@ -0,0 +1,71 @@
Noto Sans SC Variable Font
==========================
This download contains Noto Sans SC as both a variable font and static fonts.
Noto Sans SC is a variable font with this axis:
wght
This means all the styles are contained in a single file:
Noto_Sans_SC/NotoSansSC-VariableFont_wght.ttf
If your app fully supports variable fonts, you can now pick intermediate styles
that arent available as static fonts. Not all apps support variable fonts, and
in those cases you can use the static font files for Noto Sans SC:
Noto_Sans_SC/static/NotoSansSC-Thin.ttf
Noto_Sans_SC/static/NotoSansSC-ExtraLight.ttf
Noto_Sans_SC/static/NotoSansSC-Light.ttf
Noto_Sans_SC/static/NotoSansSC-Regular.ttf
Noto_Sans_SC/static/NotoSansSC-Medium.ttf
Noto_Sans_SC/static/NotoSansSC-SemiBold.ttf
Noto_Sans_SC/static/NotoSansSC-Bold.ttf
Noto_Sans_SC/static/NotoSansSC-ExtraBold.ttf
Noto_Sans_SC/static/NotoSansSC-Black.ttf
Get started
-----------
1. Install the font files you want to use
2. Use your app's font picker to view the font family and all the
available styles
Learn more about variable fonts
-------------------------------
https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts
https://variablefonts.typenetwork.com
https://medium.com/variable-fonts
In desktop apps
https://theblog.adobe.com/can-variable-fonts-illustrator-cc
https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts
Online
https://developers.google.com/fonts/docs/getting_started
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide
https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts
Installing fonts
MacOS: https://support.apple.com/en-us/HT201749
Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux
Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows
Android Apps
https://developers.google.com/fonts/docs/android
https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts
License
-------
Please read the full license text (OFL.txt) to understand the permissions,
restrictions and requirements for usage, redistribution, and modification.
You can use them in your products & projects print or digital,
commercial or otherwise.
This isn't legal advice, please consider consulting a lawyer and see the full
license for all details.

View File

@ -0,0 +1,34 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://c17sdtiq4p16i"
path="res://.godot/imported/NotoSansSC-Black.ttf-f36ded5081eda040ef4e9f777deb8526.fontdata"
[deps]
source_file="res://Kufam_Noto_Sans_SC/Noto_Sans_SC/static/NotoSansSC-Black.ttf"
dest_files=["res://.godot/imported/NotoSansSC-Black.ttf-f36ded5081eda040ef4e9f777deb8526.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

View File

@ -0,0 +1,34 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://b2r1ob72c6onv"
path="res://.godot/imported/NotoSansSC-Bold.ttf-1a1bb2e3673abc48614cbf60c95f17c8.fontdata"
[deps]
source_file="res://Kufam_Noto_Sans_SC/Noto_Sans_SC/static/NotoSansSC-Bold.ttf"
dest_files=["res://.godot/imported/NotoSansSC-Bold.ttf-1a1bb2e3673abc48614cbf60c95f17c8.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

View File

@ -0,0 +1,34 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://bfqyp0bjgtbdk"
path="res://.godot/imported/NotoSansSC-ExtraBold.ttf-ef3c566097fe2000e515e8f9f9562fb9.fontdata"
[deps]
source_file="res://Kufam_Noto_Sans_SC/Noto_Sans_SC/static/NotoSansSC-ExtraBold.ttf"
dest_files=["res://.godot/imported/NotoSansSC-ExtraBold.ttf-ef3c566097fe2000e515e8f9f9562fb9.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

View File

@ -0,0 +1,34 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://bq10pwwlvvw0y"
path="res://.godot/imported/NotoSansSC-ExtraLight.ttf-1a2498d3350337d8e2d1e7be5d5dc97c.fontdata"
[deps]
source_file="res://Kufam_Noto_Sans_SC/Noto_Sans_SC/static/NotoSansSC-ExtraLight.ttf"
dest_files=["res://.godot/imported/NotoSansSC-ExtraLight.ttf-1a2498d3350337d8e2d1e7be5d5dc97c.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

View File

@ -0,0 +1,34 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://c3c3oe0qvg04o"
path="res://.godot/imported/NotoSansSC-Light.ttf-eefedc39b221600a95b937de600e73f2.fontdata"
[deps]
source_file="res://Kufam_Noto_Sans_SC/Noto_Sans_SC/static/NotoSansSC-Light.ttf"
dest_files=["res://.godot/imported/NotoSansSC-Light.ttf-eefedc39b221600a95b937de600e73f2.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

View File

@ -0,0 +1,34 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://b3k16i0c55ou6"
path="res://.godot/imported/NotoSansSC-Medium.ttf-3f3b684fddf2f33f62d059bfc01e5b2b.fontdata"
[deps]
source_file="res://Kufam_Noto_Sans_SC/Noto_Sans_SC/static/NotoSansSC-Medium.ttf"
dest_files=["res://.godot/imported/NotoSansSC-Medium.ttf-3f3b684fddf2f33f62d059bfc01e5b2b.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

View File

@ -0,0 +1,34 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://bykckr7idaxd2"
path="res://.godot/imported/NotoSansSC-Regular.ttf-6661af04f41c802e6bdb7c14e316ab13.fontdata"
[deps]
source_file="res://Kufam_Noto_Sans_SC/Noto_Sans_SC/static/NotoSansSC-Regular.ttf"
dest_files=["res://.godot/imported/NotoSansSC-Regular.ttf-6661af04f41c802e6bdb7c14e316ab13.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

View File

@ -0,0 +1,34 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://csn1jmpr87mxx"
path="res://.godot/imported/NotoSansSC-SemiBold.ttf-358d7a28d8c48eef2cb27f00de8b5f47.fontdata"
[deps]
source_file="res://Kufam_Noto_Sans_SC/Noto_Sans_SC/static/NotoSansSC-SemiBold.ttf"
dest_files=["res://.godot/imported/NotoSansSC-SemiBold.ttf-358d7a28d8c48eef2cb27f00de8b5f47.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

View File

@ -0,0 +1,34 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://eine874bfivu"
path="res://.godot/imported/NotoSansSC-Thin.ttf-d333cfcecaff7521deab60a00951ce8e.fontdata"
[deps]
source_file="res://Kufam_Noto_Sans_SC/Noto_Sans_SC/static/NotoSansSC-Thin.ttf"
dest_files=["res://.godot/imported/NotoSansSC-Thin.ttf-d333cfcecaff7521deab60a00951ce8e.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

Binary file not shown.

View File

@ -0,0 +1,36 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://doatdiucy54qq"
path="res://.godot/imported/robobus_a21_v11.glb-c1f47bc9464751f12812c25eab10bbd3.scn"
[deps]
source_file="res://Vehicle/robobus_a21_v11.glb"
dest_files=["res://.godot/imported/robobus_a21_v11.glb-c1f47bc9464751f12812c25eab10bbd3.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
_subresources={}
gltf/naming_version=1
gltf/embedded_image_handling=1

View File

@ -0,0 +1,22 @@
extends HSlider
@export var texture1 :Texture= null;
@export var texture2 :Texture= null;
func _physics_process(delta: float) -> void:
if value > max_value/2:
set("theme_override_icons/grabber",texture1)
set("theme_override_icons/grabber_highlight",texture1)
else:
set("theme_override_icons/grabber",texture2)
set("theme_override_icons/grabber_highlight",texture2)
func _on_drag_ended(value_changed: bool) -> void:
if value > max_value/2:
var tween = get_tree().create_tween()
tween.tween_property(self, "value", max_value, 0.1)
else:
var tween = get_tree().create_tween()
tween.tween_property(self, "value", 0, 0.1)
pass # Replace with function body.

View File

@ -0,0 +1,198 @@
extends Node
const PATH_ROLE_HEAD_PORTRAIT = "user://role_head_portrait.png"
enum SEX {
NONE = 0,
BOY = 1,
GIRL = 2
}
signal uid_change()
signal user_change()
signal login_change()
signal role_change()
signal pokemon_change()
signal map_change()
signal item_change()
var UID : String = "" :
set(value):
KvStore.put("UID",value)
emit_signal("uid_change")
get :
return KvStore.get_value("UID","")
var user : Dictionary = {} :
set(value):
var isLoginChange = (user.is_empty() and not value.is_empty() ) or (not user.is_empty() and value.is_empty() )
KvStore.put("USER",value)
emit_signal("user_change")
if isLoginChange :
emit_signal("login_change")
get :
return KvStore.get_value("USER",{})
var local_user = {} :
set(value):
KvStore.put("LOCAL_USER",value)
get:
return KvStore.get_value("LOCAL_USER",{})
var sex : int = 0 :
set(value) :
if user.is_empty():
var temp = local_user
temp["SEX"] = value
local_user = temp
else:
var temp = user
temp.userBase.sex = value
user = temp
emit_signal("role_change")
get:
if user.is_empty():
return local_user["SEX"] if local_user.has("SEX") else SEX.NONE
else:
return user.userBase.sex
var nickName : String = "" :
set(value):
if user.is_empty():
var temp = local_user
temp["NICKNAME"] = value
local_user = temp
else:
var temp = user
temp.userBase.nickName = value
user = temp
get:
if user.is_empty():
return local_user["NICKNAME"] if local_user.has("NICKNAME") else SEX.NONE
else:
return user.userBase.nickName
var role : Dictionary = {} :
set(value):
if user.is_empty():
var temp = local_user
temp["ROLE"] = value
local_user = temp
else:
var temp = user
temp.userRole.data = JsonWrapper.toJson(value)
user = temp
emit_signal("role_change")
get :
if user.is_empty():
return local_user["ROLE"] if local_user.has("ROLE") else {}
else:
return JsonWrapper.convertJson(user.userRole.data )
var pokemon : Dictionary = {} :
set(value):
if user.is_empty():
var temp = local_user
temp["POKEMON"] = value
local_user = temp
else:
var temp = user
temp.userPokemon.data = JsonWrapper.toJson(value)
user = temp
emit_signal("pokemon_change")
get :
if user.is_empty():
return local_user["POKEMON"] if local_user.has("POKEMON") else {}
else:
return JsonWrapper.convertJson(user.userPokemon.data )
var map : Dictionary = {} :
set(value):
if value.is_empty():
KvStore.remove_key("LOCAL_MAP")
KvStore.remove_key("MAP_"+UID)
else :
if UID.is_empty():
KvStore.put("LOCAL_MAP",value)
else:
KvStore.put("MAP_"+UID,value)
emit_signal("map_change")
get :
if UID.is_empty():
return KvStore.get_value("LOCAL_MAP",MapWrapper.MAP_DEFAULT)
else:
return KvStore.get_value("MAP_"+UID,MapWrapper.MAP_DEFAULT)
func update_map(new_map):
new_map.lastUpdateTime = TimeUtil.serverTimeMillsecond()
self.map = new_map
var item : Dictionary = {} :
set(value):
if value.is_empty():
KvStore.remove_key("LOCAL_ITEM")
KvStore.remove_key("ITEM_"+UID)
else :
if UID.is_empty():
KvStore.put("LOCAL_ITEM",value)
else:
KvStore.put("ITEM_"+UID,value)
emit_signal("item_change")
get :
if UID.is_empty():
return KvStore.get_value("LOCAL_ITEM",ItemWrapper.ITEM_DEFAULT)
else:
return KvStore.get_value("ITEM_"+UID,ItemWrapper.ITEM_DEFAULT)
# set(value):
# if value.has("itemLastSyncTime") and value.itemLastSyncTime > self.item.itemLastSyncTime:
# KvStore.put("ITEM",value)
# emit_signal("item_change")
# get:
# return KvStore.get_value("ITEM",{"data":{},"itemLastSyncTime":0})
func isLogin():
return not UID.is_empty()
func logout() :
map = {}
item = {}
role = {}
pokemon = {}
user = {}
UID = ""
func doRefresh() :
if user.is_empty() : return
var httpResult = await UserService.profile(user.userBase.uId).request_completed
var commonResult = BaseNetwork.parse_send_result(httpResult[0],httpResult[1],httpResult[3],false)
if commonResult == null : return
self.user = commonResult
func isBoy() -> bool :
return sex == SEX.BOY
func is_visitor_login():
if local_user.has("SEX") and local_user.has("NICKNAME") and \
local_user.has("POKEMON") and local_user.has("ROLE") :
if not local_user["POKEMON"].is_empty() and not local_user["ROLE"].is_empty():
return true
return false
func need_fill_info():
if user.is_empty() or user.userBase.nickName == "" or \
user.userPokemon.data.is_empty() or user.userRole.data.is_empty() :
return true
else :
return false

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,30 @@
extends Node
var astar = AStarGrid2D.new()
#写入地图数据并更新
func up_map(map_size:Vector2,cell_szie:Vector2,obstacle_arr:PackedVector2Array):
astar.region = Rect2i(0, 0, map_size.x+1, map_size.y+1)
astar.cell_size = cell_szie
astar.offset = cell_szie * 0.5
astar.default_compute_heuristic = AStarGrid2D.HEURISTIC_MANHATTAN
astar.default_estimate_heuristic = AStarGrid2D.HEURISTIC_MANHATTAN
astar.diagonal_mode = AStarGrid2D.DIAGONAL_MODE_NEVER
astar.update()
for pos in obstacle_arr:
astar.set_point_solid(pos)
#坐标位置是否可通行
func is_point_walkable(local_position):
var map_position = local_to_map(local_position)
if astar.is_in_boundsv(map_position):
return not astar.is_point_solid(map_position)
return false
#局部转本地
func local_to_map(local_position):
return Vector2(int(local_position.x/astar.cell_size.x),int(local_position.y/astar.cell_size.y))
#获取导航路径
func get_point_path(local_start_point,local_end_point):
var start_point = local_to_map(local_start_point)
var end_point = local_to_map(local_end_point)
return astar.get_point_path(start_point, end_point)
func get_map_point_path(start_point,end_point):
return astar.get_point_path(start_point, end_point)

View File

@ -0,0 +1,3 @@
extends AnimationTree
var state_machine:AnimationNodeStateMachinePlayback = get("parameters/playback")

View File

@ -0,0 +1,247 @@
#@tool
#class_name BaseControl
#extends Control
#
#signal result_data(value)
#signal init_complete()
#signal load_anim_complete()
#signal on_click(_node)
#signal on_long_click(_node)
##@export var long_time = 800
#var clickTime = 0
#var clickPosition = Vector2.ZERO
#var itemRoot : BaseControl = null
#
#enum {
#RESULT_OK,
#RESULT_CANCELED
#}
#
#class GResult :
#var code = RESULT_OK
#var data = null
#func _init(p_code,p_data = null):
#self.code = p_code
#self.data = p_data
#
#
#
#@export var styleBox : StyleBox = null : set = set_styleBox
#@export var enter_anim : Animation = null
#@export var exit_anim : Animation = null
#@export var is_anim = true
#@export var on_click_anim : Animation = null
#var baseAnimationPlayer : AnimationPlayer = null
#func _ready():
#await get_tree().process_frame
#if is_anim:
#init_anim()
#playEnter()
#
#await get_tree().create_timer(0.2).timeout
#init_complete.emit()
#
#
#func init_anim():
#if enter_anim == null and exit_anim == null :
#return
#baseAnimationPlayer = AnimationPlayer.new()
#var animationLibrary = AnimationLibrary.new()
#if enter_anim != null :
#animationLibrary.add_animation("enter",enter_anim)
#if exit_anim != null :
#animationLibrary.add_animation("exit",exit_anim)
#if on_click_anim != null:
#animationLibrary.add_animation("on_click_anim",on_click_anim)
#baseAnimationPlayer.add_animation_library("",animationLibrary)
#add_child(baseAnimationPlayer)
##
#
#func playEnter():
#if enter_anim != null and baseAnimationPlayer != null :
#baseAnimationPlayer.play("enter")
#
#
#
#func playExit():
#if exit_anim != null and baseAnimationPlayer != null :
#baseAnimationPlayer.play("exit")
#await baseAnimationPlayer.animation_finished
#
##func queue_free():
##if is_anim:
##await playExit()
##super.queue_free()
#
#func set_styleBox(value) :
#styleBox = value
#queue_redraw()
#var is_move_r = false
#func _gui_input(event):
#if event is InputEventScreenTouch :
#is_move_r = event.pressed
#if event.pressed == true:
#clickTime = Time.get_ticks_msec()
#clickPosition = event.position
#pressed_true()
#if event.pressed == false:
#var diff = Time.get_ticks_msec() - clickTime
#clickTime = 0
#if event.position.distance_to(clickPosition)<2 :
#if mouse_filter == Control.MOUSE_FILTER_STOP :
#accept_event()
#if diff < 800:
#emit_signal("on_click",self)
#if on_click_anim != null and baseAnimationPlayer != null :
#baseAnimationPlayer.play("on_click_anim")
#click()
#else :
#emit_signal("on_long_click",self)
#long_click()
#pressed_false()
#func pressed_true():
#pass
#func pressed_false():
#pass
#func _process(delta):
#if not Rect2(global_position, global_position+size).has_point(get_global_mouse_position()):
#pressed_false()
#func click():
#pass
#func long_click():
#pass
#
#
#func _draw():
#if styleBox !=null :
#draw_style_box(styleBox, Rect2(Vector2(0,0) , size ))
@tool
class_name BaseControl
extends Control
signal result_data(value)
signal init_complete()
signal load_anim_complete()
signal on_click(_node)
signal on_long_click(_node)
#@export var long_time = 800
var clickTime = 0
var clickPosition = Vector2.ZERO
var itemRoot : BaseControl = null
enum {
RESULT_OK,
RESULT_CANCELED
}
class GResult :
var code = RESULT_OK
var data = null
func _init(p_code,p_data = null):
self.code = p_code
self.data = p_data
@export var styleBox : StyleBox = null : set = set_styleBox
@export var enter_anim : Animation = null
@export var exit_anim : Animation = null
@export var is_anim = true
@export var on_click_anim : Animation = null
var baseAnimationPlayer : AnimationPlayer = null
func _ready():
await get_tree().process_frame
if is_anim:
init_anim()
playEnter()
await get_tree().create_timer(0.2).timeout
init_complete.emit()
func init_anim():
if enter_anim == null and exit_anim == null :
return
baseAnimationPlayer = AnimationPlayer.new()
var animationLibrary = AnimationLibrary.new()
if enter_anim != null :
animationLibrary.add_animation("enter",enter_anim)
if exit_anim != null :
animationLibrary.add_animation("exit",exit_anim)
if on_click_anim != null:
animationLibrary.add_animation("on_click_anim",on_click_anim)
baseAnimationPlayer.add_animation_library("",animationLibrary)
add_child(baseAnimationPlayer)
#
func playEnter():
if enter_anim != null and baseAnimationPlayer != null :
baseAnimationPlayer.play("enter")
func playExit():
if exit_anim != null and baseAnimationPlayer != null :
baseAnimationPlayer.play("exit")
await baseAnimationPlayer.animation_finished
#func queue_free():
#if is_anim:
#await playExit()
#super.queue_free()
func set_styleBox(value) :
styleBox = value
queue_redraw()
var is_move_r = false
func _gui_input(event):
if event is InputEventScreenTouch :
is_move_r = event.pressed
if event.pressed == true:
clickTime = Time.get_ticks_msec()
clickPosition = event.position
pressed_true()
if event.pressed == false:
var diff = Time.get_ticks_msec() - clickTime
clickTime = 0
#if event.position.distance_to(clickPosition)<2 :
if mouse_filter == Control.MOUSE_FILTER_STOP :
accept_event()
print(diff)
if diff < 800:
emit_signal("on_click",self)
if on_click_anim != null and baseAnimationPlayer != null :
baseAnimationPlayer.play("on_click_anim")
click()
else :
emit_signal("on_long_click",self)
long_click()
pressed_false()
func pressed_true():
pass
func pressed_false():
pass
func _process(delta):
if not Rect2(global_position, global_position+size).has_point(get_global_mouse_position()):
pressed_false()
func click():
pass
func long_click():
pass
func _draw():
if styleBox !=null :
draw_style_box(styleBox, Rect2(Vector2(0,0) , size ))

View File

@ -0,0 +1,11 @@
@tool
class_name BaseDataControl
extends BaseControl
signal data_change
var data_index = 0
var data = {} :
set(value ):
data = value
data_update()
func data_update():
pass

View File

@ -0,0 +1,10 @@
class_name BaseDialog
extends BaseControl
var cancelOutside = true
var confirmQuit = true
enum {
LEFT = 0,
RIGHT = 1,
CENTER = 2
}

View File

@ -0,0 +1,20 @@
class_name BaseEdit
extends BaseControl
func _init():
disable_scrollbars()
func disable_scrollbars():
if is_class("TextEdit") :
var empty_stylebox = StyleBoxEmpty.new()
call("get_v_scroll_bar").set("theme_override_styles/scroll",empty_stylebox)
call("get_h_scroll_bar").set("theme_override_styles/scroll",empty_stylebox)
func _ready():
if is_class("LineEdit") :
connect("text_change_rejected",Callable(self,"_on_content_text_change_rejected"))
func _on_content_text_change_rejected(_rejected_substring):
ToastRouter.showToast("不可以超过 "+str(self.max_length)+" 个字")
pass # Replace with function body.

View File

@ -0,0 +1,185 @@
extends BaseNode
#const base_url = "http://127.0.0.1:8080"
#const websocket_url = "ws://127.0.0.1:8889"
const base_url = "https://api.bairimengxingqiu.com"
const websocket_url = "wss://pipe.bairimengxingqiu.com:11022"
var http_client : HTTPClient = HTTPClient.new()
const MAX_REDIRECTS :int = 16384
var COLONSPACE = ": ".to_utf8_buffer()
var CRLF = "\r\n".to_utf8_buffer()
var DASHDASH = "--".to_utf8_buffer()
var boundary = "WebKitFormBoundaryePkpFF7tjBAqx29L".to_utf8_buffer()
const SECRET = "MAGIC_GYD"
func send(sub_url :String,params : Dictionary ={},completed:Callable =Callable(),show_err:bool =true,errCallable : Callable = Callable()) -> HTTPRequest:
var request = HTTPRequest.new()
request.use_threads = true
request.max_redirects = MAX_REDIRECTS
request.request_completed.connect(self.send_completed.bind(request,completed,show_err,errCallable),CONNECT_ONE_SHOT)
add_child(request)
if not params.has("uId"):
params["uId"] = Account.UID
params["appName"] = "dreamdearplanet"
params["deviceOs"] = OS.get_name()
params["deviceOp"] = SysUtil.deviceOp()
params["deviceType"] = SysUtil.deviceType()
params["appVersion"] = SysUtil.appVersion()
params["apiVersion"] = SysUtil.apiVersion()
params["ts"] = str(TimeUtil.serverTimeSeconds())
params["engineVersion"] = Engine.get_version_info().string
var signStr = JsonWrapper.toJson(params)+SECRET
params["sign"] = signStr.md5_text()
var query_string = http_client.query_string_from_dict(params)
print_debug("\n"+base_url+sub_url+"?"+query_string+"\n")
var headers = ["Content-Type: application/x-www-form-urlencoded", "Content-Length: " + str(query_string.length())]
var error = request.request(base_url+sub_url,headers, HTTPClient.METHOD_POST,query_string)
if error != OK:
push_error("An error occurred in the HTTP request.")
return request
func send_completed(result: int, _response_code: int, _headers: PackedStringArray, body: PackedByteArray,
request_http:Node,completed:Callable =Callable(),show_err:bool =true,errCallable : Callable = Callable()):
request_http.queue_free()
var data = parse_send_result(result,_response_code,body,show_err)
if data == null :
if errCallable.is_valid() : errCallable.call()
return
if completed.is_valid():
result_data.connect(completed,CONNECT_ONE_SHOT)
emit_signal("result_data",data)
func parse_send_result(result: int, _response_code: int, body: PackedByteArray,show_err:bool =true) :
if(result != HTTPRequest.RESULT_SUCCESS || _response_code !=200 ):
print_debug("HTTPRequest send error result : ",result," _response_code : ",_response_code)
return null
var json = JsonWrapper.convertJson(body.get_string_from_utf8())
if(json.error.errno != 200):
print_debug("HTTPRequest send error from server : ",json.error.errmsg)
if(show_err and not json.error.usermsg.is_empty()) : ToastRouter.showToast(json.error.usermsg)
return null
if json.data == null:
return {}
return json.data
func downloadFile(url :String,completed : Callable = Callable(),show_err:bool =true,errCallable : Callable = Callable()) -> HTTPRequest:
var request = HTTPRequest.new()
request.use_threads = true
request.max_redirects = MAX_REDIRECTS
request.request_completed.connect(self.downloadFile_completed.bind(request,completed,show_err,errCallable ),CONNECT_ONE_SHOT)
add_child(request)
var error = request.request(url)
if error != OK:
print_debug("An error occurred in the HTTP request.")
return request
func downloadFile_completed(result: int, _response_code: int, _headers: PackedStringArray, body: PackedByteArray,
request_http:Node,completed :Callable = Callable(),show_err:bool =true,errCallable : Callable = Callable()):
request_http.queue_free()
var data = parse_download_file_result(result,_response_code,body,show_err)
if data == null :
if errCallable.is_valid() : errCallable.call()
return
if completed.is_valid():
result_data.connect(completed,CONNECT_ONE_SHOT)
emit_signal("result_data",data)
func parse_download_file_result(result: int, _response_code: int, body: PackedByteArray,_show_err:bool =true) :
if(result != HTTPRequest.RESULT_SUCCESS || _response_code !=200 ):
print_debug("HTTPRequest download_file error result : ",result," _response_code : ",_response_code)
return null
else : return body
func upload(token:String,data: PackedByteArray= [],key:String = "",completed : Callable = Callable(),show_err:bool =true,errCallable : Callable = Callable() ) -> HTTPRequest:
var request = HTTPRequest.new()
request.use_threads = true
request.max_redirects = MAX_REDIRECTS
request.request_completed.connect(self.upload_completed.bind(request,completed,show_err,errCallable),CONNECT_ONE_SHOT)
add_child(request)
var filename = key if (key != "") else "?"
var file_content :PackedByteArray = data
var body = PackedByteArray()
body.append_array(DASHDASH)
body.append_array(boundary)
body.append_array(CRLF)
body.append_array("Content-Disposition".to_utf8_buffer())
body.append_array(COLONSPACE)
body.append_array("form-data; name=".to_utf8_buffer())
body.append_array("\"file\"".to_utf8_buffer())
body.append_array("; filename=".to_utf8_buffer())
body.append_array("\"".to_utf8_buffer())
body.append_array(filename.to_utf8_buffer())
body.append_array("\"".to_utf8_buffer())
body.append_array(CRLF)
body.append_array("Content-Type".to_utf8_buffer())
body.append_array(COLONSPACE)
body.append_array("application/octet-stream".to_utf8_buffer())
body.append_array(CRLF)
body.append_array("Content-Length".to_utf8_buffer())
body.append_array(COLONSPACE)
body.append_array(str(file_content.size()).to_utf8_buffer())
body.append_array(CRLF)
body.append_array(CRLF)
body.append_array(file_content)
body.append_array(CRLF)
body.append_array(DASHDASH)
body.append_array(boundary)
body.append_array(CRLF)
body.append_array("Content-Disposition".to_utf8_buffer())
body.append_array(COLONSPACE)
body.append_array("form-data; name=".to_utf8_buffer())
body.append_array("\"token\"".to_utf8_buffer())
body.append_array(CRLF)
body.append_array("Content-Length".to_utf8_buffer())
body.append_array(COLONSPACE)
body.append_array(str(token.to_utf8_buffer().size()).to_utf8_buffer())
body.append_array(CRLF)
body.append_array(CRLF)
body.append_array(token.to_utf8_buffer())
body.append_array(CRLF)
body.append_array(DASHDASH)
body.append_array(boundary)
body.append_array(DASHDASH)
body.append_array(CRLF)
var headers = [
"Host: upload-z1.qiniup.com",
"Content-Type: multipart/form-data; boundary=WebKitFormBoundaryePkpFF7tjBAqx29L",
"Content-Length: "+str(body.size()),
"Connection: keep-alive",
"Accept-Encoding : gzip"
]
var error = request.request_raw("http://upload-z1.qiniup.com" ,headers,HTTPClient.METHOD_POST,body)
if error != OK:
print_debug("An error occurred in the HTTP request.")
return request
func upload_completed(result: int, _response_code: int, _headers: PackedStringArray, body: PackedByteArray,
request_http:Node,completed :Callable = Callable(),show_err:bool =true,errCallable : Callable = Callable()):
request_http.queue_free()
var data = parse_upload_result(result,_response_code,body,show_err)
if data == null :
if errCallable.is_valid() : errCallable.call()
return
if completed.is_valid():
result_data.connect(completed,CONNECT_ONE_SHOT)
emit_signal("result_data",data)
func parse_upload_result(result: int, _response_code: int, body: PackedByteArray,_show_err:bool =true) :
if(result != HTTPRequest.RESULT_SUCCESS || _response_code !=200 ):
print_debug("HTTPRequest upload error result : ",result," _response_code : ",_response_code)
return null
var json = JsonWrapper.convertJson(body.get_string_from_utf8())
return json.key

View File

@ -0,0 +1,5 @@
class_name BaseNode
extends Node
signal result_data(value)

View File

@ -0,0 +1,10 @@
class_name BaseRichTextLabel
extends RichTextLabel
func _init():
disable_scrollbars()
func disable_scrollbars():
var empty_stylebox = StyleBoxEmpty.new()
get_v_scroll_bar().set("theme_override_styles/scroll",empty_stylebox)

View File

@ -0,0 +1,11 @@
class_name BaseRouter
extends Object
static func add_tree_node(node:Node):
if is_instance_valid(Global.get_tree()):
Global.get_tree().get_root().add_child(node)
static func add_child_node(context:Node,node:Node):
if is_instance_valid(context.get_tree()):
context.add_child(node)

View File

@ -0,0 +1,12 @@
@tool
class_name BaseScrollContainer
extends ScrollContainer
func _init():
disable_scrollbars()
func disable_scrollbars():
var empty_stylebox = StyleBoxEmpty.new()
get_v_scroll_bar().set("theme_override_styles/scroll",empty_stylebox)
get_h_scroll_bar().set("theme_override_styles/scroll",empty_stylebox)

View File

@ -0,0 +1,179 @@
class_name Gui3D
extends Node3D
# The size of the quad mesh itself.
var quad_mesh_size
# Used for checking if the mouse was pressed inside the Area3D
var is_mouse_held = false
# The last non-empty mouse position. Used when dragging outside of the box.
var last_mouse_pos3D = null
# The last processed input touch/mouse event. To calculate relative movement.
var last_mouse_pos2D = null
@export var node_viewport_path : NodePath
@export var node_quad_path : NodePath
@export var node_area_path : NodePath
@onready var node_viewport : SubViewport = get_node(node_viewport_path)
@onready var node_quad : MeshInstance3D = get_node(node_quad_path)
@onready var node_area : Area3D = get_node(node_area_path)
func _ready():
#TODO:fix
# node_viewport.get_texture().flags =Texture2D.FLAG_FILTER
# If the material is NOT set to use billboard settings, then avoid running billboard specific code
if node_quad.get_surface_override_material(0) == null or node_quad.get_surface_override_material(0).billboard_mode == BaseMaterial3D.BillboardMode.BILLBOARD_DISABLED:
set_process(false)
#func _process(_delta):
# # NOTE: Remove this function if you don't plan checked using billboard settings.
# rotate_area_to_billboard()
func _unhandled_input(event):
# Check if the event is a non-mouse/non-touch event
if not node_quad.visible : return
var is_mouse_event = false
# for mouse_event in [InputEventMouseButton,InputEventMouseMotion,InputEventScreenDrag,InputEventScreenTouch] :
# if event is mouse_event :
# is_mouse_event = true
# break
if event is InputEventMouseButton or event is InputEventMouseMotion or event is InputEventScreenDrag or event is InputEventScreenTouch :
is_mouse_event = true
# Detect mouse being held to mantain event while outside of bounds. Avoid orphan clicks
# If the event is a mouse/touch event and/or the mouse is either held or inside the area, then
# we need to do some additional processing in the handle_mouse function before passing the event to the viewport.
# If the event is not a mouse/touch event, then we can just pass the event directly to the viewport.
# Get mesh size to detect edges and make conversions. This code only support PlaneMesh and QuadMesh.
quad_mesh_size = node_quad.mesh.size
if is_mouse_event :
var mouse_pos3D = find_mouse(event.position )
if (mouse_pos3D !=null or is_mouse_held):
handle_mouse(event.xformed_by(Transform2D.IDENTITY) , mouse_pos3D)
else :
node_viewport.push_input(event)
# Handle mouse events inside Area3D. (Area3D.input_event had many issues with dragging)
func handle_mouse(event,mouse_pos3D):
# Detect mouse being held to mantain event while outside of bounds. Avoid orphan clicks
if event is InputEventScreenTouch:
is_mouse_held = event.pressed
# Check if the mouse is outside of bounds, use last position to avoid errors
# NOTE: mouse_exited signal was unrealiable in this situation
if mouse_pos3D != null:
# Convert click_pos from world coordinate space to a coordinate space relative to the Area3D node.
# NOTE: affine_inverse accounts for the Area3D node's scale, rotation, and position in the scene!
mouse_pos3D = node_area.global_transform.affine_inverse() * mouse_pos3D
last_mouse_pos3D = mouse_pos3D
else:
mouse_pos3D = last_mouse_pos3D
if mouse_pos3D == null:
mouse_pos3D = Vector3.ZERO
# TODO: adapt to bilboard mode or avoid completely
# convert the relative event position from 3D to 2D
var mouse_pos2D = Vector2(mouse_pos3D.x, -mouse_pos3D.y)
# Right now the event position's range is the following: (-quad_size/2) -> (quad_size/2)
# We need to convert it into the following range: 0 -> quad_size
mouse_pos2D.x += quad_mesh_size.x / 2
mouse_pos2D.y += quad_mesh_size.y / 2
# Then we need to convert it into the following range: 0 -> 1
mouse_pos2D.x = mouse_pos2D.x / quad_mesh_size.x
mouse_pos2D.y = mouse_pos2D.y / quad_mesh_size.y
# Finally, we convert the position to the following range: 0 -> viewport.size
mouse_pos2D.x = mouse_pos2D.x * node_viewport.size.x
mouse_pos2D.y = mouse_pos2D.y * node_viewport.size.y
# We need to do these conversions so the event's position is in the viewport's coordinate system.
# Set the event's position and global position.
event.position = mouse_pos2D
# If the event is a mouse motion event...
if event is InputEventMouseMotion:
# If there is not a stored previous position, then we'll assume there is no relative motion.
if last_mouse_pos2D == null:
event.relative = Vector2(0, 0)
# If there is a stored previous position, then we'll calculate the relative position by subtracting
# the previous position from the new position. This will give us the distance the event traveled from prev_pos
else:
event.relative = mouse_pos2D - last_mouse_pos2D
# Update last_mouse_pos2D with the position we just calculated.
last_mouse_pos2D = mouse_pos2D
# Finally, send the processed input event to the viewport.
node_viewport.push_input(event)
func find_mouse(viewPortPositon):
var camera = get_viewport().get_camera_3d()
var dist = find_further_distance_to(camera.transform.origin)
# From camera center to the mouse position in the Area3D.
var parameters = PhysicsRayQueryParameters3D.new()
parameters.from = camera.project_ray_origin(viewPortPositon)
parameters.to = parameters.from + camera.project_ray_normal(viewPortPositon) * dist
# Manually raycasts the area to find the mouse position.
parameters.collision_mask = node_area.collision_layer
parameters.collide_with_bodies = false
parameters.collide_with_areas = true
var result = get_world_3d().direct_space_state.intersect_ray(parameters)
if result.size() > 0:
return result.position
else:
return null
func find_further_distance_to(origin):
# Find edges of collision and change to global positions
var edges = []
edges.append(node_area.to_global(Vector3(quad_mesh_size.x / 2, quad_mesh_size.y / 2, 0)))
edges.append(node_area.to_global(Vector3(quad_mesh_size.x / 2, -quad_mesh_size.y / 2, 0)))
edges.append(node_area.to_global(Vector3(-quad_mesh_size.x / 2, quad_mesh_size.y / 2, 0)))
edges.append(node_area.to_global(Vector3(-quad_mesh_size.x / 2, -quad_mesh_size.y / 2, 0)))
# Get the furthest distance between the camera and collision to avoid raycasting too far or too short
var far_dist = 0
var temp_dist
for edge in edges:
temp_dist = origin.distance_to(edge)
if temp_dist > far_dist:
far_dist = temp_dist
return far_dist
func rotate_area_to_billboard():
var billboard_mode = node_quad.get_surface_override_material(0).params_billboard_mode
# Try to match the area with the material's billboard setting, if enabled
if billboard_mode > 0:
# Get the camera
var camera = get_viewport().get_camera_3d()
# Look in the same direction as the camera
var look = camera.to_global(Vector3(0, 0, -100)) - camera.global_transform.origin
look = node_area.position + look
# Y-Billboard: Lock Y rotation, but gives bad results if the camera is tilted.
if billboard_mode == 2:
look = Vector3(look.x, 0, look.z)
node_area.look_at(look, Vector3.UP)
# Rotate in the Z axis to compensate camera tilt
node_area.rotate_object_local(Vector3.BACK, camera.rotation.z)

View File

@ -0,0 +1,23 @@
class_name ImageCache
extends BaseNode
var dict : Dictionary = {}
var list : Array = []
func add( url :String ,tex : Texture ):
dict[url] = tex
list.append(url)
func find(url :String) -> Texture:
if not has(url) : return null
list.erase(url)
list.append(url)
return dict[url]
func has(url :String) -> bool:
return dict.has(url)
func _process(_delta):
if dict.size() >100 :
dict.erase(list.pop_front())

View File

@ -0,0 +1,23 @@
class_name ImageCache
extends BaseNode
var dict : Dictionary = {}
var list : Array = []
func add( url :String ,tex : Texture ):
dict[url] = tex
list.append(url)
func find(url :String) -> Texture:
if not has(url) : return null
list.erase(url)
list.append(url)
return dict[url]
func has(url :String) -> bool:
return dict.has(url)
func _process(_delta):
if dict.size() >100 :
dict.erase(list.pop_front())

View File

@ -0,0 +1,89 @@
class_name Category
extends Object
enum {
MODE_MOVE,
MODE_STATIC,
MODE_STATIC_MOVE
}
const HEAD : String = "head"
const SKIN : String = "skin"
const WING : String = "wing"
const BOYCLOTHES : String = "boyclothes"
const BOYPANTS : String = "boypants"
const BOYHAIR : String = "boyhair"
const BOYSHOE : String = "boyshoe"
const BOYCHEEK : String = "boycheek"
const BOYEYEBROW : String = "boyeyebrow"
const BOYMOUTH : String = "boymouth"
const BOYNOSE : String = "boynose"
const BOYEYE : String = "boyeye"
const BOYEYE_SOCKET : String = "boyeye_socket"#眼框
const BOYEYE_BALL : String = "boyeye_ball"#眼球
const BOYEYE_PUPIL : String = "boyeye_pupil"#瞳孔
const BOYEYE_LIGHT : String = "boyeye_light"# 高光
const BOYEYE_LASHES : String = "boyeye_lashes"# 睫毛
const GIRLCLOTHES : String = "girlclothes"
const GIRLPANTS : String = "girlpants"
const GIRLHAIR : String = "girlhair"
const GIRLSHOE : String = "girlshoe"
const GIRLCHEEK : String = "girlcheek"
const GIRLEYEBROW : String = "girleyebrow"
const GIRLMOUTH : String = "girlmouth"
const GIRLNOSE : String = "girlnose"
const GIRLEYE : String = "girleye"
const GIRLEYE_SOCKET : String = "girleye_socket"#眼框
const GIRLEYE_BALL : String = "girleye_ball"#眼球
const GIRLEYE_PUPIL : String = "girleye_pupil"#瞳孔
const GIRLEYE_LIGHT : String = "girleye_light"# 高光
const GIRLEYE_LASHES : String = "girleye_lashes"# 睫毛
const POKEMON : String = "pokemon"
const TREE : String = "tree"
const WORLD_TREE : String = "world_tree"
const FRUIT_TREE : String = "fruit_tree"
const FRUIT : String = "fruit"
const FARM_LAND : String = "farm_land"
const CROP : String = "crop"
const ROCK: String = "rock"
const FLOWER: String = "flower"
const GRASS : String = "grass"
const MUSHROOM: String = "mushroom"
const STONES : String = "stones"
const FOOD : String = "food"
const BLOCK_GROUND : String = "block_grouno"
const BLOCK_SAND : String = "block_sand"
const FISH : String = "fish"
const BIRD : String = "bird"
const CRAB : String = "crab"
const SHELL : String = "shell"
const STARFISH : String = "starfish"
#道具
const FISHING_ROD = "fishing_rod"
const CAPTURE = "capture"
const SHOVEL = "shovel"
const GROUNDPANEL_STATIC = "groundPanel_static"
const GROUNDPANEL_RANDOM = "groundPanel_random"
const SANDPANEL_STATIC = "sandPanel_static"
const SANDPANEL_RANDOM = "sandPanel_random"
const WATERPANEL_STATIC = "waterPanel_static"
const WATERPANEL_RANDOM = "waterPanel_random"
const FLYPANEL_STATIC = "flyPanel_static"
const FLYPANEL_RANDOM = "flyPanel_random"

Some files were not shown because too many files have changed in this diff Show More