Compare commits
No commits in common. "main" and "0.6.2" have entirely different histories.
259
.clang-format
259
.clang-format
@ -1,259 +0,0 @@
|
|||||||
---
|
|
||||||
Language: Cpp
|
|
||||||
# BasedOnStyle: Google
|
|
||||||
AccessModifierOffset: -1
|
|
||||||
AlignAfterOpenBracket: Align
|
|
||||||
AlignArrayOfStructures: None
|
|
||||||
AlignConsecutiveAssignments:
|
|
||||||
Enabled: false
|
|
||||||
AcrossEmptyLines: false
|
|
||||||
AcrossComments: false
|
|
||||||
AlignCompound: false
|
|
||||||
PadOperators: true
|
|
||||||
AlignConsecutiveBitFields:
|
|
||||||
Enabled: false
|
|
||||||
AcrossEmptyLines: false
|
|
||||||
AcrossComments: false
|
|
||||||
AlignCompound: false
|
|
||||||
PadOperators: false
|
|
||||||
AlignConsecutiveDeclarations:
|
|
||||||
Enabled: false
|
|
||||||
AcrossEmptyLines: false
|
|
||||||
AcrossComments: false
|
|
||||||
AlignCompound: false
|
|
||||||
PadOperators: false
|
|
||||||
AlignConsecutiveMacros:
|
|
||||||
Enabled: false
|
|
||||||
AcrossEmptyLines: false
|
|
||||||
AcrossComments: false
|
|
||||||
AlignCompound: false
|
|
||||||
PadOperators: false
|
|
||||||
AlignEscapedNewlines: Left
|
|
||||||
AlignOperands: Align
|
|
||||||
AlignTrailingComments:
|
|
||||||
Kind: Always
|
|
||||||
OverEmptyLines: 0
|
|
||||||
AllowAllArgumentsOnNextLine: true
|
|
||||||
AllowAllParametersOfDeclarationOnNextLine: true
|
|
||||||
AllowShortBlocksOnASingleLine: Never
|
|
||||||
AllowShortCaseLabelsOnASingleLine: false
|
|
||||||
AllowShortEnumsOnASingleLine: true
|
|
||||||
AllowShortFunctionsOnASingleLine: All
|
|
||||||
AllowShortIfStatementsOnASingleLine: WithoutElse
|
|
||||||
AllowShortLambdasOnASingleLine: All
|
|
||||||
AllowShortLoopsOnASingleLine: true
|
|
||||||
AlwaysBreakAfterDefinitionReturnType: None
|
|
||||||
AlwaysBreakAfterReturnType: None
|
|
||||||
AlwaysBreakBeforeMultilineStrings: true
|
|
||||||
AlwaysBreakTemplateDeclarations: Yes
|
|
||||||
AttributeMacros:
|
|
||||||
- __capability
|
|
||||||
BinPackArguments: true
|
|
||||||
BinPackParameters: true
|
|
||||||
BitFieldColonSpacing: Both
|
|
||||||
BraceWrapping:
|
|
||||||
AfterCaseLabel: false
|
|
||||||
AfterClass: false
|
|
||||||
AfterControlStatement: Never
|
|
||||||
AfterEnum: false
|
|
||||||
AfterExternBlock: false
|
|
||||||
AfterFunction: false
|
|
||||||
AfterNamespace: false
|
|
||||||
AfterObjCDeclaration: false
|
|
||||||
AfterStruct: false
|
|
||||||
AfterUnion: false
|
|
||||||
BeforeCatch: false
|
|
||||||
BeforeElse: false
|
|
||||||
BeforeLambdaBody: false
|
|
||||||
BeforeWhile: false
|
|
||||||
IndentBraces: false
|
|
||||||
SplitEmptyFunction: true
|
|
||||||
SplitEmptyRecord: true
|
|
||||||
SplitEmptyNamespace: true
|
|
||||||
BreakAfterAttributes: Never
|
|
||||||
BreakAfterJavaFieldAnnotations: false
|
|
||||||
BreakArrays: true
|
|
||||||
BreakBeforeBinaryOperators: None
|
|
||||||
BreakBeforeConceptDeclarations: Always
|
|
||||||
BreakBeforeBraces: Attach
|
|
||||||
BreakBeforeInlineASMColon: OnlyMultiline
|
|
||||||
BreakBeforeTernaryOperators: true
|
|
||||||
BreakConstructorInitializers: BeforeColon
|
|
||||||
BreakInheritanceList: BeforeColon
|
|
||||||
BreakStringLiterals: true
|
|
||||||
ColumnLimit: 80
|
|
||||||
CommentPragmas: '^ IWYU pragma:'
|
|
||||||
CompactNamespaces: false
|
|
||||||
ConstructorInitializerIndentWidth: 4
|
|
||||||
ContinuationIndentWidth: 4
|
|
||||||
Cpp11BracedListStyle: true
|
|
||||||
DerivePointerAlignment: true
|
|
||||||
DisableFormat: false
|
|
||||||
EmptyLineAfterAccessModifier: Never
|
|
||||||
EmptyLineBeforeAccessModifier: LogicalBlock
|
|
||||||
ExperimentalAutoDetectBinPacking: false
|
|
||||||
FixNamespaceComments: true
|
|
||||||
ForEachMacros:
|
|
||||||
- foreach
|
|
||||||
- Q_FOREACH
|
|
||||||
- BOOST_FOREACH
|
|
||||||
IfMacros:
|
|
||||||
- KJ_IF_MAYBE
|
|
||||||
IncludeBlocks: Regroup
|
|
||||||
IncludeCategories:
|
|
||||||
- Regex: '^<ext/.*\.h>'
|
|
||||||
Priority: 2
|
|
||||||
SortPriority: 0
|
|
||||||
CaseSensitive: false
|
|
||||||
- Regex: '^<.*\.h>'
|
|
||||||
Priority: 1
|
|
||||||
SortPriority: 0
|
|
||||||
CaseSensitive: false
|
|
||||||
- Regex: '^<.*'
|
|
||||||
Priority: 2
|
|
||||||
SortPriority: 0
|
|
||||||
CaseSensitive: false
|
|
||||||
- Regex: '.*'
|
|
||||||
Priority: 3
|
|
||||||
SortPriority: 0
|
|
||||||
CaseSensitive: false
|
|
||||||
IncludeIsMainRegex: '([-_](test|unittest))?$'
|
|
||||||
IncludeIsMainSourceRegex: ''
|
|
||||||
IndentAccessModifiers: false
|
|
||||||
IndentCaseBlocks: false
|
|
||||||
IndentCaseLabels: true
|
|
||||||
IndentExternBlock: AfterExternBlock
|
|
||||||
IndentGotoLabels: true
|
|
||||||
IndentPPDirectives: None
|
|
||||||
IndentRequiresClause: true
|
|
||||||
IndentWidth: 2
|
|
||||||
IndentWrappedFunctionNames: false
|
|
||||||
InsertBraces: false
|
|
||||||
InsertNewlineAtEOF: false
|
|
||||||
InsertTrailingCommas: None
|
|
||||||
IntegerLiteralSeparator:
|
|
||||||
Binary: 0
|
|
||||||
BinaryMinDigits: 0
|
|
||||||
Decimal: 0
|
|
||||||
DecimalMinDigits: 0
|
|
||||||
Hex: 0
|
|
||||||
HexMinDigits: 0
|
|
||||||
JavaScriptQuotes: Leave
|
|
||||||
JavaScriptWrapImports: true
|
|
||||||
KeepEmptyLinesAtTheStartOfBlocks: false
|
|
||||||
LambdaBodyIndentation: Signature
|
|
||||||
LineEnding: DeriveLF
|
|
||||||
MacroBlockBegin: ''
|
|
||||||
MacroBlockEnd: ''
|
|
||||||
MaxEmptyLinesToKeep: 1
|
|
||||||
NamespaceIndentation: None
|
|
||||||
ObjCBinPackProtocolList: Never
|
|
||||||
ObjCBlockIndentWidth: 2
|
|
||||||
ObjCBreakBeforeNestedBlockParam: true
|
|
||||||
ObjCSpaceAfterProperty: false
|
|
||||||
ObjCSpaceBeforeProtocolList: true
|
|
||||||
PackConstructorInitializers: NextLine
|
|
||||||
PenaltyBreakAssignment: 2
|
|
||||||
PenaltyBreakBeforeFirstCallParameter: 1
|
|
||||||
PenaltyBreakComment: 300
|
|
||||||
PenaltyBreakFirstLessLess: 120
|
|
||||||
PenaltyBreakOpenParenthesis: 0
|
|
||||||
PenaltyBreakString: 1000
|
|
||||||
PenaltyBreakTemplateDeclaration: 10
|
|
||||||
PenaltyExcessCharacter: 1000000
|
|
||||||
PenaltyIndentedWhitespace: 0
|
|
||||||
PenaltyReturnTypeOnItsOwnLine: 200
|
|
||||||
PointerAlignment: Left
|
|
||||||
PPIndentWidth: -1
|
|
||||||
QualifierAlignment: Leave
|
|
||||||
RawStringFormats:
|
|
||||||
- Language: Cpp
|
|
||||||
Delimiters:
|
|
||||||
- cc
|
|
||||||
- CC
|
|
||||||
- cpp
|
|
||||||
- Cpp
|
|
||||||
- CPP
|
|
||||||
- 'c++'
|
|
||||||
- 'C++'
|
|
||||||
CanonicalDelimiter: ''
|
|
||||||
BasedOnStyle: google
|
|
||||||
- Language: TextProto
|
|
||||||
Delimiters:
|
|
||||||
- pb
|
|
||||||
- PB
|
|
||||||
- proto
|
|
||||||
- PROTO
|
|
||||||
EnclosingFunctions:
|
|
||||||
- EqualsProto
|
|
||||||
- EquivToProto
|
|
||||||
- PARSE_PARTIAL_TEXT_PROTO
|
|
||||||
- PARSE_TEST_PROTO
|
|
||||||
- PARSE_TEXT_PROTO
|
|
||||||
- ParseTextOrDie
|
|
||||||
- ParseTextProtoOrDie
|
|
||||||
- ParseTestProto
|
|
||||||
- ParsePartialTestProto
|
|
||||||
CanonicalDelimiter: pb
|
|
||||||
BasedOnStyle: google
|
|
||||||
ReferenceAlignment: Pointer
|
|
||||||
ReflowComments: true
|
|
||||||
RemoveBracesLLVM: false
|
|
||||||
RemoveSemicolon: false
|
|
||||||
RequiresClausePosition: OwnLine
|
|
||||||
RequiresExpressionIndentation: OuterScope
|
|
||||||
SeparateDefinitionBlocks: Leave
|
|
||||||
ShortNamespaceLines: 1
|
|
||||||
SortIncludes: CaseSensitive
|
|
||||||
SortJavaStaticImport: Before
|
|
||||||
SortUsingDeclarations: LexicographicNumeric
|
|
||||||
SpaceAfterCStyleCast: false
|
|
||||||
SpaceAfterLogicalNot: false
|
|
||||||
SpaceAfterTemplateKeyword: true
|
|
||||||
SpaceAroundPointerQualifiers: Default
|
|
||||||
SpaceBeforeAssignmentOperators: true
|
|
||||||
SpaceBeforeCaseColon: false
|
|
||||||
SpaceBeforeCpp11BracedList: false
|
|
||||||
SpaceBeforeCtorInitializerColon: true
|
|
||||||
SpaceBeforeInheritanceColon: true
|
|
||||||
SpaceBeforeParens: ControlStatements
|
|
||||||
SpaceBeforeParensOptions:
|
|
||||||
AfterControlStatements: true
|
|
||||||
AfterForeachMacros: true
|
|
||||||
AfterFunctionDefinitionName: false
|
|
||||||
AfterFunctionDeclarationName: false
|
|
||||||
AfterIfMacros: true
|
|
||||||
AfterOverloadedOperator: false
|
|
||||||
AfterRequiresInClause: false
|
|
||||||
AfterRequiresInExpression: false
|
|
||||||
BeforeNonEmptyParentheses: false
|
|
||||||
SpaceBeforeRangeBasedForLoopColon: true
|
|
||||||
SpaceBeforeSquareBrackets: false
|
|
||||||
SpaceInEmptyBlock: false
|
|
||||||
SpaceInEmptyParentheses: false
|
|
||||||
SpacesBeforeTrailingComments: 2
|
|
||||||
SpacesInAngles: Never
|
|
||||||
SpacesInConditionalStatement: false
|
|
||||||
SpacesInContainerLiterals: true
|
|
||||||
SpacesInCStyleCastParentheses: false
|
|
||||||
SpacesInLineCommentPrefix:
|
|
||||||
Minimum: 1
|
|
||||||
Maximum: -1
|
|
||||||
SpacesInParentheses: false
|
|
||||||
SpacesInSquareBrackets: false
|
|
||||||
Standard: Auto
|
|
||||||
StatementAttributeLikeMacros:
|
|
||||||
- Q_EMIT
|
|
||||||
StatementMacros:
|
|
||||||
- Q_UNUSED
|
|
||||||
- QT_REQUIRE_VERSION
|
|
||||||
TabWidth: 8
|
|
||||||
UseTab: Never
|
|
||||||
WhitespaceSensitiveMacros:
|
|
||||||
- BOOST_PP_STRINGIZE
|
|
||||||
- CF_SWIFT_NAME
|
|
||||||
- NS_SWIFT_NAME
|
|
||||||
- PP_STRINGIZE
|
|
||||||
- STRINGIZE
|
|
||||||
...
|
|
||||||
|
|
49
.github/workflows/Docs.yml
vendored
Normal file
49
.github/workflows/Docs.yml
vendored
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
name: 📄
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ "**" ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ "*" ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
# This workflow contains a single job called "build"
|
||||||
|
build:
|
||||||
|
# The type of runner that the job will run on
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
# Steps represent a sequence of tasks that will be executed as part of the job
|
||||||
|
steps:
|
||||||
|
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: Extract branch name
|
||||||
|
shell: bash
|
||||||
|
run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})"
|
||||||
|
id: branch
|
||||||
|
- name: Display branch name
|
||||||
|
shell: bash
|
||||||
|
run: echo ${{ steps.branch.outputs.branch }}
|
||||||
|
# Runs a single command using the runners shell
|
||||||
|
- name: Run a one-line script
|
||||||
|
run: |
|
||||||
|
sudo apt-get install doxygen cmake -y
|
||||||
|
doxygen
|
||||||
|
echo done
|
||||||
|
ls -r
|
||||||
|
cd ..
|
||||||
|
git clone https://github.com/NPI-D7/NPI-D7.github.io.git
|
||||||
|
mkdir -p NPI-D7.github.io/${{ steps.branch.outputs.branch }}
|
||||||
|
#rm -r NPI-D7.github.io/${{ steps.branch.outputs.branch }}/*
|
||||||
|
mv -v RenderD7/doc NPI-D7.github.io/${{ steps.branch.outputs.branch }}/
|
||||||
|
#rm -r doc
|
||||||
|
cd NPI-D7.github.io
|
||||||
|
git config --global user.email "tobid7@outlook.de"
|
||||||
|
git config --global user.name "Tobi-D7"
|
||||||
|
echo tobid7
|
||||||
|
git stage *
|
||||||
|
echo staged
|
||||||
|
git commit -m "Documentation1"
|
||||||
|
git tag doc
|
||||||
|
echo commited
|
||||||
|
git push origin main
|
||||||
|
echo pushed
|
50
.github/workflows/Update extlibs.yml
vendored
Normal file
50
.github/workflows/Update extlibs.yml
vendored
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
name: Extlibs
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ '!*' ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ '!*' ]
|
||||||
|
|
||||||
|
# Allows you to run this workflow manually from the Actions tab
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
||||||
|
jobs:
|
||||||
|
# This workflow contains a single job called "build"
|
||||||
|
build:
|
||||||
|
# The type of runner that the job will run on
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
# Steps represent a sequence of tasks that will be executed as part of the job
|
||||||
|
steps:
|
||||||
|
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: update
|
||||||
|
run: |
|
||||||
|
#gl
|
||||||
|
cd ..
|
||||||
|
git clone https://github.com/lua/lua.git
|
||||||
|
cd RenderD7
|
||||||
|
mkdir -p extlibs/
|
||||||
|
mkdir -p extlibs/lua/
|
||||||
|
cp -r ../lua/*.c extlibs/lua/
|
||||||
|
cp -r ../lua/*.h extlibs/lua/
|
||||||
|
cp -r ../lua/*.md extlibs/lua/
|
||||||
|
#RenderD7
|
||||||
|
cd ..
|
||||||
|
git clone https://github.com/NPI-D7/RenderD7.git
|
||||||
|
cd lp-next-ctr
|
||||||
|
mkdir -p extlibs/
|
||||||
|
rm -r extlibs/RenderD7
|
||||||
|
mkdir -p extlibs/RenderD7/
|
||||||
|
cp -r ../RenderD7/*.c* extlibs/RenderD7/
|
||||||
|
cp -r ../RenderD7/*.h* extlibs/RenderD7/
|
||||||
|
cp -r ../RenderD7/*.md extlibs/RenderD7/
|
||||||
|
#config
|
||||||
|
git config --global user.email "tobid7@outlook.de"
|
||||||
|
git config --global user.name "Tobi-D7"
|
||||||
|
#commit
|
||||||
|
git stage *
|
||||||
|
git commit -m "update extlibs"
|
||||||
|
git push origin main
|
11
.gitignore
vendored
11
.gitignore
vendored
@ -1,11 +0,0 @@
|
|||||||
*.bz2
|
|
||||||
*.DS_Store*
|
|
||||||
.cache/
|
|
||||||
compile_commands.json
|
|
||||||
|
|
||||||
# DOCS
|
|
||||||
docs/*
|
|
||||||
!docs/javascripts
|
|
||||||
!docs/overrides
|
|
||||||
!docs/stylesheets
|
|
||||||
site/*
|
|
18
.vscode/c_cpp_properties.json
vendored
18
.vscode/c_cpp_properties.json
vendored
@ -1,18 +0,0 @@
|
|||||||
{
|
|
||||||
"configurations": [
|
|
||||||
{
|
|
||||||
"name": "3DS | Windows",
|
|
||||||
"includePath": [
|
|
||||||
"${workspaceFolder}/**",
|
|
||||||
"C:/devkitpro/libctru/include/**",
|
|
||||||
"C:/devkitpro/devkitARM/include/**",
|
|
||||||
"C:/devkitpro/devkitARM/arm-none-eabi/include/**",
|
|
||||||
"C:/devkitpro/portlibs/3ds/include/**",
|
|
||||||
"/opt/devkitpro/libctru/include/**",
|
|
||||||
"/opt/devkitpro/portlibs/**"
|
|
||||||
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"version": 4
|
|
||||||
}
|
|
121
.vscode/launch.json
vendored
121
.vscode/launch.json
vendored
@ -1,121 +0,0 @@
|
|||||||
{
|
|
||||||
"version": "0.2.0",
|
|
||||||
"configurations": [
|
|
||||||
{
|
|
||||||
"name": "(gdb) Launch",
|
|
||||||
"type": "cppdbg",
|
|
||||||
"request": "launch",
|
|
||||||
"program": "${workspaceFolder}/rd7tf/rd7tf.elf",
|
|
||||||
"targetArchitecture": "arm",
|
|
||||||
"serverLaunchTimeout": 10000,
|
|
||||||
"stopAtEntry": true,
|
|
||||||
"cwd": "${workspaceFolder}",
|
|
||||||
"environment": [],
|
|
||||||
"externalConsole": true,
|
|
||||||
"MIMode": "gdb",
|
|
||||||
/// LINUX
|
|
||||||
//"miDebuggerPath": "/opt/devkitPro/devkitARM/bin/arm-none-eabi-gdb",
|
|
||||||
/// WINDOWS
|
|
||||||
"miDebuggerPath": "C:/devkitPro/devkitARM/bin/arm-none-eabi-gdb.exe",
|
|
||||||
"miDebuggerServerAddress": "192.168.2.220:4003",
|
|
||||||
"setupCommands": [
|
|
||||||
{
|
|
||||||
"description": "Enable pretty-printing",
|
|
||||||
"text": "file ${workspaceFolder}/rd7tf/rd7tf.elf -enable-pretty-printing",
|
|
||||||
"ignoreFailures": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "(gdb-emu) Launch",
|
|
||||||
"type": "cppdbg",
|
|
||||||
"request": "launch",
|
|
||||||
"program": "${workspaceFolder}/rd7tf/rd7tf.elf",
|
|
||||||
"targetArchitecture": "arm",
|
|
||||||
"serverLaunchTimeout": 10000,
|
|
||||||
"stopAtEntry": true,
|
|
||||||
"cwd": "${workspaceFolder}",
|
|
||||||
"environment": [],
|
|
||||||
"externalConsole": true,
|
|
||||||
"MIMode": "gdb",
|
|
||||||
/// LINUX
|
|
||||||
//"miDebuggerPath": "/opt/devkitPro/devkitARM/bin/arm-none-eabi-gdb",
|
|
||||||
/// WINDOWS
|
|
||||||
"miDebuggerPath": "C:/devkitPro/devkitARM/bin/arm-none-eabi-gdb.exe",
|
|
||||||
"miDebuggerServerAddress": "localhost:4003",
|
|
||||||
"setupCommands": [
|
|
||||||
{
|
|
||||||
"description": "Enable pretty-printing",
|
|
||||||
"text": "file ${workspaceFolder}/rd7tf/rd7tf.elf -enable-pretty-printing",
|
|
||||||
"ignoreFailures": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "(gdb-emu) lua",
|
|
||||||
"type": "cppdbg",
|
|
||||||
"request": "launch",
|
|
||||||
"program": "${workspaceFolder}/rd7le/rd7le.elf",
|
|
||||||
"targetArchitecture": "arm",
|
|
||||||
"serverLaunchTimeout": 10000,
|
|
||||||
"stopAtEntry": true,
|
|
||||||
"cwd": "${workspaceFolder}",
|
|
||||||
"environment": [],
|
|
||||||
"externalConsole": true,
|
|
||||||
"MIMode": "gdb",
|
|
||||||
"miDebuggerPath": "C:\\devkitPro\\devkitARM\\bin\\arm-none-eabi-gdb.exe",
|
|
||||||
"miDebuggerServerAddress": "localhost:4003",
|
|
||||||
"setupCommands": [
|
|
||||||
{
|
|
||||||
"description": "Enable pretty-printing",
|
|
||||||
"text": "file ${workspaceFolder}/rd7le/rd7le.elf -enable-pretty-printing",
|
|
||||||
"ignoreFailures": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "(gdb) lua",
|
|
||||||
"type": "cppdbg",
|
|
||||||
"request": "launch",
|
|
||||||
"program": "${workspaceFolder}/rd7le/rd7le.elf",
|
|
||||||
"targetArchitecture": "arm",
|
|
||||||
"serverLaunchTimeout": 10000,
|
|
||||||
"stopAtEntry": true,
|
|
||||||
"cwd": "${workspaceFolder}",
|
|
||||||
"environment": [],
|
|
||||||
"externalConsole": true,
|
|
||||||
"MIMode": "gdb",
|
|
||||||
"miDebuggerPath": "C:\\devkitPro\\devkitARM\\bin\\arm-none-eabi-gdb.exe",
|
|
||||||
"miDebuggerServerAddress": "192.168.2.220:4003",
|
|
||||||
"setupCommands": [
|
|
||||||
{
|
|
||||||
"description": "Enable pretty-printing",
|
|
||||||
"text": "file ${workspaceFolder}/rd7le/rd7le.elf -enable-pretty-printing",
|
|
||||||
"ignoreFailures": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "(gdb) testgame",
|
|
||||||
"type": "cppdbg",
|
|
||||||
"request": "launch",
|
|
||||||
"program": "${workspaceFolder}/testgame/testgame.elf",
|
|
||||||
"targetArchitecture": "arm",
|
|
||||||
"serverLaunchTimeout": 10000,
|
|
||||||
"stopAtEntry": true,
|
|
||||||
"cwd": "${workspaceFolder}",
|
|
||||||
"environment": [],
|
|
||||||
"externalConsole": true,
|
|
||||||
"MIMode": "gdb",
|
|
||||||
"miDebuggerPath": "C:\\devkitPro\\devkitARM\\bin\\arm-none-eabi-gdb.exe",
|
|
||||||
"miDebuggerServerAddress": "localhost:4003",
|
|
||||||
"setupCommands": [
|
|
||||||
{
|
|
||||||
"description": "Enable pretty-printing",
|
|
||||||
"text": "file ${workspaceFolder}/testgame/testgame.elf -enable-pretty-printing",
|
|
||||||
"ignoreFailures": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
118
.vscode/settings.json
vendored
118
.vscode/settings.json
vendored
@ -1,118 +0,0 @@
|
|||||||
{
|
|
||||||
"files.associations": {
|
|
||||||
"array": "cpp",
|
|
||||||
"*.tcc": "cpp",
|
|
||||||
"cctype": "cpp",
|
|
||||||
"clocale": "cpp",
|
|
||||||
"cmath": "cpp",
|
|
||||||
"cstdarg": "cpp",
|
|
||||||
"cstddef": "cpp",
|
|
||||||
"cstdint": "cpp",
|
|
||||||
"cstdio": "cpp",
|
|
||||||
"cstdlib": "cpp",
|
|
||||||
"cwchar": "cpp",
|
|
||||||
"cwctype": "cpp",
|
|
||||||
"unordered_map": "cpp",
|
|
||||||
"vector": "cpp",
|
|
||||||
"exception": "cpp",
|
|
||||||
"algorithm": "cpp",
|
|
||||||
"functional": "cpp",
|
|
||||||
"iterator": "cpp",
|
|
||||||
"memory": "cpp",
|
|
||||||
"numeric": "cpp",
|
|
||||||
"type_traits": "cpp",
|
|
||||||
"fstream": "cpp",
|
|
||||||
"initializer_list": "cpp",
|
|
||||||
"iosfwd": "cpp",
|
|
||||||
"iostream": "cpp",
|
|
||||||
"istream": "cpp",
|
|
||||||
"limits": "cpp",
|
|
||||||
"new": "cpp",
|
|
||||||
"optional": "cpp",
|
|
||||||
"ostream": "cpp",
|
|
||||||
"sstream": "cpp",
|
|
||||||
"stdexcept": "cpp",
|
|
||||||
"streambuf": "cpp",
|
|
||||||
"string": "cpp",
|
|
||||||
"string_view": "cpp",
|
|
||||||
"system_error": "cpp",
|
|
||||||
"tuple": "cpp",
|
|
||||||
"typeinfo": "cpp",
|
|
||||||
"utility": "cpp",
|
|
||||||
"atomic": "cpp",
|
|
||||||
"bit": "cpp",
|
|
||||||
"bitset": "cpp",
|
|
||||||
"chrono": "cpp",
|
|
||||||
"codecvt": "cpp",
|
|
||||||
"condition_variable": "cpp",
|
|
||||||
"cstring": "cpp",
|
|
||||||
"ctime": "cpp",
|
|
||||||
"deque": "cpp",
|
|
||||||
"forward_list": "cpp",
|
|
||||||
"map": "cpp",
|
|
||||||
"iomanip": "cpp",
|
|
||||||
"memory_resource": "cpp",
|
|
||||||
"ratio": "cpp",
|
|
||||||
"regex": "cpp",
|
|
||||||
"shared_mutex": "cpp",
|
|
||||||
"valarray": "cpp",
|
|
||||||
"random": "cpp",
|
|
||||||
"cuchar": "cpp",
|
|
||||||
"compare": "cpp",
|
|
||||||
"concepts": "cpp",
|
|
||||||
"numbers": "cpp",
|
|
||||||
"filesystem": "cpp",
|
|
||||||
"xstring": "cpp",
|
|
||||||
"charconv": "cpp",
|
|
||||||
"format": "cpp",
|
|
||||||
"ios": "cpp",
|
|
||||||
"list": "cpp",
|
|
||||||
"locale": "cpp",
|
|
||||||
"mutex": "cpp",
|
|
||||||
"stack": "cpp",
|
|
||||||
"stop_token": "cpp",
|
|
||||||
"thread": "cpp",
|
|
||||||
"xfacet": "cpp",
|
|
||||||
"xhash": "cpp",
|
|
||||||
"xiosbase": "cpp",
|
|
||||||
"xlocale": "cpp",
|
|
||||||
"xlocbuf": "cpp",
|
|
||||||
"xlocinfo": "cpp",
|
|
||||||
"xlocmes": "cpp",
|
|
||||||
"xlocmon": "cpp",
|
|
||||||
"xlocnum": "cpp",
|
|
||||||
"xloctime": "cpp",
|
|
||||||
"xmemory": "cpp",
|
|
||||||
"xstddef": "cpp",
|
|
||||||
"xtr1common": "cpp",
|
|
||||||
"xtree": "cpp",
|
|
||||||
"xutility": "cpp",
|
|
||||||
"queue": "cpp",
|
|
||||||
"semaphore": "cpp",
|
|
||||||
"hash_map": "cpp",
|
|
||||||
"set": "cpp",
|
|
||||||
"unordered_set": "cpp",
|
|
||||||
"source_location": "cpp",
|
|
||||||
"future": "cpp",
|
|
||||||
"cfenv": "cpp",
|
|
||||||
"cinttypes": "cpp",
|
|
||||||
"typeindex": "cpp",
|
|
||||||
"variant": "cpp",
|
|
||||||
"ranges": "cpp",
|
|
||||||
"span": "cpp",
|
|
||||||
"coroutine": "cpp",
|
|
||||||
"__bit_reference": "cpp",
|
|
||||||
"__config": "cpp",
|
|
||||||
"__debug": "cpp",
|
|
||||||
"__errc": "cpp",
|
|
||||||
"__hash_table": "cpp",
|
|
||||||
"__locale": "cpp",
|
|
||||||
"__mutex_base": "cpp",
|
|
||||||
"__node_handle": "cpp",
|
|
||||||
"__split_buffer": "cpp",
|
|
||||||
"__threading_support": "cpp",
|
|
||||||
"__tree": "cpp",
|
|
||||||
"__verbose_abort": "cpp",
|
|
||||||
"complex": "cpp"
|
|
||||||
}
|
|
||||||
}
|
|
37
.vscode/tasks.json
vendored
37
.vscode/tasks.json
vendored
@ -1,37 +0,0 @@
|
|||||||
{
|
|
||||||
"version": "2.0.0",
|
|
||||||
"tasks": [
|
|
||||||
{
|
|
||||||
"label": "Build",
|
|
||||||
"command": "make",
|
|
||||||
"type": "shell",
|
|
||||||
"options": {
|
|
||||||
"cwd": "${workspaceFolder}/rd7tf/"
|
|
||||||
},
|
|
||||||
"presentation": {
|
|
||||||
"reveal": "always",
|
|
||||||
"panel": "new",
|
|
||||||
"focus": true
|
|
||||||
},
|
|
||||||
"problemMatcher": [],
|
|
||||||
"group": {
|
|
||||||
"kind": "build",
|
|
||||||
"isDefault": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "Format",
|
|
||||||
"command": "python ${workspaceFolder}/clang-format.py",
|
|
||||||
"type": "shell",
|
|
||||||
"options": {
|
|
||||||
"cwd": "${workspaceFolder}/"
|
|
||||||
},
|
|
||||||
"presentation": {
|
|
||||||
"reveal": "always",
|
|
||||||
"panel": "new",
|
|
||||||
"focus": true
|
|
||||||
},
|
|
||||||
"problemMatcher": []
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
112
CHANGELOG.md
112
CHANGELOG.md
@ -1,112 +0,0 @@
|
|||||||
# RenderD7 Changelog
|
|
||||||
## 0.9.5
|
|
||||||
- Remove Npi Intro and NVID Api
|
|
||||||
- Replace Toasts System with Message
|
|
||||||
- Added GetTime
|
|
||||||
- Move from Draw to Render2 Api
|
|
||||||
- Implement RD7Color and R7Vec2
|
|
||||||
- Add new Features to Color::RGBA
|
|
||||||
- Cleanup Code
|
|
||||||
- Added RenderD7 Keyboard (Overlay)
|
|
||||||
- Added Ftrace Overlay
|
|
||||||
- Moved MetrikOVL into an Overlay
|
|
||||||
- Removed Old Font/Text Handlers
|
|
||||||
- Added UI7 (New UI Api)
|
|
||||||
- Remove Old UI Api
|
|
||||||
- Rewrite of RenderD7::Image
|
|
||||||
- Internal Debugger/Database (IDB)
|
|
||||||
- Removed BitmapPrinter
|
|
||||||
- Added nimg and swr(render2nimg | SoftwareRender)
|
|
||||||
- Removed Old Error/Message Handler
|
|
||||||
- GetTextSize (extra buffer) + New TextShorter
|
|
||||||
- Require specific FLAG for MemTrack
|
|
||||||
- Replace all lodepng usage by stb_image
|
|
||||||
- Move Asset Generator into single python script
|
|
||||||
- Remove INI reader
|
|
||||||
- Python based clangformat script
|
|
||||||
- Move some Init code into functions to not use twice
|
|
||||||
- Added Font class
|
|
||||||
- Add LinearAllocator (for std)
|
|
||||||
- Fix Crash in FilsSystem
|
|
||||||
- Implement basic Theme System
|
|
||||||
- Remove 0.9.4 Security
|
|
||||||
- Tasks now based on std functional/thread
|
|
||||||
- Add Network Support (Download Files, APi Requests)
|
|
||||||
- Remove RD7TF
|
|
||||||
- Add Cia Installer
|
|
||||||
- Move from Init bool values to flags
|
|
||||||
## 0.9.4
|
|
||||||
- Implement new Security System To prevent from crashes
|
|
||||||
- Implement Functiontrace for better Timing Tests
|
|
||||||
- Implement MemAlloc Tracker (only size)
|
|
||||||
- Add some new Overlays (not functional yet)
|
|
||||||
- Complete Rewrite of Overlay System
|
|
||||||
- Fixed the FrameEnd Crash
|
|
||||||
- New System to get Hardware Info
|
|
||||||
- Removed RenderD7 Super Reselution (800px mode)
|
|
||||||
## 0.9.3
|
|
||||||
- Completly Documented Everything
|
|
||||||
- Fix typo in Sprite::getHeight
|
|
||||||
- Remove Deprecated/Useless Stuff
|
|
||||||
## 0.9.2
|
|
||||||
- Add Nvid Support(v0.0.1)
|
|
||||||
- Add Basic RenderD7 Splash
|
|
||||||
- Faster Graphics Init
|
|
||||||
- Fade Effects
|
|
||||||
- Fix Changelog Screen
|
|
||||||
## 0.9.1
|
|
||||||
- Fix Critical bug in Spritesheet animations
|
|
||||||
- Fix RenderD7::Color::Hex (Major performance tweak)
|
|
||||||
## 0.9.0
|
|
||||||
- Remove Stupid try of Console
|
|
||||||
- Add Services list
|
|
||||||
- Clean up Code
|
|
||||||
- Added Minimal Init for hax2.x
|
|
||||||
## 0.8.5
|
|
||||||
- Fix Deltatime
|
|
||||||
## 0.8.4
|
|
||||||
- A lot of Fixes
|
|
||||||
- New Features for BitmapPrinter
|
|
||||||
## 0.8.3
|
|
||||||
- Added Overlaycount to Info
|
|
||||||
- Addet ResultDecoder for errors
|
|
||||||
## 0.8.2
|
|
||||||
- Fix a lot of Stuff
|
|
||||||
- Use c++17 std::filesystem for RenderD7::Filesystem
|
|
||||||
## 0.8.1
|
|
||||||
- Add abillity to Get Stdout as string to render it to the screen.
|
|
||||||
## 0.8.0
|
|
||||||
- Implement BitmapPrinter
|
|
||||||
## 0.7.3
|
|
||||||
- Implement Over Render Overlay Framework
|
|
||||||
## 0.7.2
|
|
||||||
- Implement MT to csv file saving
|
|
||||||
- Add RGB2HEX
|
|
||||||
## 0.7.1
|
|
||||||
- Add the New Overlay Handler. Its Just in code and does nothing yet
|
|
||||||
## 0.7.0
|
|
||||||
- Made Big Progress In the MT Ovl but it still crashes On a 2nd C3D_FrameEnd \
|
|
||||||
- Implement 800px but doesn't work that good
|
|
||||||
## 0.6.2
|
|
||||||
- Fix Crash when exiting through Home Menu.
|
|
||||||
## 0.6.10
|
|
||||||
- Rewrite Threadsystem
|
|
||||||
- Improve framerate
|
|
||||||
## 0.6.02
|
|
||||||
- Fix Code in lang.hpp
|
|
||||||
- Add Draw Text Left Function (Right since 0.7.0)
|
|
||||||
- Add changelog
|
|
||||||
## 0.6.01
|
|
||||||
- Add Threading system
|
|
||||||
## 0.6.0
|
|
||||||
- Better Scene Management
|
|
||||||
## 0.5.0
|
|
||||||
- Fixed some Bugs!
|
|
||||||
## 0.4.0
|
|
||||||
- Trying to fix Filesystem and Bugs
|
|
||||||
## 0.3.0
|
|
||||||
- Recreate D7-Core into RenderD7
|
|
||||||
## 0.2.0
|
|
||||||
- Trying to create Animations of Images instead of Sheets
|
|
||||||
## 0.1.0
|
|
||||||
- Inital Release of D7-Core sprite animation plugin
|
|
695
LICENSE
695
LICENSE
@ -1,21 +1,674 @@
|
|||||||
MIT License
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 29 June 2007
|
||||||
Copyright (c) 2024 tobid7
|
|
||||||
|
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this license document, but changing it is not allowed.
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
Preamble
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
The GNU General Public License is a free, copyleft license for
|
||||||
|
software and other kinds of works.
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
The licenses for most software and other practical works are designed
|
||||||
|
to take away your freedom to share and change the works. By contrast,
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
the GNU General Public License is intended to guarantee your freedom to
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
share and change all versions of a program--to make sure it remains free
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
software for all its users. We, the Free Software Foundation, use the
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
GNU General Public License for most of our software; it applies also to
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
any other work released this way by its authors. You can apply it to
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
your programs, too.
|
||||||
SOFTWARE.
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
them if you wish), that you receive source code or can get it if you
|
||||||
|
want it, that you can change the software or use pieces of it in new
|
||||||
|
free programs, and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to prevent others from denying you
|
||||||
|
these rights or asking you to surrender the rights. Therefore, you have
|
||||||
|
certain responsibilities if you distribute copies of the software, or if
|
||||||
|
you modify it: responsibilities to respect the freedom of others.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must pass on to the recipients the same
|
||||||
|
freedoms that you received. You must make sure that they, too, receive
|
||||||
|
or can get the source code. And you must show them these terms so they
|
||||||
|
know their rights.
|
||||||
|
|
||||||
|
Developers that use the GNU GPL protect your rights with two steps:
|
||||||
|
(1) assert copyright on the software, and (2) offer you this License
|
||||||
|
giving you legal permission to copy, distribute and/or modify it.
|
||||||
|
|
||||||
|
For the developers' and authors' protection, the GPL clearly explains
|
||||||
|
that there is no warranty for this free software. For both users' and
|
||||||
|
authors' sake, the GPL requires that modified versions be marked as
|
||||||
|
changed, so that their problems will not be attributed erroneously to
|
||||||
|
authors of previous versions.
|
||||||
|
|
||||||
|
Some devices are designed to deny users access to install or run
|
||||||
|
modified versions of the software inside them, although the manufacturer
|
||||||
|
can do so. This is fundamentally incompatible with the aim of
|
||||||
|
protecting users' freedom to change the software. The systematic
|
||||||
|
pattern of such abuse occurs in the area of products for individuals to
|
||||||
|
use, which is precisely where it is most unacceptable. Therefore, we
|
||||||
|
have designed this version of the GPL to prohibit the practice for those
|
||||||
|
products. If such problems arise substantially in other domains, we
|
||||||
|
stand ready to extend this provision to those domains in future versions
|
||||||
|
of the GPL, as needed to protect the freedom of users.
|
||||||
|
|
||||||
|
Finally, every program is threatened constantly by software patents.
|
||||||
|
States should not allow patents to restrict development and use of
|
||||||
|
software on general-purpose computers, but in those that do, we wish to
|
||||||
|
avoid the special danger that patents applied to a free program could
|
||||||
|
make it effectively proprietary. To prevent this, the GPL assures that
|
||||||
|
patents cannot be used to render the program non-free.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
0. Definitions.
|
||||||
|
|
||||||
|
"This License" refers to version 3 of the GNU General Public License.
|
||||||
|
|
||||||
|
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||||
|
works, such as semiconductor masks.
|
||||||
|
|
||||||
|
"The Program" refers to any copyrightable work licensed under this
|
||||||
|
License. Each licensee is addressed as "you". "Licensees" and
|
||||||
|
"recipients" may be individuals or organizations.
|
||||||
|
|
||||||
|
To "modify" a work means to copy from or adapt all or part of the work
|
||||||
|
in a fashion requiring copyright permission, other than the making of an
|
||||||
|
exact copy. The resulting work is called a "modified version" of the
|
||||||
|
earlier work or a work "based on" the earlier work.
|
||||||
|
|
||||||
|
A "covered work" means either the unmodified Program or a work based
|
||||||
|
on the Program.
|
||||||
|
|
||||||
|
To "propagate" a work means to do anything with it that, without
|
||||||
|
permission, would make you directly or secondarily liable for
|
||||||
|
infringement under applicable copyright law, except executing it on a
|
||||||
|
computer or modifying a private copy. Propagation includes copying,
|
||||||
|
distribution (with or without modification), making available to the
|
||||||
|
public, and in some countries other activities as well.
|
||||||
|
|
||||||
|
To "convey" a work means any kind of propagation that enables other
|
||||||
|
parties to make or receive copies. Mere interaction with a user through
|
||||||
|
a computer network, with no transfer of a copy, is not conveying.
|
||||||
|
|
||||||
|
An interactive user interface displays "Appropriate Legal Notices"
|
||||||
|
to the extent that it includes a convenient and prominently visible
|
||||||
|
feature that (1) displays an appropriate copyright notice, and (2)
|
||||||
|
tells the user that there is no warranty for the work (except to the
|
||||||
|
extent that warranties are provided), that licensees may convey the
|
||||||
|
work under this License, and how to view a copy of this License. If
|
||||||
|
the interface presents a list of user commands or options, such as a
|
||||||
|
menu, a prominent item in the list meets this criterion.
|
||||||
|
|
||||||
|
1. Source Code.
|
||||||
|
|
||||||
|
The "source code" for a work means the preferred form of the work
|
||||||
|
for making modifications to it. "Object code" means any non-source
|
||||||
|
form of a work.
|
||||||
|
|
||||||
|
A "Standard Interface" means an interface that either is an official
|
||||||
|
standard defined by a recognized standards body, or, in the case of
|
||||||
|
interfaces specified for a particular programming language, one that
|
||||||
|
is widely used among developers working in that language.
|
||||||
|
|
||||||
|
The "System Libraries" of an executable work include anything, other
|
||||||
|
than the work as a whole, that (a) is included in the normal form of
|
||||||
|
packaging a Major Component, but which is not part of that Major
|
||||||
|
Component, and (b) serves only to enable use of the work with that
|
||||||
|
Major Component, or to implement a Standard Interface for which an
|
||||||
|
implementation is available to the public in source code form. A
|
||||||
|
"Major Component", in this context, means a major essential component
|
||||||
|
(kernel, window system, and so on) of the specific operating system
|
||||||
|
(if any) on which the executable work runs, or a compiler used to
|
||||||
|
produce the work, or an object code interpreter used to run it.
|
||||||
|
|
||||||
|
The "Corresponding Source" for a work in object code form means all
|
||||||
|
the source code needed to generate, install, and (for an executable
|
||||||
|
work) run the object code and to modify the work, including scripts to
|
||||||
|
control those activities. However, it does not include the work's
|
||||||
|
System Libraries, or general-purpose tools or generally available free
|
||||||
|
programs which are used unmodified in performing those activities but
|
||||||
|
which are not part of the work. For example, Corresponding Source
|
||||||
|
includes interface definition files associated with source files for
|
||||||
|
the work, and the source code for shared libraries and dynamically
|
||||||
|
linked subprograms that the work is specifically designed to require,
|
||||||
|
such as by intimate data communication or control flow between those
|
||||||
|
subprograms and other parts of the work.
|
||||||
|
|
||||||
|
The Corresponding Source need not include anything that users
|
||||||
|
can regenerate automatically from other parts of the Corresponding
|
||||||
|
Source.
|
||||||
|
|
||||||
|
The Corresponding Source for a work in source code form is that
|
||||||
|
same work.
|
||||||
|
|
||||||
|
2. Basic Permissions.
|
||||||
|
|
||||||
|
All rights granted under this License are granted for the term of
|
||||||
|
copyright on the Program, and are irrevocable provided the stated
|
||||||
|
conditions are met. This License explicitly affirms your unlimited
|
||||||
|
permission to run the unmodified Program. The output from running a
|
||||||
|
covered work is covered by this License only if the output, given its
|
||||||
|
content, constitutes a covered work. This License acknowledges your
|
||||||
|
rights of fair use or other equivalent, as provided by copyright law.
|
||||||
|
|
||||||
|
You may make, run and propagate covered works that you do not
|
||||||
|
convey, without conditions so long as your license otherwise remains
|
||||||
|
in force. You may convey covered works to others for the sole purpose
|
||||||
|
of having them make modifications exclusively for you, or provide you
|
||||||
|
with facilities for running those works, provided that you comply with
|
||||||
|
the terms of this License in conveying all material for which you do
|
||||||
|
not control copyright. Those thus making or running the covered works
|
||||||
|
for you must do so exclusively on your behalf, under your direction
|
||||||
|
and control, on terms that prohibit them from making any copies of
|
||||||
|
your copyrighted material outside their relationship with you.
|
||||||
|
|
||||||
|
Conveying under any other circumstances is permitted solely under
|
||||||
|
the conditions stated below. Sublicensing is not allowed; section 10
|
||||||
|
makes it unnecessary.
|
||||||
|
|
||||||
|
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||||
|
|
||||||
|
No covered work shall be deemed part of an effective technological
|
||||||
|
measure under any applicable law fulfilling obligations under article
|
||||||
|
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||||
|
similar laws prohibiting or restricting circumvention of such
|
||||||
|
measures.
|
||||||
|
|
||||||
|
When you convey a covered work, you waive any legal power to forbid
|
||||||
|
circumvention of technological measures to the extent such circumvention
|
||||||
|
is effected by exercising rights under this License with respect to
|
||||||
|
the covered work, and you disclaim any intention to limit operation or
|
||||||
|
modification of the work as a means of enforcing, against the work's
|
||||||
|
users, your or third parties' legal rights to forbid circumvention of
|
||||||
|
technological measures.
|
||||||
|
|
||||||
|
4. Conveying Verbatim Copies.
|
||||||
|
|
||||||
|
You may convey verbatim copies of the Program's source code as you
|
||||||
|
receive it, in any medium, provided that you conspicuously and
|
||||||
|
appropriately publish on each copy an appropriate copyright notice;
|
||||||
|
keep intact all notices stating that this License and any
|
||||||
|
non-permissive terms added in accord with section 7 apply to the code;
|
||||||
|
keep intact all notices of the absence of any warranty; and give all
|
||||||
|
recipients a copy of this License along with the Program.
|
||||||
|
|
||||||
|
You may charge any price or no price for each copy that you convey,
|
||||||
|
and you may offer support or warranty protection for a fee.
|
||||||
|
|
||||||
|
5. Conveying Modified Source Versions.
|
||||||
|
|
||||||
|
You may convey a work based on the Program, or the modifications to
|
||||||
|
produce it from the Program, in the form of source code under the
|
||||||
|
terms of section 4, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) The work must carry prominent notices stating that you modified
|
||||||
|
it, and giving a relevant date.
|
||||||
|
|
||||||
|
b) The work must carry prominent notices stating that it is
|
||||||
|
released under this License and any conditions added under section
|
||||||
|
7. This requirement modifies the requirement in section 4 to
|
||||||
|
"keep intact all notices".
|
||||||
|
|
||||||
|
c) You must license the entire work, as a whole, under this
|
||||||
|
License to anyone who comes into possession of a copy. This
|
||||||
|
License will therefore apply, along with any applicable section 7
|
||||||
|
additional terms, to the whole of the work, and all its parts,
|
||||||
|
regardless of how they are packaged. This License gives no
|
||||||
|
permission to license the work in any other way, but it does not
|
||||||
|
invalidate such permission if you have separately received it.
|
||||||
|
|
||||||
|
d) If the work has interactive user interfaces, each must display
|
||||||
|
Appropriate Legal Notices; however, if the Program has interactive
|
||||||
|
interfaces that do not display Appropriate Legal Notices, your
|
||||||
|
work need not make them do so.
|
||||||
|
|
||||||
|
A compilation of a covered work with other separate and independent
|
||||||
|
works, which are not by their nature extensions of the covered work,
|
||||||
|
and which are not combined with it such as to form a larger program,
|
||||||
|
in or on a volume of a storage or distribution medium, is called an
|
||||||
|
"aggregate" if the compilation and its resulting copyright are not
|
||||||
|
used to limit the access or legal rights of the compilation's users
|
||||||
|
beyond what the individual works permit. Inclusion of a covered work
|
||||||
|
in an aggregate does not cause this License to apply to the other
|
||||||
|
parts of the aggregate.
|
||||||
|
|
||||||
|
6. Conveying Non-Source Forms.
|
||||||
|
|
||||||
|
You may convey a covered work in object code form under the terms
|
||||||
|
of sections 4 and 5, provided that you also convey the
|
||||||
|
machine-readable Corresponding Source under the terms of this License,
|
||||||
|
in one of these ways:
|
||||||
|
|
||||||
|
a) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by the
|
||||||
|
Corresponding Source fixed on a durable physical medium
|
||||||
|
customarily used for software interchange.
|
||||||
|
|
||||||
|
b) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by a
|
||||||
|
written offer, valid for at least three years and valid for as
|
||||||
|
long as you offer spare parts or customer support for that product
|
||||||
|
model, to give anyone who possesses the object code either (1) a
|
||||||
|
copy of the Corresponding Source for all the software in the
|
||||||
|
product that is covered by this License, on a durable physical
|
||||||
|
medium customarily used for software interchange, for a price no
|
||||||
|
more than your reasonable cost of physically performing this
|
||||||
|
conveying of source, or (2) access to copy the
|
||||||
|
Corresponding Source from a network server at no charge.
|
||||||
|
|
||||||
|
c) Convey individual copies of the object code with a copy of the
|
||||||
|
written offer to provide the Corresponding Source. This
|
||||||
|
alternative is allowed only occasionally and noncommercially, and
|
||||||
|
only if you received the object code with such an offer, in accord
|
||||||
|
with subsection 6b.
|
||||||
|
|
||||||
|
d) Convey the object code by offering access from a designated
|
||||||
|
place (gratis or for a charge), and offer equivalent access to the
|
||||||
|
Corresponding Source in the same way through the same place at no
|
||||||
|
further charge. You need not require recipients to copy the
|
||||||
|
Corresponding Source along with the object code. If the place to
|
||||||
|
copy the object code is a network server, the Corresponding Source
|
||||||
|
may be on a different server (operated by you or a third party)
|
||||||
|
that supports equivalent copying facilities, provided you maintain
|
||||||
|
clear directions next to the object code saying where to find the
|
||||||
|
Corresponding Source. Regardless of what server hosts the
|
||||||
|
Corresponding Source, you remain obligated to ensure that it is
|
||||||
|
available for as long as needed to satisfy these requirements.
|
||||||
|
|
||||||
|
e) Convey the object code using peer-to-peer transmission, provided
|
||||||
|
you inform other peers where the object code and Corresponding
|
||||||
|
Source of the work are being offered to the general public at no
|
||||||
|
charge under subsection 6d.
|
||||||
|
|
||||||
|
A separable portion of the object code, whose source code is excluded
|
||||||
|
from the Corresponding Source as a System Library, need not be
|
||||||
|
included in conveying the object code work.
|
||||||
|
|
||||||
|
A "User Product" is either (1) a "consumer product", which means any
|
||||||
|
tangible personal property which is normally used for personal, family,
|
||||||
|
or household purposes, or (2) anything designed or sold for incorporation
|
||||||
|
into a dwelling. In determining whether a product is a consumer product,
|
||||||
|
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||||
|
product received by a particular user, "normally used" refers to a
|
||||||
|
typical or common use of that class of product, regardless of the status
|
||||||
|
of the particular user or of the way in which the particular user
|
||||||
|
actually uses, or expects or is expected to use, the product. A product
|
||||||
|
is a consumer product regardless of whether the product has substantial
|
||||||
|
commercial, industrial or non-consumer uses, unless such uses represent
|
||||||
|
the only significant mode of use of the product.
|
||||||
|
|
||||||
|
"Installation Information" for a User Product means any methods,
|
||||||
|
procedures, authorization keys, or other information required to install
|
||||||
|
and execute modified versions of a covered work in that User Product from
|
||||||
|
a modified version of its Corresponding Source. The information must
|
||||||
|
suffice to ensure that the continued functioning of the modified object
|
||||||
|
code is in no case prevented or interfered with solely because
|
||||||
|
modification has been made.
|
||||||
|
|
||||||
|
If you convey an object code work under this section in, or with, or
|
||||||
|
specifically for use in, a User Product, and the conveying occurs as
|
||||||
|
part of a transaction in which the right of possession and use of the
|
||||||
|
User Product is transferred to the recipient in perpetuity or for a
|
||||||
|
fixed term (regardless of how the transaction is characterized), the
|
||||||
|
Corresponding Source conveyed under this section must be accompanied
|
||||||
|
by the Installation Information. But this requirement does not apply
|
||||||
|
if neither you nor any third party retains the ability to install
|
||||||
|
modified object code on the User Product (for example, the work has
|
||||||
|
been installed in ROM).
|
||||||
|
|
||||||
|
The requirement to provide Installation Information does not include a
|
||||||
|
requirement to continue to provide support service, warranty, or updates
|
||||||
|
for a work that has been modified or installed by the recipient, or for
|
||||||
|
the User Product in which it has been modified or installed. Access to a
|
||||||
|
network may be denied when the modification itself materially and
|
||||||
|
adversely affects the operation of the network or violates the rules and
|
||||||
|
protocols for communication across the network.
|
||||||
|
|
||||||
|
Corresponding Source conveyed, and Installation Information provided,
|
||||||
|
in accord with this section must be in a format that is publicly
|
||||||
|
documented (and with an implementation available to the public in
|
||||||
|
source code form), and must require no special password or key for
|
||||||
|
unpacking, reading or copying.
|
||||||
|
|
||||||
|
7. Additional Terms.
|
||||||
|
|
||||||
|
"Additional permissions" are terms that supplement the terms of this
|
||||||
|
License by making exceptions from one or more of its conditions.
|
||||||
|
Additional permissions that are applicable to the entire Program shall
|
||||||
|
be treated as though they were included in this License, to the extent
|
||||||
|
that they are valid under applicable law. If additional permissions
|
||||||
|
apply only to part of the Program, that part may be used separately
|
||||||
|
under those permissions, but the entire Program remains governed by
|
||||||
|
this License without regard to the additional permissions.
|
||||||
|
|
||||||
|
When you convey a copy of a covered work, you may at your option
|
||||||
|
remove any additional permissions from that copy, or from any part of
|
||||||
|
it. (Additional permissions may be written to require their own
|
||||||
|
removal in certain cases when you modify the work.) You may place
|
||||||
|
additional permissions on material, added by you to a covered work,
|
||||||
|
for which you have or can give appropriate copyright permission.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, for material you
|
||||||
|
add to a covered work, you may (if authorized by the copyright holders of
|
||||||
|
that material) supplement the terms of this License with terms:
|
||||||
|
|
||||||
|
a) Disclaiming warranty or limiting liability differently from the
|
||||||
|
terms of sections 15 and 16 of this License; or
|
||||||
|
|
||||||
|
b) Requiring preservation of specified reasonable legal notices or
|
||||||
|
author attributions in that material or in the Appropriate Legal
|
||||||
|
Notices displayed by works containing it; or
|
||||||
|
|
||||||
|
c) Prohibiting misrepresentation of the origin of that material, or
|
||||||
|
requiring that modified versions of such material be marked in
|
||||||
|
reasonable ways as different from the original version; or
|
||||||
|
|
||||||
|
d) Limiting the use for publicity purposes of names of licensors or
|
||||||
|
authors of the material; or
|
||||||
|
|
||||||
|
e) Declining to grant rights under trademark law for use of some
|
||||||
|
trade names, trademarks, or service marks; or
|
||||||
|
|
||||||
|
f) Requiring indemnification of licensors and authors of that
|
||||||
|
material by anyone who conveys the material (or modified versions of
|
||||||
|
it) with contractual assumptions of liability to the recipient, for
|
||||||
|
any liability that these contractual assumptions directly impose on
|
||||||
|
those licensors and authors.
|
||||||
|
|
||||||
|
All other non-permissive additional terms are considered "further
|
||||||
|
restrictions" within the meaning of section 10. If the Program as you
|
||||||
|
received it, or any part of it, contains a notice stating that it is
|
||||||
|
governed by this License along with a term that is a further
|
||||||
|
restriction, you may remove that term. If a license document contains
|
||||||
|
a further restriction but permits relicensing or conveying under this
|
||||||
|
License, you may add to a covered work material governed by the terms
|
||||||
|
of that license document, provided that the further restriction does
|
||||||
|
not survive such relicensing or conveying.
|
||||||
|
|
||||||
|
If you add terms to a covered work in accord with this section, you
|
||||||
|
must place, in the relevant source files, a statement of the
|
||||||
|
additional terms that apply to those files, or a notice indicating
|
||||||
|
where to find the applicable terms.
|
||||||
|
|
||||||
|
Additional terms, permissive or non-permissive, may be stated in the
|
||||||
|
form of a separately written license, or stated as exceptions;
|
||||||
|
the above requirements apply either way.
|
||||||
|
|
||||||
|
8. Termination.
|
||||||
|
|
||||||
|
You may not propagate or modify a covered work except as expressly
|
||||||
|
provided under this License. Any attempt otherwise to propagate or
|
||||||
|
modify it is void, and will automatically terminate your rights under
|
||||||
|
this License (including any patent licenses granted under the third
|
||||||
|
paragraph of section 11).
|
||||||
|
|
||||||
|
However, if you cease all violation of this License, then your
|
||||||
|
license from a particular copyright holder is reinstated (a)
|
||||||
|
provisionally, unless and until the copyright holder explicitly and
|
||||||
|
finally terminates your license, and (b) permanently, if the copyright
|
||||||
|
holder fails to notify you of the violation by some reasonable means
|
||||||
|
prior to 60 days after the cessation.
|
||||||
|
|
||||||
|
Moreover, your license from a particular copyright holder is
|
||||||
|
reinstated permanently if the copyright holder notifies you of the
|
||||||
|
violation by some reasonable means, this is the first time you have
|
||||||
|
received notice of violation of this License (for any work) from that
|
||||||
|
copyright holder, and you cure the violation prior to 30 days after
|
||||||
|
your receipt of the notice.
|
||||||
|
|
||||||
|
Termination of your rights under this section does not terminate the
|
||||||
|
licenses of parties who have received copies or rights from you under
|
||||||
|
this License. If your rights have been terminated and not permanently
|
||||||
|
reinstated, you do not qualify to receive new licenses for the same
|
||||||
|
material under section 10.
|
||||||
|
|
||||||
|
9. Acceptance Not Required for Having Copies.
|
||||||
|
|
||||||
|
You are not required to accept this License in order to receive or
|
||||||
|
run a copy of the Program. Ancillary propagation of a covered work
|
||||||
|
occurring solely as a consequence of using peer-to-peer transmission
|
||||||
|
to receive a copy likewise does not require acceptance. However,
|
||||||
|
nothing other than this License grants you permission to propagate or
|
||||||
|
modify any covered work. These actions infringe copyright if you do
|
||||||
|
not accept this License. Therefore, by modifying or propagating a
|
||||||
|
covered work, you indicate your acceptance of this License to do so.
|
||||||
|
|
||||||
|
10. Automatic Licensing of Downstream Recipients.
|
||||||
|
|
||||||
|
Each time you convey a covered work, the recipient automatically
|
||||||
|
receives a license from the original licensors, to run, modify and
|
||||||
|
propagate that work, subject to this License. You are not responsible
|
||||||
|
for enforcing compliance by third parties with this License.
|
||||||
|
|
||||||
|
An "entity transaction" is a transaction transferring control of an
|
||||||
|
organization, or substantially all assets of one, or subdividing an
|
||||||
|
organization, or merging organizations. If propagation of a covered
|
||||||
|
work results from an entity transaction, each party to that
|
||||||
|
transaction who receives a copy of the work also receives whatever
|
||||||
|
licenses to the work the party's predecessor in interest had or could
|
||||||
|
give under the previous paragraph, plus a right to possession of the
|
||||||
|
Corresponding Source of the work from the predecessor in interest, if
|
||||||
|
the predecessor has it or can get it with reasonable efforts.
|
||||||
|
|
||||||
|
You may not impose any further restrictions on the exercise of the
|
||||||
|
rights granted or affirmed under this License. For example, you may
|
||||||
|
not impose a license fee, royalty, or other charge for exercise of
|
||||||
|
rights granted under this License, and you may not initiate litigation
|
||||||
|
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||||
|
any patent claim is infringed by making, using, selling, offering for
|
||||||
|
sale, or importing the Program or any portion of it.
|
||||||
|
|
||||||
|
11. Patents.
|
||||||
|
|
||||||
|
A "contributor" is a copyright holder who authorizes use under this
|
||||||
|
License of the Program or a work on which the Program is based. The
|
||||||
|
work thus licensed is called the contributor's "contributor version".
|
||||||
|
|
||||||
|
A contributor's "essential patent claims" are all patent claims
|
||||||
|
owned or controlled by the contributor, whether already acquired or
|
||||||
|
hereafter acquired, that would be infringed by some manner, permitted
|
||||||
|
by this License, of making, using, or selling its contributor version,
|
||||||
|
but do not include claims that would be infringed only as a
|
||||||
|
consequence of further modification of the contributor version. For
|
||||||
|
purposes of this definition, "control" includes the right to grant
|
||||||
|
patent sublicenses in a manner consistent with the requirements of
|
||||||
|
this License.
|
||||||
|
|
||||||
|
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||||
|
patent license under the contributor's essential patent claims, to
|
||||||
|
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||||
|
propagate the contents of its contributor version.
|
||||||
|
|
||||||
|
In the following three paragraphs, a "patent license" is any express
|
||||||
|
agreement or commitment, however denominated, not to enforce a patent
|
||||||
|
(such as an express permission to practice a patent or covenant not to
|
||||||
|
sue for patent infringement). To "grant" such a patent license to a
|
||||||
|
party means to make such an agreement or commitment not to enforce a
|
||||||
|
patent against the party.
|
||||||
|
|
||||||
|
If you convey a covered work, knowingly relying on a patent license,
|
||||||
|
and the Corresponding Source of the work is not available for anyone
|
||||||
|
to copy, free of charge and under the terms of this License, through a
|
||||||
|
publicly available network server or other readily accessible means,
|
||||||
|
then you must either (1) cause the Corresponding Source to be so
|
||||||
|
available, or (2) arrange to deprive yourself of the benefit of the
|
||||||
|
patent license for this particular work, or (3) arrange, in a manner
|
||||||
|
consistent with the requirements of this License, to extend the patent
|
||||||
|
license to downstream recipients. "Knowingly relying" means you have
|
||||||
|
actual knowledge that, but for the patent license, your conveying the
|
||||||
|
covered work in a country, or your recipient's use of the covered work
|
||||||
|
in a country, would infringe one or more identifiable patents in that
|
||||||
|
country that you have reason to believe are valid.
|
||||||
|
|
||||||
|
If, pursuant to or in connection with a single transaction or
|
||||||
|
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||||
|
covered work, and grant a patent license to some of the parties
|
||||||
|
receiving the covered work authorizing them to use, propagate, modify
|
||||||
|
or convey a specific copy of the covered work, then the patent license
|
||||||
|
you grant is automatically extended to all recipients of the covered
|
||||||
|
work and works based on it.
|
||||||
|
|
||||||
|
A patent license is "discriminatory" if it does not include within
|
||||||
|
the scope of its coverage, prohibits the exercise of, or is
|
||||||
|
conditioned on the non-exercise of one or more of the rights that are
|
||||||
|
specifically granted under this License. You may not convey a covered
|
||||||
|
work if you are a party to an arrangement with a third party that is
|
||||||
|
in the business of distributing software, under which you make payment
|
||||||
|
to the third party based on the extent of your activity of conveying
|
||||||
|
the work, and under which the third party grants, to any of the
|
||||||
|
parties who would receive the covered work from you, a discriminatory
|
||||||
|
patent license (a) in connection with copies of the covered work
|
||||||
|
conveyed by you (or copies made from those copies), or (b) primarily
|
||||||
|
for and in connection with specific products or compilations that
|
||||||
|
contain the covered work, unless you entered into that arrangement,
|
||||||
|
or that patent license was granted, prior to 28 March 2007.
|
||||||
|
|
||||||
|
Nothing in this License shall be construed as excluding or limiting
|
||||||
|
any implied license or other defenses to infringement that may
|
||||||
|
otherwise be available to you under applicable patent law.
|
||||||
|
|
||||||
|
12. No Surrender of Others' Freedom.
|
||||||
|
|
||||||
|
If conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot convey a
|
||||||
|
covered work so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you may
|
||||||
|
not convey it at all. For example, if you agree to terms that obligate you
|
||||||
|
to collect a royalty for further conveying from those to whom you convey
|
||||||
|
the Program, the only way you could satisfy both those terms and this
|
||||||
|
License would be to refrain entirely from conveying the Program.
|
||||||
|
|
||||||
|
13. Use with the GNU Affero General Public License.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, you have
|
||||||
|
permission to link or combine any covered work with a work licensed
|
||||||
|
under version 3 of the GNU Affero General Public License into a single
|
||||||
|
combined work, and to convey the resulting work. The terms of this
|
||||||
|
License will continue to apply to the part which is the covered work,
|
||||||
|
but the special requirements of the GNU Affero General Public License,
|
||||||
|
section 13, concerning interaction through a network will apply to the
|
||||||
|
combination as such.
|
||||||
|
|
||||||
|
14. Revised Versions of this License.
|
||||||
|
|
||||||
|
The Free Software Foundation may publish revised and/or new versions of
|
||||||
|
the GNU General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the
|
||||||
|
Program specifies that a certain numbered version of the GNU General
|
||||||
|
Public License "or any later version" applies to it, you have the
|
||||||
|
option of following the terms and conditions either of that numbered
|
||||||
|
version or of any later version published by the Free Software
|
||||||
|
Foundation. If the Program does not specify a version number of the
|
||||||
|
GNU General Public License, you may choose any version ever published
|
||||||
|
by the Free Software Foundation.
|
||||||
|
|
||||||
|
If the Program specifies that a proxy can decide which future
|
||||||
|
versions of the GNU General Public License can be used, that proxy's
|
||||||
|
public statement of acceptance of a version permanently authorizes you
|
||||||
|
to choose that version for the Program.
|
||||||
|
|
||||||
|
Later license versions may give you additional or different
|
||||||
|
permissions. However, no additional obligations are imposed on any
|
||||||
|
author or copyright holder as a result of your choosing to follow a
|
||||||
|
later version.
|
||||||
|
|
||||||
|
15. Disclaimer of Warranty.
|
||||||
|
|
||||||
|
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||||
|
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||||
|
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||||
|
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||||
|
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||||
|
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
16. Limitation of Liability.
|
||||||
|
|
||||||
|
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||||
|
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||||
|
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||||
|
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||||
|
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||||
|
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||||
|
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGES.
|
||||||
|
|
||||||
|
17. Interpretation of Sections 15 and 16.
|
||||||
|
|
||||||
|
If the disclaimer of warranty and limitation of liability provided
|
||||||
|
above cannot be given local legal effect according to their terms,
|
||||||
|
reviewing courts shall apply local law that most closely approximates
|
||||||
|
an absolute waiver of all civil liability in connection with the
|
||||||
|
Program, unless a warranty or assumption of liability accompanies a
|
||||||
|
copy of the Program in return for a fee.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
state the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program does terminal interaction, make it output a short
|
||||||
|
notice like this when it starts in an interactive mode:
|
||||||
|
|
||||||
|
<program> Copyright (C) <year> <name of author>
|
||||||
|
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, your program's commands
|
||||||
|
might be different; for a GUI interface, you would use an "about box".
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or school,
|
||||||
|
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||||
|
For more information on this, and how to apply and follow the GNU GPL, see
|
||||||
|
<https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
The GNU General Public License does not permit incorporating your program
|
||||||
|
into proprietary programs. If your program is a subroutine library, you
|
||||||
|
may consider it more useful to permit linking proprietary applications with
|
||||||
|
the library. If this is what you want to do, use the GNU Lesser General
|
||||||
|
Public License instead of this License. But first, please read
|
||||||
|
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
||||||
|
63
README.md
63
README.md
@ -1,61 +1,2 @@
|
|||||||
# <img alt="LOGO" src="https://dev.npid7.de/tobid7/RenderD7/raw/branch/main/logo.png" height="90">
|
# RenderD7 (https://npi-d7.github.io/RenderD7/main/doc/html/index.html)
|
||||||
# RenderD7 as Submodule (0.9.5+)
|
Simple and Easey to use UI and Graphics helper.
|
||||||
To use RenderD7 just use this command: `git submodule add https://github.com/NPI-D7/RenderD7` and add `-b v0.9.5` for example for a specific version.
|
|
||||||
|
|
||||||
|
|
||||||
And in Your Project Makefile add this
|
|
||||||
```
|
|
||||||
# Make Sure to Change this paths if your Submodule
|
|
||||||
# is located somewhere else
|
|
||||||
RENDERD7_SRC := RenderD7/source RenderD7/external
|
|
||||||
RENDERD7_INC := RenderD7/include
|
|
||||||
# Libraries used for RenderD7
|
|
||||||
# if you already use -lm, -lctru etc place a # before -lm
|
|
||||||
RENDERD7_LIBS := -lcurl -lmbedtls -lmbedx509 -lmbedcrypto -lz -lm -lcitro2dd -lcitro3d -lctru
|
|
||||||
```
|
|
||||||
Now you need to add it to your sources and includes
|
|
||||||
```
|
|
||||||
SOURCES := source $(RENDERD7_SRC)
|
|
||||||
INCLUDES := source $(RENDERD7_INC)
|
|
||||||
```
|
|
||||||
|
|
||||||
Example from rd7tf
|
|
||||||
### Installation (0.8.0-0.9.4) (OUTDATED)
|
|
||||||
Download a Package From Releses Page
|
|
||||||
`https://github.com/NPI-D7/RenderD7/releases/download/v0.9.4/renderd7.tar.bz2 -o renderd7.tar.bz2`
|
|
||||||
Then Extract it to your Libraries Path
|
|
||||||
`bzip2 -cd renderd7.tar.bz2 | tar -xf - -C path_to_your_libs`
|
|
||||||
Finally put `-lrenderd7` to the First Place and add the path_to_your_libs
|
|
||||||
```
|
|
||||||
LIBS := -lrenderd7 -lcurl -lstdc++ -lm -lcitro2d -lcitro3d -lctru
|
|
||||||
#---------------------------------------------------------------------------------
|
|
||||||
# list of directories containing libraries, this must be the top level containing
|
|
||||||
# include and lib
|
|
||||||
#---------------------------------------------------------------------------------
|
|
||||||
LIBDIRS := $(PORTLIBS) $(CTRULIB) ../path_to_your_libs
|
|
||||||
```
|
|
||||||
Make sure that `-lrenderd7` is before `-lcitro2d`, `-lcitro3d`, `-lctru`.
|
|
||||||
Here an example tree
|
|
||||||
```
|
|
||||||
Example-App
|
|
||||||
├── gfx
|
|
||||||
├── libs
|
|
||||||
│ ├── include
|
|
||||||
│ │ ├── rd7.hpp
|
|
||||||
│ │ └── renderd7
|
|
||||||
│ └── lib
|
|
||||||
│ ├── librenderd7.a
|
|
||||||
│ └── librenderd7d.a
|
|
||||||
├── Makefile
|
|
||||||
├── romfs
|
|
||||||
│ └── gfx
|
|
||||||
└── src
|
|
||||||
└── main.cpp
|
|
||||||
```
|
|
||||||
# Credits
|
|
||||||
- NPI-D7
|
|
||||||
- Tobi-D7 Main Dev
|
|
||||||
|
|
||||||
Some Icons are From
|
|
||||||
https://icons8.de/
|
|
||||||
See Subfolder Readmes
|
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
--atlas -f rgba -z auto
|
|
||||||
|
|
||||||
renderd7_logo/renderd7_logo.png
|
|
Binary file not shown.
Before Width: | Height: | Size: 17 KiB |
@ -1,27 +0,0 @@
|
|||||||
import subprocess
|
|
||||||
import glob
|
|
||||||
from pathlib import Path
|
|
||||||
# Format script
|
|
||||||
|
|
||||||
def fmt_file(path):
|
|
||||||
if Path(path).is_dir():
|
|
||||||
return # Skip
|
|
||||||
try:
|
|
||||||
subprocess.run(['clang-format', '-i', path, '--style=Google'], check=True)
|
|
||||||
except subprocess.CalledProcessError as e:
|
|
||||||
print('Error for ' + Path(path).stem + ': ' + e)
|
|
||||||
|
|
||||||
def fmt_dir(path):
|
|
||||||
sources = glob.glob(path+'/*')
|
|
||||||
for file in sources:
|
|
||||||
fmt_file(file)
|
|
||||||
|
|
||||||
print('Formatting...')
|
|
||||||
fmt_dir('source')
|
|
||||||
fmt_dir('include')
|
|
||||||
fmt_dir('include/renderd7')
|
|
||||||
|
|
||||||
# Format LE and TF as well
|
|
||||||
fmt_dir('rd7tf/source')
|
|
||||||
#fmt_dir('rd7le/source')
|
|
||||||
print('Done')
|
|
@ -1,18 +0,0 @@
|
|||||||
<div class="md-copyright">
|
|
||||||
{% if config.copyright %}
|
|
||||||
<div class="md-copyright__highlight">
|
|
||||||
{{ config.copyright }}
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% if not config.extra.generator == false %}
|
|
||||||
Made with
|
|
||||||
<a href="https://doxide.org" target="_blank" rel="noopener">
|
|
||||||
Doxide
|
|
||||||
</a>
|
|
||||||
and
|
|
||||||
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
|
|
||||||
Material for MkDocs
|
|
||||||
</a>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
<div class="md-copyright">
|
|
||||||
{% if config.copyright %}
|
|
||||||
<div class="md-copyright__highlight">
|
|
||||||
{{ config.copyright }}
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% if not config.extra.generator == false %}
|
|
||||||
Made with
|
|
||||||
<a href="https://doxide.org" target="_blank" rel="noopener">
|
|
||||||
Doxide
|
|
||||||
</a>
|
|
||||||
and
|
|
||||||
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
|
|
||||||
Material for MkDocs
|
|
||||||
</a>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
|
|
@ -1,49 +0,0 @@
|
|||||||
:root {
|
|
||||||
--md-admonition-icon--variable: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.41 3c1.39 2.71 1.94 5.84 1.59 9-.2 3.16-1.3 6.29-3.17 9l-1.53-1c1.61-2.43 2.55-5.2 2.7-8 .34-2.8-.11-5.57-1.3-8l1.71-1M5.17 3 6.7 4C5.09 6.43 4.15 9.2 4 12c-.34 2.8.12 5.57 1.3 8l-1.69 1c-1.4-2.71-1.96-5.83-1.61-9 .2-3.16 1.3-6.29 3.17-9m6.91 7.68 2.32-3.23h2.53l-3.78 5 2.2 4.92h-2.26L11.71 14l-2.43 3.33H6.76l3.9-5.12-2.13-4.76h2.27l1.28 3.23Z"/></svg>');
|
|
||||||
--md-admonition-icon--function: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15.6 5.29c-1.1-.1-2.07.71-2.17 1.82L13.18 10H16v2h-3l-.44 5.07a3.986 3.986 0 0 1-4.33 3.63 4.007 4.007 0 0 1-3.06-1.87l1.5-1.5c.24.74.9 1.31 1.73 1.38 1.1.1 2.07-.71 2.17-1.82L11 12H8v-2h3.17l.27-3.07c.19-2.2 2.13-3.83 4.33-3.63 1.31.11 2.41.84 3.06 1.87l-1.5 1.5c-.24-.74-.9-1.31-1.73-1.38Z"/></svg>');
|
|
||||||
--md-admonition-icon--concept: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3.75 3.5a.25.25 0 0 0-.25.25v2.062a.75.75 0 1 1-1.5 0V3.75C2 2.783 2.783 2 3.75 2h2.062a.75.75 0 1 1 0 1.5Zm13.688-.75a.75.75 0 0 1 .75-.75h2.062c.966 0 1.75.783 1.75 1.75v2.062a.75.75 0 1 1-1.5 0V3.75a.25.25 0 0 0-.25-.25h-2.062a.75.75 0 0 1-.75-.75ZM2.75 17.438a.75.75 0 0 1 .75.75v2.062c0 .138.112.25.25.25h2.062a.75.75 0 1 1 0 1.5H3.75A1.75 1.75 0 0 1 2 20.25v-2.062a.75.75 0 0 1 .75-.75Zm18.5 0a.75.75 0 0 1 .75.75v2.062A1.75 1.75 0 0 1 20.25 22h-2.062a.75.75 0 1 1 0-1.5h2.062a.25.25 0 0 0 .25-.25v-2.062a.75.75 0 0 1 .75-.75Zm-18.5-8.25a.75.75 0 0 1 .75.75v4.124a.75.75 0 1 1-1.5 0V9.938a.75.75 0 0 1 .75-.75ZM9.188 2.75a.75.75 0 0 1 .75-.75h4.124a.75.75 0 1 1 0 1.5H9.938a.75.75 0 0 1-.75-.75Zm0 18.5a.75.75 0 0 1 .75-.75h4.124a.75.75 0 1 1 0 1.5H9.938a.75.75 0 0 1-.75-.75ZM21.25 9.188a.75.75 0 0 1 .75.75v4.124a.75.75 0 1 1-1.5 0V9.938a.75.75 0 0 1 .75-.75ZM3.75 8.25a.75.75 0 0 1 .75-.75h2a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1-.75-.75Zm5.5 0A.75.75 0 0 1 10 7.5h2A.75.75 0 0 1 12 9h-2a.75.75 0 0 1-.75-.75Zm-1-4.5A.75.75 0 0 1 9 4.5v2a.75.75 0 0 1-1.5 0v-2a.75.75 0 0 1 .75-.75Zm0 5.5A.75.75 0 0 1 9 10v2a.75.75 0 0 1-1.5 0v-2a.75.75 0 0 1 .75-.75Zm0 4.75a.75.75 0 0 1 .75.75v4a.75.75 0 0 1-1.5 0v-4a.75.75 0 0 1 .75-.75ZM14 8.25a.75.75 0 0 1 .75-.75h4a.75.75 0 0 1 0 1.5h-4a.75.75 0 0 1-.75-.75Z"/></svg>');
|
|
||||||
--md-admonition-icon--macro: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m5.41 21 .71-4h-4l.35-2h4l1.06-6h-4l.35-2h4l.71-4h2l-.71 4h6l.71-4h2l-.71 4h4l-.35 2h-4l-1.06 6h4l-.35 2h-4l-.71 4h-2l.71-4h-6l-.71 4h-2M9.53 9l-1.06 6h6l1.06-6h-6Z"/></svg>');
|
|
||||||
}
|
|
||||||
|
|
||||||
.md-typeset .admonition.variable, .md-typeset details.variable,
|
|
||||||
.md-typeset .admonition.function, .md-typeset details.function,
|
|
||||||
.md-typeset .admonition.concept, .md-typeset details.concept,
|
|
||||||
.md-typeset .admonition.macro, .md-typeset details.macro {
|
|
||||||
border-color: var(--md-default-fg-color--lighter);
|
|
||||||
}
|
|
||||||
|
|
||||||
.md-typeset .variable > .admonition-title, .md-typeset .variable > summary,
|
|
||||||
.md-typeset .function > .admonition-title, .md-typeset .function > summary,
|
|
||||||
.md-typeset .concept > .admonition-title, .md-typeset .concept > summary,
|
|
||||||
.md-typeset .macro > .admonition-title, .md-typeset .macro > summary {
|
|
||||||
background-color: var(--md-default-bg-color);
|
|
||||||
}
|
|
||||||
|
|
||||||
.md-typeset .variable > .admonition-title::before,
|
|
||||||
.md-typeset .variable > summary::before {
|
|
||||||
background-color: var(--md-default-fg-color--light);
|
|
||||||
-webkit-mask-image: var(--md-admonition-icon--variable);
|
|
||||||
mask-image: var(--md-admonition-icon--variable);
|
|
||||||
}
|
|
||||||
|
|
||||||
.md-typeset .function > .admonition-title::before,
|
|
||||||
.md-typeset .function > summary::before {
|
|
||||||
background-color: var(--md-default-fg-color--light);
|
|
||||||
-webkit-mask-image: var(--md-admonition-icon--function);
|
|
||||||
mask-image: var(--md-admonition-icon--function);
|
|
||||||
}
|
|
||||||
|
|
||||||
.md-typeset .concept > .admonition-title::before,
|
|
||||||
.md-typeset .concept > summary::before {
|
|
||||||
background-color: var(--md-default-fg-color--light);
|
|
||||||
-webkit-mask-image: var(--md-admonition-icon--concept);
|
|
||||||
mask-image: var(--md-admonition-icon--concept);
|
|
||||||
}
|
|
||||||
|
|
||||||
.md-typeset .macro > .admonition-title::before,
|
|
||||||
.md-typeset .macro > summary::before {
|
|
||||||
background-color: var(--md-default-fg-color--light);
|
|
||||||
-webkit-mask-image: var(--md-admonition-icon--macro);
|
|
||||||
mask-image: var(--md-admonition-icon--macro);
|
|
||||||
}
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
|||||||
title: RenderD7
|
|
||||||
description:
|
|
||||||
files:
|
|
||||||
- "include/*.hpp"
|
|
||||||
- "include/renderd7/*.hpp"
|
|
||||||
- "include/renderd7/music/*.hpp"
|
|
||||||
- "include/*.h"
|
|
||||||
- "include/renderd7/*.h"
|
|
||||||
- "include/renderd7/music/*.h"
|
|
1450
doxygen.css
Normal file
1450
doxygen.css
Normal file
File diff suppressed because it is too large
Load Diff
320
external/fs.c
vendored
Normal file
320
external/fs.c
vendored
Normal file
@ -0,0 +1,320 @@
|
|||||||
|
#include "external/fs.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
void Utils_U8_To_U16(u16 *buf, const u8 *input, size_t bufsize) {
|
||||||
|
ssize_t units = utf8_to_utf16(buf, input, bufsize);
|
||||||
|
|
||||||
|
if (units < 0)
|
||||||
|
units = 0;
|
||||||
|
|
||||||
|
buf[units] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
FS_Archive archive, sdmc_archive, nand_archive;
|
||||||
|
|
||||||
|
Result FS_OpenArchive(FS_Archive *archive, FS_ArchiveID archiveID) {
|
||||||
|
Result ret = 0;
|
||||||
|
|
||||||
|
if (R_FAILED(ret = FSUSER_OpenArchive(archive, archiveID, fsMakePath(PATH_EMPTY, ""))))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result FS_CloseArchive(FS_Archive archive) {
|
||||||
|
Result ret = 0;
|
||||||
|
|
||||||
|
if (R_FAILED(ret = FSUSER_CloseArchive(archive)))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result FS_OpenDir(Handle *handle, FS_Archive archive, const char *path) {
|
||||||
|
Result ret = 0;
|
||||||
|
|
||||||
|
u16 path_u16[strlen(path) + 1];
|
||||||
|
Utils_U8_To_U16(path_u16, (const u8 *)path, strlen(path) + 1);
|
||||||
|
|
||||||
|
if (R_FAILED(ret = FSUSER_OpenDirectory(handle, archive, fsMakePath(PATH_UTF16, path_u16))))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result FS_OpenFile(Handle *handle, FS_Archive archive, const char *path, u32 flags, u32 attributes) {
|
||||||
|
Result ret = 0;
|
||||||
|
|
||||||
|
u16 path_u16[strlen(path) + 1];
|
||||||
|
Utils_U8_To_U16(path_u16, (const u8 *)path, strlen(path) + 1);
|
||||||
|
|
||||||
|
if (R_FAILED(ret = FSUSER_OpenFile(handle, archive, fsMakePath(PATH_UTF16, path_u16), flags, attributes)))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result FS_MakeDir(FS_Archive archive, const char *path) {
|
||||||
|
Result ret = 0;
|
||||||
|
|
||||||
|
u16 path_u16[strlen(path) + 1];
|
||||||
|
Utils_U8_To_U16(path_u16, (const u8 *)path, strlen(path) + 1);
|
||||||
|
|
||||||
|
if (R_FAILED(ret = FSUSER_CreateDirectory(archive, fsMakePath(PATH_UTF16, path_u16), 0)))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result FS_CreateFile(FS_Archive archive, const char *path, u64 size) {
|
||||||
|
Result ret = 0;
|
||||||
|
|
||||||
|
u16 path_u16[strlen(path) + 1];
|
||||||
|
Utils_U8_To_U16(path_u16, (const u8 *)path, strlen(path) + 1);
|
||||||
|
|
||||||
|
if (R_FAILED(ret = FSUSER_CreateFile(archive, fsMakePath(PATH_UTF16, path_u16), 0, size)))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result FS_RecursiveMakeDir(FS_Archive archive, const char *path) {
|
||||||
|
Result ret = 0;
|
||||||
|
char buf[256];
|
||||||
|
char *p = NULL;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
snprintf(buf, sizeof(buf), "%s", path);
|
||||||
|
len = strlen(buf);
|
||||||
|
|
||||||
|
if (buf[len - 1] == '/')
|
||||||
|
buf[len - 1] = 0;
|
||||||
|
|
||||||
|
for (p = buf + 1; *p; p++) {
|
||||||
|
if (*p == '/') {
|
||||||
|
*p = 0;
|
||||||
|
|
||||||
|
if (!FS_DirExists(archive, buf))
|
||||||
|
ret = FS_MakeDir(archive, buf);
|
||||||
|
|
||||||
|
*p = '/';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!FS_DirExists(archive, buf))
|
||||||
|
ret = FS_MakeDir(archive, buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FS_FileExists(FS_Archive archive, const char *path) {
|
||||||
|
Handle handle;
|
||||||
|
|
||||||
|
u16 path_u16[strlen(path) + 1];
|
||||||
|
Utils_U8_To_U16(path_u16, (const u8 *)path, strlen(path) + 1);
|
||||||
|
|
||||||
|
if (R_FAILED(FSUSER_OpenFile(&handle, archive, fsMakePath(PATH_UTF16, path_u16), FS_OPEN_READ, 0)))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (R_FAILED(FSFILE_Close(handle)))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FS_DirExists(FS_Archive archive, const char *path) {
|
||||||
|
Handle handle;
|
||||||
|
|
||||||
|
u16 path_u16[strlen(path) + 1];
|
||||||
|
Utils_U8_To_U16(path_u16, (const u8 *)path, strlen(path) + 1);
|
||||||
|
|
||||||
|
if (R_FAILED(FSUSER_OpenDirectory(&handle, archive, fsMakePath(PATH_UTF16, path_u16))))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (R_FAILED(FSDIR_Close(handle)))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result FS_GetFileSize(FS_Archive archive, const char *path, u64 *size) {
|
||||||
|
Result ret = 0;
|
||||||
|
Handle handle;
|
||||||
|
|
||||||
|
u16 path_u16[strlen(path) + 1];
|
||||||
|
Utils_U8_To_U16(path_u16, (const u8 *)path, strlen(path) + 1);
|
||||||
|
|
||||||
|
if (R_FAILED(ret = FSUSER_OpenFile(&handle, archive, fsMakePath(PATH_UTF16, path_u16), FS_OPEN_READ, 0)))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if (R_FAILED(ret = FSFILE_GetSize(handle, size))) {
|
||||||
|
FSFILE_Close(handle);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (R_FAILED(ret = FSFILE_Close(handle)))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
u64 FS_GetFreeStorage(FS_SystemMediaType media_type) {
|
||||||
|
FS_ArchiveResource resource = {0};
|
||||||
|
|
||||||
|
if (R_SUCCEEDED(FSUSER_GetArchiveResource(&resource, media_type)))
|
||||||
|
return (((u64)resource.freeClusters * (u64)resource.clusterSize));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
u64 FS_GetTotalStorage(FS_SystemMediaType media_type) {
|
||||||
|
FS_ArchiveResource resource = {0};
|
||||||
|
|
||||||
|
if (R_SUCCEEDED(FSUSER_GetArchiveResource(&resource, media_type)))
|
||||||
|
return (((u64)resource.totalClusters * (u64)resource.clusterSize));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
u64 FS_GetUsedStorage(FS_SystemMediaType media_type) {
|
||||||
|
return (FS_GetTotalStorage(media_type) - FS_GetUsedStorage(media_type));
|
||||||
|
}
|
||||||
|
|
||||||
|
Result FS_RemoveFile(FS_Archive archive, const char *path) {
|
||||||
|
Result ret = 0;
|
||||||
|
|
||||||
|
u16 path_u16[strlen(path) + 1];
|
||||||
|
Utils_U8_To_U16(path_u16, (const u8 *)path, strlen(path) + 1);
|
||||||
|
|
||||||
|
if (R_FAILED(ret = FSUSER_DeleteFile(archive, fsMakePath(PATH_UTF16, path_u16))))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result FS_RemoveDir(FS_Archive archive, const char *path) {
|
||||||
|
Result ret = 0;
|
||||||
|
|
||||||
|
u16 path_u16[strlen(path) + 1];
|
||||||
|
Utils_U8_To_U16(path_u16, (const u8 *)path, strlen(path) + 1);
|
||||||
|
|
||||||
|
if (R_FAILED(ret = FSUSER_DeleteDirectory(archive, fsMakePath(PATH_UTF16, path_u16))))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result FS_RemoveDirRecursive(FS_Archive archive, const char *path) {
|
||||||
|
Result ret = 0;
|
||||||
|
|
||||||
|
u16 path_u16[strlen(path) + 1];
|
||||||
|
Utils_U8_To_U16(path_u16, (const u8 *)path, strlen(path) + 1);
|
||||||
|
|
||||||
|
if (R_FAILED(ret = FSUSER_DeleteDirectoryRecursively(archive, fsMakePath(PATH_UTF16, path_u16))))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result FS_RenameFile(FS_Archive archive, const char *old_filename, const char *new_filename) {
|
||||||
|
Result ret = 0;
|
||||||
|
|
||||||
|
u16 old_filename_u16[strlen(old_filename) + 1];
|
||||||
|
Utils_U8_To_U16(old_filename_u16, (const u8 *)old_filename, strlen(old_filename) + 1);
|
||||||
|
|
||||||
|
u16 new_filename_u16[strlen(new_filename) + 1];
|
||||||
|
Utils_U8_To_U16(new_filename_u16, (const u8 *)new_filename, strlen(new_filename) + 1);
|
||||||
|
|
||||||
|
if (R_FAILED(ret = FSUSER_RenameFile(archive, fsMakePath(PATH_UTF16, old_filename_u16), archive, fsMakePath(PATH_UTF16, new_filename_u16))))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result FS_RenameDir(FS_Archive archive, const char *old_dirname, const char *new_dirname) {
|
||||||
|
Result ret = 0;
|
||||||
|
|
||||||
|
u16 old_dirname_u16[strlen(old_dirname) + 1];
|
||||||
|
Utils_U8_To_U16(old_dirname_u16, (const u8 *)old_dirname, strlen(old_dirname) + 1);
|
||||||
|
|
||||||
|
u16 new_dirname_u16[strlen(new_dirname) + 1];
|
||||||
|
Utils_U8_To_U16(new_dirname_u16, (const u8 *)new_dirname, strlen(new_dirname) + 1);
|
||||||
|
|
||||||
|
if (R_FAILED(ret = FSUSER_RenameDirectory(archive, fsMakePath(PATH_UTF16, old_dirname_u16), archive, fsMakePath(PATH_UTF16, new_dirname_u16))))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result FS_Read(FS_Archive archive, const char *path, u64 size, void *buf) {
|
||||||
|
Result ret = 0;
|
||||||
|
Handle handle;
|
||||||
|
|
||||||
|
u32 bytes_read = 0;
|
||||||
|
|
||||||
|
if (R_FAILED(ret = FS_OpenFile(&handle, archive, path, FS_OPEN_READ, 0)))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if (R_FAILED(ret = FSFILE_Read(handle, &bytes_read, 0, buf, size))) {
|
||||||
|
FSFILE_Close(handle);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (R_FAILED(ret = FSFILE_Close(handle)))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result FS_Write(FS_Archive archive, const char *path, const void *buf, u32 size) {
|
||||||
|
Result ret = 0;
|
||||||
|
Handle handle;
|
||||||
|
u32 bytes_written = 0;
|
||||||
|
|
||||||
|
if (FS_FileExists(archive, path))
|
||||||
|
FS_RemoveFile(archive, path);
|
||||||
|
|
||||||
|
u16 path_u16[strlen(path) + 1];
|
||||||
|
Utils_U8_To_U16(path_u16, (const u8 *)path, strlen(path) + 1);
|
||||||
|
|
||||||
|
if (R_FAILED(ret = FSUSER_CreateFile(archive, fsMakePath(PATH_UTF16, path_u16), 0, size)))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if (R_FAILED(ret = FSUSER_OpenFile(&handle, archive, fsMakePath(PATH_UTF16, path_u16), FS_OPEN_WRITE, 0)))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if (R_FAILED(ret = FSFILE_Write(handle, &bytes_written, 0, buf, size, FS_WRITE_FLUSH))) {
|
||||||
|
FSFILE_Close(handle);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (R_FAILED(ret = FSFILE_Close(handle)))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *FS_GetFileTimestamp(const char *path) {
|
||||||
|
static char timeStr[60];
|
||||||
|
u64 mtime = 0;
|
||||||
|
|
||||||
|
if (R_SUCCEEDED(archive_getmtime(path, &mtime))) {
|
||||||
|
time_t mt = mtime;
|
||||||
|
struct tm *timeStruct = gmtime(&mt);
|
||||||
|
|
||||||
|
int hours = timeStruct->tm_hour;
|
||||||
|
int minutes = timeStruct->tm_min;
|
||||||
|
|
||||||
|
int day = timeStruct->tm_mday;
|
||||||
|
int month = timeStruct->tm_mon + 1; // January being 0
|
||||||
|
int year = timeStruct->tm_year + 1900;
|
||||||
|
|
||||||
|
snprintf(timeStr, 60, "%d/%d/%d %2i:%02i", year, month, day, hours, minutes);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return timeStr;
|
||||||
|
}
|
30
external/fs.h
vendored
Normal file
30
external/fs.h
vendored
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#ifndef _3D_SHELL_FS_H
|
||||||
|
#define _3D_SHELL_FS_H
|
||||||
|
|
||||||
|
#include <3ds.h>
|
||||||
|
|
||||||
|
extern FS_Archive archive, sdmc_archive, nand_archive;
|
||||||
|
|
||||||
|
Result FS_OpenArchive(FS_Archive *archive, FS_ArchiveID id);
|
||||||
|
Result FS_CloseArchive(FS_Archive archive);
|
||||||
|
Result FS_OpenDir(Handle *handle, FS_Archive archive, const char *path);
|
||||||
|
Result FS_OpenFile(Handle *handle, FS_Archive archive, const char *path, u32 flags, u32 attributes);
|
||||||
|
Result FS_MakeDir(FS_Archive archive, const char *path);
|
||||||
|
Result FS_CreateFile(FS_Archive archive, const char *path, u64 size);
|
||||||
|
Result FS_RecursiveMakeDir(FS_Archive archive, const char *path);
|
||||||
|
bool FS_FileExists(FS_Archive archive, const char *path);
|
||||||
|
bool FS_DirExists(FS_Archive archive, const char *path);
|
||||||
|
Result FS_GetFileSize(FS_Archive archive, const char *path, u64 *size);
|
||||||
|
u64 FS_GetFreeStorage(FS_SystemMediaType media_type);
|
||||||
|
u64 FS_GetTotalStorage(FS_SystemMediaType media_type);
|
||||||
|
u64 FS_GetUsedStorage(FS_SystemMediaType media_type);
|
||||||
|
Result FS_RemoveFile(FS_Archive archive, const char *path);
|
||||||
|
Result FS_RemoveDir(FS_Archive archive, const char *path);
|
||||||
|
Result FS_RemoveDirRecursive(FS_Archive archive, const char *path);
|
||||||
|
Result FS_RenameFile(FS_Archive archive, const char *old_filename, const char *new_filename);
|
||||||
|
Result FS_RenameDir(FS_Archive archive, const char *old_dirname, const char *new_dirname);
|
||||||
|
Result FS_Read(FS_Archive archive, const char *path, u64 size, void *buf);
|
||||||
|
Result FS_Write(FS_Archive archive, const char *path, const void *buf, u32 size);
|
||||||
|
char *FS_GetFileTimestamp(const char *path);
|
||||||
|
|
||||||
|
#endif
|
50894
include/renderd7/external/json.hpp → external/json.hpp
vendored
50894
include/renderd7/external/json.hpp → external/json.hpp
vendored
File diff suppressed because it is too large
Load Diff
6464
external/lodepng.cpp
vendored
Normal file
6464
external/lodepng.cpp
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1977
external/lodepng.h
vendored
Normal file
1977
external/lodepng.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1
extlibs/external.md
Normal file
1
extlibs/external.md
Normal file
@ -0,0 +1 @@
|
|||||||
|
External Librarys
|
@ -1,63 +0,0 @@
|
|||||||
import os
|
|
||||||
import glob
|
|
||||||
import shutil
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
# Simple Script to generate/update Assets
|
|
||||||
|
|
||||||
def file2array(path, custom_incluse_path):
|
|
||||||
print(path)
|
|
||||||
cip = len(custom_incluse_path)
|
|
||||||
sip = ''
|
|
||||||
if cip > 0:
|
|
||||||
sip = custom_incluse_path
|
|
||||||
name = Path(path).stem
|
|
||||||
filei = open(path, 'rb')
|
|
||||||
buf = filei.read()
|
|
||||||
filei.close()
|
|
||||||
fs = open(name + '.cpp', 'w')
|
|
||||||
fs.write("// THIS FILE WAS GENERATED BY generate_assets.py!!!\n\n")
|
|
||||||
fs.write('#include <'+ sip + name + '.hpp>\n\n')
|
|
||||||
fs.write('// clang-format off\n')
|
|
||||||
fs.write('unsigned char ' + name + '[] = {\n')
|
|
||||||
for byte in buf:
|
|
||||||
fs.write(hex(byte) + ', ')
|
|
||||||
fs.write('\n};\n')
|
|
||||||
fs.write('// clang-format on\n')
|
|
||||||
fs.write('size_t ' + name + '_size = ' + hex(len(buf)) + ';')
|
|
||||||
fs.close()
|
|
||||||
fh = open(name + '.hpp', 'w')
|
|
||||||
fh.write("// THIS FILE WAS GENERATED BY generate_assets.py!!!\n\n")
|
|
||||||
fh.write('#pragma once\n\n')
|
|
||||||
fh.write('#include <cstddef>\n\n')
|
|
||||||
fh.write('extern unsigned char ' + name + '[];\n')
|
|
||||||
fh.write('extern size_t ' + name + '_size;')
|
|
||||||
fh.close()
|
|
||||||
|
|
||||||
def tex3ds_build(path):
|
|
||||||
p = os.path.dirname(path)
|
|
||||||
n = Path(path).stem
|
|
||||||
os.system('tex3ds -o ' + p + '/' + n + '.t3x -i ' + path)
|
|
||||||
|
|
||||||
def cleanup():
|
|
||||||
t3x = glob.glob('assets/resources/*.t3x')
|
|
||||||
for f in t3x:
|
|
||||||
os.remove(f)
|
|
||||||
|
|
||||||
def install_code(what, where):
|
|
||||||
if Path(what).is_dir:
|
|
||||||
os.error('Must be a file!!!')
|
|
||||||
shutil.move(what, where + Path(what).name)
|
|
||||||
|
|
||||||
print("Generating...")
|
|
||||||
t3xtg = glob.glob('assets/resources/*.t3s')
|
|
||||||
for object in t3xtg:
|
|
||||||
name = Path(object).stem
|
|
||||||
bp = os.path.dirname(object)
|
|
||||||
tex3ds_build(object)
|
|
||||||
file2array(bp + '/' + name + '.t3x', 'renderd7/')
|
|
||||||
install_code(name + '.cpp', 'source/')
|
|
||||||
install_code(name + '.hpp', 'include/renderd7/')
|
|
||||||
|
|
||||||
cleanup()
|
|
||||||
print("Done")
|
|
@ -1,19 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <renderd7/Allocator.hpp>
|
|
||||||
#include <renderd7/Error.hpp>
|
|
||||||
#include <renderd7/FileSystem.hpp>
|
|
||||||
#include <renderd7/Hid.hpp>
|
|
||||||
#include <renderd7/Image.hpp>
|
|
||||||
#include <renderd7/Installer.hpp>
|
|
||||||
#include <renderd7/Message.hpp>
|
|
||||||
#include <renderd7/Net.hpp>
|
|
||||||
#include <renderd7/Overlays.hpp>
|
|
||||||
#include <renderd7/Sound.hpp>
|
|
||||||
#include <renderd7/Timer.hpp>
|
|
||||||
#include <renderd7/UI7.hpp>
|
|
||||||
#include <renderd7/global_db.hpp>
|
|
||||||
#include <renderd7/renderd7.hpp>
|
|
||||||
#include <renderd7/swr.hpp>
|
|
||||||
|
|
||||||
namespace RD7 = RenderD7;
|
|
@ -1,40 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <3ds.h>
|
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <renderd7/Error.hpp>
|
|
||||||
|
|
||||||
// Write own LinearAllocator for learning
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
template <typename T>
|
|
||||||
class LinearAllocator : public std::allocator<T> {
|
|
||||||
public:
|
|
||||||
typedef size_t size_type;
|
|
||||||
typedef T* pointer;
|
|
||||||
typedef const T* const_pointer;
|
|
||||||
|
|
||||||
template <typename T1>
|
|
||||||
struct rebind {
|
|
||||||
typedef LinearAllocator<T1> other;
|
|
||||||
};
|
|
||||||
|
|
||||||
pointer allocate(size_type n, const void* hint = nullptr) {
|
|
||||||
if (n > this->max_size()) {
|
|
||||||
RenderD7::Error(
|
|
||||||
"Linear Allocator: \nBad Alloc -> size is larger than free space!");
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
return (pointer)linearAlloc(n * sizeof(T));
|
|
||||||
}
|
|
||||||
|
|
||||||
void deallocate(pointer p, size_type) { linearFree((void*)p); }
|
|
||||||
|
|
||||||
size_type max_size() { return linearSpaceFree(); }
|
|
||||||
|
|
||||||
LinearAllocator() throw() {}
|
|
||||||
LinearAllocator(const LinearAllocator<T>& a) throw() : std::allocator<T>(a) {}
|
|
||||||
~LinearAllocator() throw() {}
|
|
||||||
};
|
|
||||||
} // namespace RenderD7
|
|
@ -1,204 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include <cstring>
|
|
||||||
#include <memory>
|
|
||||||
#include <renderd7/smart_ctor.hpp>
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#define UNPACK_RGBA(col) \
|
|
||||||
(unsigned char)(col >> 24), (col >> 16), (col >> 8), (col)
|
|
||||||
#define UNPACK_BGRA(col) \
|
|
||||||
(unsigned char)(col >> 8), (col >> 16), (col >> 24), (col)
|
|
||||||
|
|
||||||
inline unsigned int RGBA8(unsigned char r, unsigned char g, unsigned char b,
|
|
||||||
unsigned char a = 255) {
|
|
||||||
return (r | g << 8 | b << 16 | a << 24);
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef int RD7Color;
|
|
||||||
|
|
||||||
// MultiColor (Less FunctionNameLen)
|
|
||||||
|
|
||||||
struct Color2 {
|
|
||||||
unsigned int color0;
|
|
||||||
unsigned int color1;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Color3 {
|
|
||||||
unsigned int color0;
|
|
||||||
unsigned int color1;
|
|
||||||
unsigned int color2;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Color4 {
|
|
||||||
unsigned int color0;
|
|
||||||
unsigned int color1;
|
|
||||||
unsigned int color2;
|
|
||||||
unsigned int color3;
|
|
||||||
};
|
|
||||||
|
|
||||||
enum RD7Color_ {
|
|
||||||
RD7Color_Text, ///< This Color Should always be used for Light Backgrounds
|
|
||||||
RD7Color_TextDisabled, /// Text Disabled Color
|
|
||||||
RD7Color_Text2, ///< And This want for Texts on Dark Backgrounds
|
|
||||||
RD7Color_Background, ///< Your Bg Color
|
|
||||||
RD7Color_Header, ///< Header Color (if the header is dark text2 is used)
|
|
||||||
RD7Color_Selector, ///< Selector Color
|
|
||||||
RD7Color_SelectorFade, ///< Selector FadingTo Color
|
|
||||||
RD7Color_List0, ///< List Color1
|
|
||||||
RD7Color_List1, ///< List Color2
|
|
||||||
RD7Color_MessageBackground, ///< Message Background
|
|
||||||
RD7Color_Button, ///< Button Color
|
|
||||||
RD7Color_ButtonHovered, ///< Button Color if Hovered
|
|
||||||
RD7Color_ButtonDisabled, ///< Button Color if disabled
|
|
||||||
RD7Color_ButtonActive, ///< Button Colkor if Clicked
|
|
||||||
RD7Color_Checkmark, ///< Checkbox Checkmark Color
|
|
||||||
RD7Color_FrameBg, ///< Frame Background Color
|
|
||||||
RD7Color_FrameBgHovered, ///< Frame Background Color if hovered
|
|
||||||
RD7Color_Progressbar, ///< Progressbar Color
|
|
||||||
/// NON COLOR ///
|
|
||||||
RD7Color_Len, ///< Used to define the lengh of this list
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
class Theme {
|
|
||||||
public:
|
|
||||||
Theme() = default;
|
|
||||||
~Theme() = default;
|
|
||||||
|
|
||||||
void Load(const std::string &path);
|
|
||||||
void Default();
|
|
||||||
void Save(const std::string &path);
|
|
||||||
|
|
||||||
unsigned int Get(RD7Color clr);
|
|
||||||
void Set(RD7Color clr, unsigned int v);
|
|
||||||
void Swap(RD7Color a, RD7Color b);
|
|
||||||
bool Undo();
|
|
||||||
void UndoAll();
|
|
||||||
void TextBy(RD7Color bg);
|
|
||||||
RD7Color AutoText(RD7Color bg);
|
|
||||||
void ClearHistory() { changes.clear(); }
|
|
||||||
|
|
||||||
std::vector<unsigned int> &GetTableRef() { return clr_tab; }
|
|
||||||
// For Smart Pointer
|
|
||||||
RD7_SMART_CTOR(Theme);
|
|
||||||
|
|
||||||
// Loader method
|
|
||||||
void CopyOther(Theme::Ref theme);
|
|
||||||
|
|
||||||
private:
|
|
||||||
struct change {
|
|
||||||
change(RD7Color a, unsigned int f, unsigned int t)
|
|
||||||
: clr(a), from(f), to(t) {}
|
|
||||||
change(RD7Color a, RD7Color b, unsigned int f, unsigned int t)
|
|
||||||
: clr(a), clr2(b), from(f), to(t) {}
|
|
||||||
RD7Color clr;
|
|
||||||
RD7Color clr2 = 0; // Used if Swap
|
|
||||||
unsigned int from;
|
|
||||||
unsigned int to;
|
|
||||||
};
|
|
||||||
// Use a vector for faster access
|
|
||||||
std::vector<unsigned int> clr_tab;
|
|
||||||
std::vector<change> changes;
|
|
||||||
};
|
|
||||||
|
|
||||||
Theme::Ref ThemeActive();
|
|
||||||
/// @brief Change Theme Adress
|
|
||||||
/// @param theme your adress
|
|
||||||
void ThemeSet(Theme::Ref theme);
|
|
||||||
namespace Color {
|
|
||||||
/// @brief RGBA Class
|
|
||||||
class RGBA {
|
|
||||||
public:
|
|
||||||
/// @brief Construct
|
|
||||||
/// @param r
|
|
||||||
/// @param g
|
|
||||||
/// @param b
|
|
||||||
/// @param a
|
|
||||||
RGBA(unsigned char r, unsigned char g, unsigned char b, unsigned char a = 255)
|
|
||||||
: m_r(r), m_g(g), m_b(b), m_a(a) {}
|
|
||||||
/// @brief Construct
|
|
||||||
/// @param r
|
|
||||||
/// @param g
|
|
||||||
/// @param b
|
|
||||||
/// @param a
|
|
||||||
RGBA(float r, float g, float b, float a = 1.f)
|
|
||||||
: m_r(r * 255.f), m_g(g * 255.f), m_b(b * 255.f), m_a(a * 255.f) {}
|
|
||||||
RGBA(unsigned int in) {
|
|
||||||
#define ISIMPLEUNPAK(x, y) (((x) >> y) & 0xFF)
|
|
||||||
m_r = ISIMPLEUNPAK(in, 0);
|
|
||||||
m_g = ISIMPLEUNPAK(in, 8);
|
|
||||||
m_b = ISIMPLEUNPAK(in, 16);
|
|
||||||
m_a = ISIMPLEUNPAK(in, 24);
|
|
||||||
}
|
|
||||||
RGBA(RD7Color in) {
|
|
||||||
if (!RenderD7::ThemeActive()) return;
|
|
||||||
unsigned int col = RenderD7::ThemeActive()->Get(in);
|
|
||||||
m_r = ISIMPLEUNPAK(col, 0);
|
|
||||||
m_g = ISIMPLEUNPAK(col, 8);
|
|
||||||
m_b = ISIMPLEUNPAK(col, 16);
|
|
||||||
m_a = ISIMPLEUNPAK(col, 24);
|
|
||||||
}
|
|
||||||
RGBA &changeR(unsigned char r) {
|
|
||||||
m_r = r;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
RGBA &changeG(unsigned char g) {
|
|
||||||
m_g = g;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
RGBA &changeB(unsigned char b) {
|
|
||||||
m_b = b;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
RGBA &changeA(unsigned char a) {
|
|
||||||
m_a = a;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
RGBA &fade_to(const RGBA &color, float p) {
|
|
||||||
m_a =
|
|
||||||
m_a + static_cast<unsigned char>((color.m_a - m_a) * ((p + 1.0f) / 2));
|
|
||||||
m_b =
|
|
||||||
m_b + static_cast<unsigned char>((color.m_b - m_b) * ((p + 1.0f) / 2));
|
|
||||||
m_g =
|
|
||||||
m_g + static_cast<unsigned char>((color.m_g - m_g) * ((p + 1.0f) / 2));
|
|
||||||
m_r =
|
|
||||||
m_r + static_cast<unsigned char>((color.m_r - m_r) * ((p + 1.0f) / 2));
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @brief Get as Uint32
|
|
||||||
/// @return color
|
|
||||||
unsigned int toRGBA() const { return RGBA8(m_r, m_g, m_b, m_a); }
|
|
||||||
|
|
||||||
// Just calculate the "lightness" f.e. to use Text or Text2
|
|
||||||
float luminance() const {
|
|
||||||
// For Reference https://en.wikipedia.org/wiki/HSL_and_HSV#Lightness
|
|
||||||
return (0.3 * (m_r / 255.f) + 0.59 * (m_g / 255.f) + 0.11 * (m_b / 255.f));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool is_light() {
|
|
||||||
// Gives us the light or dark to not
|
|
||||||
// always use the below "if" statement
|
|
||||||
return (luminance() >= 0.5);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char m_r = 0, m_g = 0, m_b = 0, m_a = 0;
|
|
||||||
};
|
|
||||||
std::string RGBA2Hex(unsigned int c32);
|
|
||||||
/// @brief Convert RGB to Hex
|
|
||||||
/// @param r
|
|
||||||
/// @param g
|
|
||||||
/// @param b
|
|
||||||
/// @return Hex-String
|
|
||||||
std::string RGB2Hex(int r, int g, int b);
|
|
||||||
/// @brief Hex to U32
|
|
||||||
/// @param color
|
|
||||||
/// @param a
|
|
||||||
/// @return Color32
|
|
||||||
unsigned int Hex(const std::string &color, unsigned char a = 255);
|
|
||||||
} // namespace Color
|
|
||||||
} // namespace RenderD7
|
|
@ -1,18 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
void Error(const std::string& msg);
|
|
||||||
inline void InlineError(const std::string& msg) {
|
|
||||||
std::string location = __FILE__ + std::string(":") + std::to_string(__LINE__);
|
|
||||||
Error("Error: \n" + location + "\n" + msg);
|
|
||||||
}
|
|
||||||
inline void InlineAssert(bool v, const std::string& msg) {
|
|
||||||
if (v == false) {
|
|
||||||
std::string location =
|
|
||||||
__FILE__ + std::string(":") + std::to_string(__LINE__);
|
|
||||||
Error("Assert Failed:\n" + location + "\n" + msg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} // namespace RenderD7
|
|
@ -1,24 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
namespace FileSystem {
|
|
||||||
/// @brief A Directory Entry
|
|
||||||
struct Entry {
|
|
||||||
/// @brief Patf of The Entry
|
|
||||||
std::string path;
|
|
||||||
/// @brief Name of The Entry
|
|
||||||
std::string name;
|
|
||||||
/// @brief Directory or File
|
|
||||||
bool dir = false;
|
|
||||||
};
|
|
||||||
/// @brief Gets All Entrys of A Directory into a Vector
|
|
||||||
/// @param path The Path of the Directory
|
|
||||||
/// @return The Vector of found Entrys
|
|
||||||
std::vector<RenderD7::FileSystem::Entry> GetDirContent(std::string path);
|
|
||||||
std::string GetParentPath(std::string path, std::string mount_point);
|
|
||||||
std::vector<Entry> GetDirContentsExt(
|
|
||||||
std::string &path, const std::vector<std::string> &extensions);
|
|
||||||
} // namespace FileSystem
|
|
||||||
} // namespace RenderD7
|
|
@ -1,36 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <citro2d.h>
|
|
||||||
|
|
||||||
#include <fstream>
|
|
||||||
#include <memory>
|
|
||||||
#include <renderd7/Error.hpp>
|
|
||||||
#include <renderd7/smart_ctor.hpp>
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
class Font {
|
|
||||||
public:
|
|
||||||
Font() = default;
|
|
||||||
Font(const std::string& path) { Load(path); };
|
|
||||||
~Font() { Unload(); }
|
|
||||||
RD7_SMART_CTOR(Font)
|
|
||||||
|
|
||||||
void Load(const std::string& path) {
|
|
||||||
std::ifstream ft(path, std::ios::in | std::ios::binary);
|
|
||||||
bool io = ft.is_open();
|
|
||||||
ft.close();
|
|
||||||
RenderD7::InlineAssert(io, "File not Found!");
|
|
||||||
fnt = C2D_FontLoad(path.c_str());
|
|
||||||
RenderD7::InlineAssert(fnt, "Font could not be loaded!");
|
|
||||||
}
|
|
||||||
C2D_Font Ptr() { return fnt; }
|
|
||||||
void Unload() {
|
|
||||||
if (!fnt) return;
|
|
||||||
C2D_FontFree(fnt);
|
|
||||||
fnt = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
C2D_Font fnt = nullptr;
|
|
||||||
};
|
|
||||||
} // namespace RenderD7
|
|
@ -1,76 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
// Base includes
|
|
||||||
#include <functional>
|
|
||||||
#include <map>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
// 3ds does not support std::chrono
|
|
||||||
#include <3ds.h>
|
|
||||||
|
|
||||||
/// @brief 3ds System Ticks per milli second
|
|
||||||
#define TICKS_PER_MSEC 268111.856
|
|
||||||
|
|
||||||
#define f2s(x_) #x_
|
|
||||||
#define scomb(x1, x2) std::string(x1 + x2)
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
namespace Ftrace {
|
|
||||||
/// @brief Result of FTrace
|
|
||||||
struct FTRes {
|
|
||||||
std::string group; ///< Group of the Trace
|
|
||||||
std::string func_name; ///< Function Name
|
|
||||||
|
|
||||||
uint64_t time_start; ///< when started
|
|
||||||
uint64_t time_end; ///< when stopped
|
|
||||||
float time_of; ///< stop - start (how long)
|
|
||||||
float time_ofm; ///< max time off
|
|
||||||
bool is_ovl; ///< is displayed in overlay?
|
|
||||||
};
|
|
||||||
|
|
||||||
/// @brief Map of Traces
|
|
||||||
extern std::map<std::string, RenderD7::Ftrace::FTRes> rd7_traces;
|
|
||||||
|
|
||||||
/// @brief Set a Start TracePoint
|
|
||||||
/// @param group Set a Group Name
|
|
||||||
/// @param func_name Set a Function Name
|
|
||||||
inline void Beg(const std::string& group, const std::string& func_name) {
|
|
||||||
std::string trace_id = scomb(group, func_name);
|
|
||||||
auto& trace = rd7_traces[trace_id];
|
|
||||||
trace.group = group;
|
|
||||||
trace.func_name = func_name;
|
|
||||||
trace.time_start = svcGetSystemTick();
|
|
||||||
}
|
|
||||||
/// @brief Set an End TracePoint
|
|
||||||
/// @param group Set a Group Name
|
|
||||||
/// @param func_name Set a Function Name
|
|
||||||
inline void End(const std::string& group, const std::string& func_name) {
|
|
||||||
std::string trace_id = scomb(group, func_name);
|
|
||||||
auto& trace = rd7_traces[trace_id];
|
|
||||||
trace.time_end = svcGetSystemTick();
|
|
||||||
if (trace.time_of > trace.time_ofm) trace.time_ofm = trace.time_of;
|
|
||||||
trace.time_of =
|
|
||||||
static_cast<float>(trace.time_end - trace.time_start) / TICKS_PER_MSEC;
|
|
||||||
}
|
|
||||||
/// @brief Trace a function execution
|
|
||||||
/// @param group Set a Group Name
|
|
||||||
/// @param name Set a Function Name
|
|
||||||
inline void Func(const std::string& group, const std::string& name,
|
|
||||||
std::function<void()> fun) {
|
|
||||||
if (!fun) return;
|
|
||||||
Beg(group, name);
|
|
||||||
fun();
|
|
||||||
End(group, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @brief This Starts an Ftrace and
|
|
||||||
/// end ist when going out of scope
|
|
||||||
struct ScopedTrace {
|
|
||||||
ScopedTrace(std::string g, std::string n) : group(g), name(n) {
|
|
||||||
Ftrace::Beg(g, n);
|
|
||||||
}
|
|
||||||
~ScopedTrace() { Ftrace::End(group, name); }
|
|
||||||
std::string group;
|
|
||||||
std::string name;
|
|
||||||
};
|
|
||||||
} // namespace Ftrace
|
|
||||||
} // namespace RenderD7
|
|
@ -1,26 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
namespace Hardware {
|
|
||||||
/// @brief Initialisize required Services
|
|
||||||
void Initialisize();
|
|
||||||
/// @brief Check if Headphones are Plugged in
|
|
||||||
/// @return true if headphones plugged in
|
|
||||||
bool IsHeadphones();
|
|
||||||
/// @brief Check if the 3ds Is Charging
|
|
||||||
/// @return true if System gets Charged
|
|
||||||
bool IsCharging();
|
|
||||||
/// @brief Check the Battery Percentage
|
|
||||||
/// @return Persentage as int
|
|
||||||
int GetBatteryPercentage();
|
|
||||||
/// @brief Get current State of 3d Slider
|
|
||||||
/// @return current 3dslider poition
|
|
||||||
float Get3dSliderLevel();
|
|
||||||
/// @brief Get Current state of Sound Slider
|
|
||||||
/// @return current SoundSlider state
|
|
||||||
float GetSoundSliderLevel();
|
|
||||||
/// @brief Get Current Wifi Level
|
|
||||||
/// @return current wifi level
|
|
||||||
int GetWifiLevel();
|
|
||||||
} // namespace Hardware
|
|
||||||
} // namespace RenderD7
|
|
@ -1,42 +0,0 @@
|
|||||||
// WARNING
|
|
||||||
// THIS IS BETA STUFF
|
|
||||||
// ITS MAKE LIKE EXTERNAL BUT
|
|
||||||
// FOR RENDERD7 ITS INTEGRATED
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <renderd7/R7Vec.hpp>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
namespace Hid {
|
|
||||||
enum Actions {
|
|
||||||
Down = 0,
|
|
||||||
Held = 1,
|
|
||||||
Up = 2,
|
|
||||||
DownRepeat = 3,
|
|
||||||
};
|
|
||||||
// Register Functions
|
|
||||||
// Register Current state values
|
|
||||||
void RegKeyDown(uint32_t &key_down);
|
|
||||||
void RegKeyHeld(uint32_t &key_held);
|
|
||||||
void RegKeyUp(uint32_t &key_up);
|
|
||||||
void RegKeyRepeat(uint32_t &repeat);
|
|
||||||
void RegTouchCoords(R7Vec2 &touch_pos);
|
|
||||||
// Not Corectly Implemented Yet
|
|
||||||
void RegAnalog1Movement(R7Vec2 &movement);
|
|
||||||
void RegAnalog2Movement(R7Vec2 &movement);
|
|
||||||
// Register Keys
|
|
||||||
void RegKeyEvent(const std::string &event, uint32_t key);
|
|
||||||
// KeyEvents
|
|
||||||
bool IsEvent(const std::string &event, Actions action);
|
|
||||||
R7Vec2 GetTouchPosition();
|
|
||||||
R7Vec2 GetLastTouchPosition();
|
|
||||||
R7Vec2 GetTouchDownPosition();
|
|
||||||
void Update();
|
|
||||||
// Lock/Unlock Input api for example for Keyboard
|
|
||||||
void Lock();
|
|
||||||
void Unlock();
|
|
||||||
void Clear();
|
|
||||||
} // namespace Hid
|
|
||||||
} // namespace RenderD7
|
|
@ -1,33 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <3ds.h>
|
|
||||||
#include <citro2d.h>
|
|
||||||
|
|
||||||
#include <renderd7/R7Vec.hpp>
|
|
||||||
#include <renderd7/nimg.hpp>
|
|
||||||
#include <renderd7/smart_ctor.hpp>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
class Image {
|
|
||||||
public:
|
|
||||||
Image() = default;
|
|
||||||
Image(C2D_Image img) { this->img = img; }
|
|
||||||
Image(const std::string& path) { this->Load(path); }
|
|
||||||
~Image() = default;
|
|
||||||
RD7_SMART_CTOR(Image)
|
|
||||||
void Load(const std::string& path);
|
|
||||||
void From_NIMG(const nimg& image);
|
|
||||||
void Delete();
|
|
||||||
|
|
||||||
C2D_Image Get();
|
|
||||||
C2D_Image& GetRef();
|
|
||||||
void Set(const C2D_Image& i);
|
|
||||||
R7Vec2 GetSize();
|
|
||||||
bool Loadet();
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool ext = false;
|
|
||||||
C2D_Image img;
|
|
||||||
};
|
|
||||||
} // namespace RenderD7
|
|
@ -1,15 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
struct InstallerInfo {
|
|
||||||
unsigned long long total;
|
|
||||||
unsigned long long current;
|
|
||||||
unsigned int mem_size = 0x80000;
|
|
||||||
bool active = false;
|
|
||||||
};
|
|
||||||
Result InstallCia(const std::string& path, bool self);
|
|
||||||
void InstallSetBuffersSize(unsigned int bytes);
|
|
||||||
InstallerInfo InstallGetInfo();
|
|
||||||
} // namespace RenderD7
|
|
@ -1,35 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include <fstream>
|
|
||||||
#include <renderd7/smart_ctor.hpp>
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
|
|
||||||
/// @brief Logger base Class
|
|
||||||
class LoggerBase {
|
|
||||||
public:
|
|
||||||
/// @brief Constructor
|
|
||||||
LoggerBase() = default;
|
|
||||||
/// @brief Deconstructor
|
|
||||||
~LoggerBase();
|
|
||||||
RD7_SMART_CTOR(LoggerBase)
|
|
||||||
/// @brief Init the Logger
|
|
||||||
/// @param filename name[_date_time.txt]
|
|
||||||
void Init(const std::string& name, bool fileless = false);
|
|
||||||
/// @brief Write a String
|
|
||||||
/// @param debug_text string
|
|
||||||
/// @param lvl Logger LVL 0 = ERR, 1 =WARNING, >=2= Default
|
|
||||||
void Write(const std::string& debug_text, int lvl = 2);
|
|
||||||
void SetLvl(int lvl) { writelvl = lvl; }
|
|
||||||
const std::vector<std::string>& Lines();
|
|
||||||
|
|
||||||
private:
|
|
||||||
/// \param filename the name of the logfile
|
|
||||||
std::string filename;
|
|
||||||
std::string log_path;
|
|
||||||
std::ofstream _log;
|
|
||||||
int writelvl = 1; // Only log errors/Warnings
|
|
||||||
std::vector<std::string> lines;
|
|
||||||
};
|
|
||||||
} // namespace RenderD7
|
|
@ -1,24 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <cstddef>
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
namespace Memory {
|
|
||||||
/// @brief Metriks struct For the Internal Tracker
|
|
||||||
struct memory_metrics {
|
|
||||||
uint32_t t_TotalAllocated = 0; ///< Total Allocated Memory
|
|
||||||
uint32_t t_TotalFreed = 0; ///< Total Deleted Memory
|
|
||||||
/// @brief Gets the Currently Allocated Memory
|
|
||||||
uint32_t t_CurrentlyAllocated() { return t_TotalAllocated - t_TotalFreed; }
|
|
||||||
};
|
|
||||||
/// @brief Get Total Allocated Memory
|
|
||||||
/// @return Total Allocated Memory
|
|
||||||
size_t GetTotalAllocated();
|
|
||||||
/// @brief Get Total Deleted Memory
|
|
||||||
/// @return Total Deleted Memory
|
|
||||||
size_t GetTotalFreed();
|
|
||||||
/// @brief Get Current Allocated Memory
|
|
||||||
/// @return Current Allocated Memory
|
|
||||||
size_t GetCurrent();
|
|
||||||
} // namespace Memory
|
|
||||||
} // namespace RenderD7
|
|
@ -1,27 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
struct Message {
|
|
||||||
Message(std::string t, std::string m) {
|
|
||||||
title = t;
|
|
||||||
message = m;
|
|
||||||
animationframe = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string title;
|
|
||||||
std::string message;
|
|
||||||
int animationframe;
|
|
||||||
};
|
|
||||||
|
|
||||||
void ProcessMessages();
|
|
||||||
void PushMessage(const Message& msg);
|
|
||||||
inline void PushMessage(const std::string& head, const std::string& msg) {
|
|
||||||
PushMessage(Message(head, msg));
|
|
||||||
}
|
|
||||||
// Config
|
|
||||||
void SetMessageIdleStartFrame(int frame);
|
|
||||||
void SetMessageTotalAnimationFrames(int total_frames);
|
|
||||||
void SetMessageFadeOutStartFrame(int frame);
|
|
||||||
} // namespace RenderD7
|
|
@ -1,42 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <renderd7/external/json.hpp>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
namespace Net {
|
|
||||||
// Define List of Errors
|
|
||||||
enum Error_ {
|
|
||||||
Error_None, // Function Executed Successfully
|
|
||||||
Error_Memory, // Memory Allocation Error
|
|
||||||
Error_Write, // Unable to Write File
|
|
||||||
Error_StatusCode, // Error with Status Code
|
|
||||||
Error_Git, // Git Error
|
|
||||||
Error_CtrStatus, // 3ds Result Code
|
|
||||||
Error_Curl, // Curl Error
|
|
||||||
Error_Busy, // Another Download Taskl is already running
|
|
||||||
Error_Invalid, // Invalid Json struct
|
|
||||||
Error_NoWifi, // Console not connected to wifi
|
|
||||||
};
|
|
||||||
// Set an typedefine for Error code
|
|
||||||
using Error = unsigned long long;
|
|
||||||
// Extract Error_ from Error code
|
|
||||||
inline Error_ ErrorCode(Error err) {
|
|
||||||
return static_cast<Error_>(static_cast<unsigned int>(err & 0xffffffff));
|
|
||||||
}
|
|
||||||
// Extract Http Status code, Curl Error Code or Ctr Result Code
|
|
||||||
inline int StatusCode(Error err) {
|
|
||||||
Error_ c = ErrorCode(err);
|
|
||||||
if (c != Error_StatusCode && c != Error_CtrStatus && c != Error_Curl)
|
|
||||||
return 0;
|
|
||||||
return static_cast<unsigned int>(err >> 32);
|
|
||||||
}
|
|
||||||
Error Download(const std::string& url, std::string& data);
|
|
||||||
Error Download2File(const std::string& url, const std::string& path);
|
|
||||||
Error GitDownloadRelease(const std::string& url, const std::string& asset_name,
|
|
||||||
const std::string& path, bool prerelease = false);
|
|
||||||
Error JsonApiRequest(const std::string& api_url, nlohmann::json& res);
|
|
||||||
unsigned long long GetProgressCurrent();
|
|
||||||
unsigned long long GetProgressTotal();
|
|
||||||
} // namespace Net
|
|
||||||
} // namespace RenderD7
|
|
@ -1,85 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <renderd7/Ovl.hpp>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
typedef int RD7Keyboard;
|
|
||||||
|
|
||||||
enum RD7Keyboard_ {
|
|
||||||
RD7Keyboard_Default,
|
|
||||||
RD7Keyboard_Numpad,
|
|
||||||
RD7Keyboard_Password,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum RD7KeyboardState {
|
|
||||||
RD7KeyboardState_None = 0,
|
|
||||||
RD7KeyboardState_Cancel = 1,
|
|
||||||
RD7KeyboardState_Confirm = 2,
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
class Ovl_Ftrace : public RenderD7::Ovl {
|
|
||||||
public:
|
|
||||||
/// @brief Constructor
|
|
||||||
Ovl_Ftrace(bool* is_enabled);
|
|
||||||
/// @brief Override for Draw
|
|
||||||
void Draw(void) const override;
|
|
||||||
/// @brief Override for Logic
|
|
||||||
void Logic() override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool* i_is_enabled;
|
|
||||||
};
|
|
||||||
|
|
||||||
class Ovl_Metrik : public RenderD7::Ovl {
|
|
||||||
public:
|
|
||||||
/// @brief Constructor
|
|
||||||
Ovl_Metrik(bool* is_enabled, bool* screen, uint32_t* mt_color,
|
|
||||||
uint32_t* txt_color, float* txt_size);
|
|
||||||
/// @brief Override for Draw
|
|
||||||
void Draw(void) const override;
|
|
||||||
/// @brief Override for Logic
|
|
||||||
void Logic() override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Mutable internal values
|
|
||||||
mutable std::string mt_fps;
|
|
||||||
mutable std::string mt_cpu;
|
|
||||||
mutable std::string mt_gpu;
|
|
||||||
mutable std::string mt_cmd;
|
|
||||||
mutable std::string mt_lfr;
|
|
||||||
mutable std::string mt_tbs;
|
|
||||||
mutable std::string mt_mem;
|
|
||||||
|
|
||||||
// Importand Adresses
|
|
||||||
bool* i_is_enabled;
|
|
||||||
bool* i_screen;
|
|
||||||
uint32_t* i_mt_color;
|
|
||||||
uint32_t* i_txt_color;
|
|
||||||
float* i_txt_size;
|
|
||||||
};
|
|
||||||
|
|
||||||
class Ovl_Keyboard : public RenderD7::Ovl {
|
|
||||||
public:
|
|
||||||
/// @brief Constructor
|
|
||||||
/// Keyboard Type not Supported for now
|
|
||||||
Ovl_Keyboard(std::string& ref, RD7KeyboardState& state,
|
|
||||||
const std::string& hint = "", RD7Keyboard type = 0);
|
|
||||||
/// @brief Deconstructor
|
|
||||||
~Ovl_Keyboard();
|
|
||||||
/// @brief Override for Draw
|
|
||||||
void Draw(void) const override;
|
|
||||||
/// @brief Override for Logic
|
|
||||||
void Logic() override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
mutable std::map<unsigned char, char> shared_data;
|
|
||||||
// Pointer to useres String
|
|
||||||
std::string* typed_text = nullptr;
|
|
||||||
std::string str_bak;
|
|
||||||
RD7KeyboardState* state;
|
|
||||||
RD7Keyboard type;
|
|
||||||
int mode = 0;
|
|
||||||
int ft3 = 0;
|
|
||||||
};
|
|
||||||
} // namespace RenderD7
|
|
@ -1,28 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include <map>
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
/// @brief The Overlay Class (Used for Toasts for example)
|
|
||||||
class Ovl {
|
|
||||||
public:
|
|
||||||
/// @brief Deconstructor
|
|
||||||
virtual ~Ovl() {}
|
|
||||||
/// @brief Function Called to Draw this
|
|
||||||
virtual void Draw() const = 0;
|
|
||||||
/// @brief Logic of the Overlay
|
|
||||||
virtual void Logic() = 0;
|
|
||||||
/// @brief Should the overlay be killed
|
|
||||||
/// @return Killed or Not
|
|
||||||
inline bool IsKilled() { return this->iskilled; }
|
|
||||||
/// @brief Kill The Overlay
|
|
||||||
inline void Kill() { iskilled = true; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
/// @param iskilled For IsKilled();
|
|
||||||
bool iskilled = false;
|
|
||||||
};
|
|
||||||
/// @brief Add an Overlay to the Screen
|
|
||||||
/// @param scene Overlay to push to Screen
|
|
||||||
void AddOvl(std::unique_ptr<RenderD7::Ovl> scene);
|
|
||||||
} // namespace RenderD7
|
|
@ -1,104 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
struct R7Vec2 {
|
|
||||||
// Init Funcs
|
|
||||||
R7Vec2() : x(0), y(0) {}
|
|
||||||
R7Vec2(float i0, float i1) : x(i0), y(i1) {}
|
|
||||||
R7Vec2(const R7Vec2 &i) {
|
|
||||||
x = i.x;
|
|
||||||
y = i.y;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Operators
|
|
||||||
// Add
|
|
||||||
R7Vec2 &operator+=(const R7Vec2 &i) {
|
|
||||||
x += i.x;
|
|
||||||
y += i.y;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
R7Vec2 operator+(const R7Vec2 &i) const { return R7Vec2(x + i.x, y + i.y); }
|
|
||||||
|
|
||||||
// Sub
|
|
||||||
R7Vec2 &operator-=(const R7Vec2 &i) {
|
|
||||||
x -= i.x;
|
|
||||||
y -= i.y;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
R7Vec2 operator-(const R7Vec2 &i) const { return R7Vec2(x - i.x, y - i.y); }
|
|
||||||
|
|
||||||
// Compare
|
|
||||||
bool operator==(const R7Vec2 &in) const { return x == in.x && y == in.y; }
|
|
||||||
|
|
||||||
bool operator!=(const R7Vec2 &in) const {
|
|
||||||
// use the first comparefuncs result
|
|
||||||
// and swap it lol
|
|
||||||
return !(*this == in);
|
|
||||||
}
|
|
||||||
// Internal Values
|
|
||||||
float x;
|
|
||||||
float y;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct R7Vec4 {
|
|
||||||
// Init Funcs
|
|
||||||
R7Vec4() : x(0), y(0), z(0), w(0) {}
|
|
||||||
R7Vec4(float i0, float i1, float i2, float i3) : x(i0), y(i1), z(i2), w(i3) {}
|
|
||||||
R7Vec4(const R7Vec4 &i) {
|
|
||||||
x = i.x;
|
|
||||||
y = i.y;
|
|
||||||
z = i.z;
|
|
||||||
w = i.w;
|
|
||||||
}
|
|
||||||
|
|
||||||
R7Vec4(const R7Vec2 &i0, const R7Vec2 &i1) {
|
|
||||||
x = i0.x;
|
|
||||||
y = i0.y;
|
|
||||||
z = i1.x;
|
|
||||||
w = i1.y;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Operators
|
|
||||||
// Add
|
|
||||||
R7Vec4 &operator+=(const R7Vec4 &i) {
|
|
||||||
x += i.x;
|
|
||||||
y += i.y;
|
|
||||||
z += i.z;
|
|
||||||
w += i.w;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
R7Vec4 operator+(const R7Vec4 &i) const {
|
|
||||||
return R7Vec4(x + i.x, y + i.y, z + i.z, w + i.w);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sub
|
|
||||||
R7Vec4 &operator-=(const R7Vec4 &i) {
|
|
||||||
x -= i.x;
|
|
||||||
y -= i.y;
|
|
||||||
z -= i.z;
|
|
||||||
w -= i.w;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
R7Vec4 operator-(const R7Vec4 &i) const {
|
|
||||||
return R7Vec4(x - i.x, y - i.y, z - i.z, w - i.w);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compare
|
|
||||||
bool operator==(const R7Vec4 &in) const {
|
|
||||||
return x == in.x && y == in.y && z == in.z && w == in.w;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator!=(const R7Vec4 &in) const {
|
|
||||||
// use the first comparefuncs result
|
|
||||||
// and swap it lol
|
|
||||||
return !(*this == in);
|
|
||||||
}
|
|
||||||
// Internal Values
|
|
||||||
float x;
|
|
||||||
float y;
|
|
||||||
float z;
|
|
||||||
float w;
|
|
||||||
};
|
|
@ -1,97 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <map>
|
|
||||||
#include <renderd7/Color.hpp>
|
|
||||||
#include <renderd7/Font.hpp>
|
|
||||||
#include <renderd7/Image.hpp>
|
|
||||||
#include <renderd7/R7Vec.hpp>
|
|
||||||
#include <renderd7/Sprite.hpp>
|
|
||||||
#include <renderd7/smart_ctor.hpp>
|
|
||||||
|
|
||||||
#define MAKEFLAG(x) (1 << x)
|
|
||||||
|
|
||||||
typedef unsigned int RD7TextFlags;
|
|
||||||
|
|
||||||
enum RD7TextFlags_ {
|
|
||||||
RD7TextFlags_None = 0, //< Align is Left and Other things are disabled
|
|
||||||
RD7TextFlags_AlignRight = MAKEFLAG(0),
|
|
||||||
RD7TextFlags_AlignMid = MAKEFLAG(1),
|
|
||||||
RD7TextFlags_Shaddow = MAKEFLAG(2), // TextBuf Killer lol (doubled Text)
|
|
||||||
RD7TextFlags_Wrap = MAKEFLAG(3),
|
|
||||||
RD7TextFlags_Short = MAKEFLAG(4),
|
|
||||||
RD7TextFlags_Scroll = MAKEFLAG(5),
|
|
||||||
};
|
|
||||||
|
|
||||||
enum R2Screen {
|
|
||||||
R2Screen_Bottom,
|
|
||||||
R2Screen_Top,
|
|
||||||
// TopRight,
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
class R2 {
|
|
||||||
public:
|
|
||||||
struct R2Cmd {
|
|
||||||
R7Vec2 pos; //< Position
|
|
||||||
R7Vec2 pszs; //< Position or (TextBox) Size
|
|
||||||
R7Vec2 ap; //< Additional Pos
|
|
||||||
unsigned int clr; //< Color
|
|
||||||
bool Screen; //< TopScreen
|
|
||||||
Image::Ref img; //< Image Reference
|
|
||||||
Sprite::Ref spr; //< Sprite Reference
|
|
||||||
// 0 = skip, 1 = rect, 2 = tri, 3 = text,
|
|
||||||
// 4 = image, 5 = sprite, 6 = Line
|
|
||||||
int type; //< Command Type
|
|
||||||
bool lined = false; //< Draw Lined Rect/Tri
|
|
||||||
// Text Specific
|
|
||||||
RD7TextFlags flags; // Text Flags
|
|
||||||
std::string text; // Text
|
|
||||||
RD7_SMART_CTOR(R2Cmd)
|
|
||||||
};
|
|
||||||
R2() = default;
|
|
||||||
~R2() = default;
|
|
||||||
|
|
||||||
static void Init();
|
|
||||||
|
|
||||||
// Settings
|
|
||||||
static void SetFont(Font::Ref fnt);
|
|
||||||
static Font::Ref GetFont();
|
|
||||||
static void DefaultFont();
|
|
||||||
static void DrawNextLined();
|
|
||||||
static void OnScreen(R2Screen screen);
|
|
||||||
static R2Screen GetCurrentScreen();
|
|
||||||
static void SetTextSize(float szs);
|
|
||||||
static void DefaultTextSize();
|
|
||||||
static float GetTextSize();
|
|
||||||
static R7Vec2 GetCurrentScreenSize();
|
|
||||||
// Processing
|
|
||||||
static void Process();
|
|
||||||
static R7Vec2 GetTextDimensions(const std::string& text);
|
|
||||||
static std::string WrapText(const std ::string& in, int maxlen);
|
|
||||||
static std::string ShortText(const std::string& in, int maxlen);
|
|
||||||
// Draw Functions
|
|
||||||
static void AddRect(R7Vec2 pos, R7Vec2 size, RD7Color clr);
|
|
||||||
static void AddRect(R7Vec2 pos, R7Vec2 size, unsigned int clr);
|
|
||||||
static void AddTriangle(R7Vec2 pos0, R7Vec2 pos1, R7Vec2 pos2, RD7Color clr);
|
|
||||||
static void AddTriangle(R7Vec2 pos0, R7Vec2 pos1, R7Vec2 pos2,
|
|
||||||
unsigned int clr);
|
|
||||||
static void AddText(R7Vec2 pos, const std::string& text, RD7Color clr,
|
|
||||||
RD7TextFlags flags = 0, R7Vec2 tmb = R7Vec2());
|
|
||||||
static void AddText(R7Vec2 pos, const std::string& text, unsigned int clr,
|
|
||||||
RD7TextFlags flags = 0, R7Vec2 tmb = R7Vec2());
|
|
||||||
static void AddImage(R7Vec2 pos, Image::Ref img);
|
|
||||||
static void AddSprite(Sprite::Ref spr);
|
|
||||||
static void AddLine(R7Vec2 pos_a, R7Vec2 pos_b, RD7Color clr, int t = 1);
|
|
||||||
static void AddLine(R7Vec2 pos_a, R7Vec2 pos_b, unsigned int clr, int t = 1);
|
|
||||||
|
|
||||||
private:
|
|
||||||
static const float default_text_size;
|
|
||||||
static float text_size;
|
|
||||||
static Font::Ref font;
|
|
||||||
static std::map<std::string, float> ts;
|
|
||||||
static std::map<std::string, int> mln;
|
|
||||||
static bool next_lined;
|
|
||||||
static std::vector<R2Cmd::Ref> commands;
|
|
||||||
static R2Screen current_screen;
|
|
||||||
};
|
|
||||||
} // namespace RenderD7
|
|
@ -1,54 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include <3ds.h>
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
/// @brief Decoder for 3ds Result Codes
|
|
||||||
class ResultDecoder {
|
|
||||||
public:
|
|
||||||
/// @brief Constructor
|
|
||||||
ResultDecoder() {}
|
|
||||||
/// @brief Deconstructor
|
|
||||||
~ResultDecoder() {}
|
|
||||||
/// @brief Load a Result into Decoder
|
|
||||||
/// @param rescode Result Code
|
|
||||||
void Load(Result rescode);
|
|
||||||
/// @brief Load A Hex Converted Code into Decoder
|
|
||||||
/// @param rescode Result-Hex Code
|
|
||||||
void Load(std::string rescode);
|
|
||||||
/// @brief Get Hex Code
|
|
||||||
/// @return Hex-Code
|
|
||||||
std::string GetCode();
|
|
||||||
/// @brief Get Level Name
|
|
||||||
/// @return Level Name
|
|
||||||
std::string GetLevel();
|
|
||||||
/// @brief Get Level Value
|
|
||||||
/// @return Level Value
|
|
||||||
int GetLevelInt();
|
|
||||||
/// @brief Get The Mosule Name
|
|
||||||
/// @return Module Name
|
|
||||||
std::string GetModule();
|
|
||||||
/// @brief Get The Module Value
|
|
||||||
/// @return Module Value
|
|
||||||
int GetModuleInt();
|
|
||||||
/// @brief Get The Description
|
|
||||||
/// @return Description
|
|
||||||
std::string GetDescription();
|
|
||||||
/// @brief Get The Description Valur
|
|
||||||
/// @return Description Value
|
|
||||||
int GetDescriptionInt();
|
|
||||||
/// @brief Get the Summary
|
|
||||||
/// @return Summary
|
|
||||||
std::string GetSummary();
|
|
||||||
/// @brief Get the Summary Value
|
|
||||||
/// @return Summary Value
|
|
||||||
int GetSummaryInt();
|
|
||||||
/// @brief Write a Result log file to sd
|
|
||||||
void WriteLog(void);
|
|
||||||
|
|
||||||
private:
|
|
||||||
/// @param m_rescode Result code
|
|
||||||
Result m_rescode;
|
|
||||||
};
|
|
||||||
} // namespace RenderD7
|
|
@ -1,35 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include <3ds.h> // Result
|
|
||||||
#include <citro2d.h>
|
|
||||||
#include <citro3d.h>
|
|
||||||
|
|
||||||
#include <renderd7/Image.hpp>
|
|
||||||
#include <renderd7/smart_ctor.hpp>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
/// @brief SpriteSheet Class
|
|
||||||
class Sheet {
|
|
||||||
public:
|
|
||||||
/// @brief Constructor
|
|
||||||
Sheet() = default;
|
|
||||||
Sheet(const std::string& path) { this->Load(path); }
|
|
||||||
/// @brief Deconstructor
|
|
||||||
~Sheet() {
|
|
||||||
if (spritesheet) Free();
|
|
||||||
}
|
|
||||||
RD7_SMART_CTOR(Sheet);
|
|
||||||
/// @brief Load A Spritesheet File
|
|
||||||
/// @param path Path to the t3x
|
|
||||||
/// @return Result Code
|
|
||||||
Result Load(const std::string& path);
|
|
||||||
/// @brief Unload the Sheet
|
|
||||||
void Free();
|
|
||||||
C2D_Image GetImage(int idx);
|
|
||||||
C2D_SpriteSheet Get() { return this->spritesheet; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
/// \param spritesheet The Sheet
|
|
||||||
C2D_SpriteSheet spritesheet;
|
|
||||||
};
|
|
||||||
} // namespace RenderD7
|
|
@ -1,35 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <3ds.h>
|
|
||||||
|
|
||||||
#include <renderd7/smart_ctor.hpp>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
/** Sound Class */
|
|
||||||
class Sound {
|
|
||||||
public:
|
|
||||||
/// \brief Construct new Soundeffect
|
|
||||||
/// \param path Path to the .wav file
|
|
||||||
/// \param channel the channel 1-23
|
|
||||||
/// \param toloop true:loop the sound, false: don't loop
|
|
||||||
Sound(const std::string &path, int channel = 1, bool toloop = false);
|
|
||||||
/// @brief Deconstructor
|
|
||||||
~Sound();
|
|
||||||
RD7_SMART_CTOR(Sound)
|
|
||||||
/// @brief Play the sound
|
|
||||||
void Play();
|
|
||||||
/// @brief Stop the sound
|
|
||||||
void Stop();
|
|
||||||
|
|
||||||
private:
|
|
||||||
/// \param dataSize Size of the filedata
|
|
||||||
u32 dataSize;
|
|
||||||
/// \param waveBuf For ndsp
|
|
||||||
ndspWaveBuf waveBuf;
|
|
||||||
/// \param data Memmory data of the sound
|
|
||||||
uint8_t *data = NULL;
|
|
||||||
/// \param chnl Channel of the sound
|
|
||||||
int chnl;
|
|
||||||
};
|
|
||||||
} // namespace RenderD7
|
|
@ -1,71 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <citro2d.h>
|
|
||||||
#include <citro3d.h>
|
|
||||||
|
|
||||||
#include <renderd7/Image.hpp>
|
|
||||||
#include <renderd7/Sheet.hpp>
|
|
||||||
#include <renderd7/smart_ctor.hpp>
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
/// @brief Sprite Class
|
|
||||||
class Sprite {
|
|
||||||
public:
|
|
||||||
/// \brief Construct Sprite
|
|
||||||
Sprite() = default;
|
|
||||||
/// \brief Deconstruct Sprite
|
|
||||||
~Sprite() = default;
|
|
||||||
RD7_SMART_CTOR(Sprite)
|
|
||||||
/// \brief Load a Sprite From SpriteSheet
|
|
||||||
/// \param sheet the Sheet to load from.(RenderD7::Sheet)
|
|
||||||
/// \param index the number of the Sprite in the Sheet
|
|
||||||
void FromSheet(RenderD7::Sheet::Ref sheet, size_t index);
|
|
||||||
/// \brief Load a Sprite From SpriteSheet
|
|
||||||
/// \param img the Image to load from.(RenderD7::Image)
|
|
||||||
void FromImage(RenderD7::Image::Ref img);
|
|
||||||
/// @brief Draw the Sprite
|
|
||||||
/// @return success ?
|
|
||||||
bool Draw();
|
|
||||||
/// @brief Set the Center Position
|
|
||||||
/// @param x X Pos
|
|
||||||
/// @param y Y Pos
|
|
||||||
void SetCenter(float x, float y);
|
|
||||||
/// @brief Set the Sprite's Position
|
|
||||||
/// @param x X Pos
|
|
||||||
/// @param y Y Pos
|
|
||||||
void SetPos(float x, float y);
|
|
||||||
/// @brief Set The Sprite's Scale
|
|
||||||
/// @param x Scale on X-Axis
|
|
||||||
/// @param y Scale on Y-Axis
|
|
||||||
void SetScale(float x, float y);
|
|
||||||
/// @brief Set the Sprite's Rotation
|
|
||||||
/// @param rotation ratation
|
|
||||||
void SetRotation(float rotation);
|
|
||||||
/// @brief Rotate the Sprite
|
|
||||||
/// @param speed Speed to Rotate
|
|
||||||
void Rotate(float speed);
|
|
||||||
/// @brief Get Tje Sprite's Width
|
|
||||||
/// @return Width
|
|
||||||
float GetWidth();
|
|
||||||
/// @brief Get the Sprite's Height
|
|
||||||
/// @return Height
|
|
||||||
float GetHeight();
|
|
||||||
/// @brief Get The Sprite's X Position
|
|
||||||
/// @return X Position
|
|
||||||
float GetPosX();
|
|
||||||
/// @brief Get the Sprite's Y Position
|
|
||||||
/// @return Y Position
|
|
||||||
float GetPosY();
|
|
||||||
R7Vec2 GetSize();
|
|
||||||
R7Vec2 GetPos();
|
|
||||||
void SetPos(R7Vec2 pos);
|
|
||||||
void SetScale(R7Vec2 scale);
|
|
||||||
void SetRotCenter(R7Vec2 percentage);
|
|
||||||
|
|
||||||
private:
|
|
||||||
/// @param tint ImageTint (unused)
|
|
||||||
C2D_ImageTint tint;
|
|
||||||
/// @param sprite The Sprite
|
|
||||||
C2D_Sprite sprite;
|
|
||||||
};
|
|
||||||
} // namespace RenderD7
|
|
@ -1,43 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <citro2d.h>
|
|
||||||
#include <citro3d.h>
|
|
||||||
|
|
||||||
#include <renderd7/Sheet.hpp>
|
|
||||||
#include <renderd7/Sprite.hpp>
|
|
||||||
#include <renderd7/smart_ctor.hpp>
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
/// @brief SpriteSheetAnimation Class
|
|
||||||
class SpriteSheetAnimation : public RenderD7::Sprite {
|
|
||||||
public:
|
|
||||||
/// @brief Constructor
|
|
||||||
SpriteSheetAnimation() = default;
|
|
||||||
/// @brief Deconstructor
|
|
||||||
~SpriteSheetAnimation() = default;
|
|
||||||
RD7_SMART_CTOR(SpriteSheetAnimation);
|
|
||||||
/// @brief Setup an Animation
|
|
||||||
/// @param sheet Input Spritesheet
|
|
||||||
/// @param imagecount Count of Images
|
|
||||||
/// @param startimage Where to Start the Loop
|
|
||||||
/// @param frame_begin Current Time (Should be 0)
|
|
||||||
/// @param frame_finish Time Length
|
|
||||||
void Setup(RenderD7::Sheet::Ref sheet, size_t imagecount, size_t startimage,
|
|
||||||
float frame_begin, float frame_finish);
|
|
||||||
/// @brief Play the Animation
|
|
||||||
/// @param timespeed Speed of the animation
|
|
||||||
void Play(float timespeed);
|
|
||||||
|
|
||||||
private:
|
|
||||||
/// @param images Count of Images
|
|
||||||
size_t images;
|
|
||||||
/// @param imgs Another Count of images ???
|
|
||||||
size_t imgs = 0;
|
|
||||||
/// @param D_totaltime Current Time
|
|
||||||
float D_totaltime;
|
|
||||||
/// @param sheet The Sheet of Images
|
|
||||||
RenderD7::Sheet::Ref sheet;
|
|
||||||
/// @param time Total Time from frame_finish
|
|
||||||
float time;
|
|
||||||
};
|
|
||||||
} // namespace RenderD7
|
|
@ -1,13 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include <functional>
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
namespace Tasks {
|
|
||||||
/// @brief Push A Task
|
|
||||||
/// @param fun Function of Your Task
|
|
||||||
/// @return index
|
|
||||||
int Create(std::function<void()> fun);
|
|
||||||
/// @brief Destroy all Tasks
|
|
||||||
void DestroyAll();
|
|
||||||
} // namespace Tasks
|
|
||||||
} // namespace RenderD7
|
|
@ -1,29 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <renderd7/renderd7.hpp>
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
class ThemeEditor : public RenderD7::Scene {
|
|
||||||
public:
|
|
||||||
ThemeEditor();
|
|
||||||
~ThemeEditor();
|
|
||||||
|
|
||||||
void Draw(void) const override;
|
|
||||||
void Logic() override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
Theme::Ref edit_theme;
|
|
||||||
// Placeholder to save active one to
|
|
||||||
Theme::Ref temp_theme;
|
|
||||||
|
|
||||||
// temp vars for samples
|
|
||||||
mutable bool cm;
|
|
||||||
mutable std::string inpt;
|
|
||||||
mutable int menu = 0;
|
|
||||||
|
|
||||||
// Keyboard
|
|
||||||
mutable RD7KeyboardState kbd_state;
|
|
||||||
mutable std::string kbd_text;
|
|
||||||
mutable std::vector<std::string> theme_list;
|
|
||||||
};
|
|
||||||
} // namespace RenderD7
|
|
@ -1,13 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
/// @brief Format a String
|
|
||||||
/// @param fmt_str Format To
|
|
||||||
/// @param ... Additional Args
|
|
||||||
/// @return Formatted String
|
|
||||||
std::string FormatString(std::string fmt_str, ...);
|
|
||||||
/// @brief Get Current Time as String
|
|
||||||
/// @return Time-String
|
|
||||||
std::string GetTimeStr(void);
|
|
||||||
} // namespace RenderD7
|
|
@ -1,26 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <3ds.h>
|
|
||||||
|
|
||||||
#include <renderd7/smart_ctor.hpp>
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
class Timer {
|
|
||||||
public:
|
|
||||||
Timer(bool autostart = true);
|
|
||||||
~Timer() {}
|
|
||||||
RD7_SMART_CTOR(Timer)
|
|
||||||
void Reset();
|
|
||||||
void Tick();
|
|
||||||
void Pause();
|
|
||||||
void Resume();
|
|
||||||
float Get();
|
|
||||||
float GetLive();
|
|
||||||
bool Running();
|
|
||||||
|
|
||||||
private:
|
|
||||||
uint64_t last = 0;
|
|
||||||
uint64_t current = 0;
|
|
||||||
bool is_running = false;
|
|
||||||
};
|
|
||||||
} // namespace RenderD7
|
|
@ -1,105 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <renderd7/Image.hpp>
|
|
||||||
#include <renderd7/R7Vec.hpp>
|
|
||||||
#include <renderd7/Render2.hpp>
|
|
||||||
#include <renderd7/smart_ctor.hpp>
|
|
||||||
|
|
||||||
// UI7: The new RenderD7 UI Standart based on
|
|
||||||
// Draw2 (based on Citro2D)
|
|
||||||
|
|
||||||
#define UI7MAKEFLAG(x) (1 << x)
|
|
||||||
|
|
||||||
typedef int UI7MenuFlags;
|
|
||||||
|
|
||||||
enum UI7MenuFlags_ {
|
|
||||||
UI7MenuFlags_None = 0,
|
|
||||||
UI7MenuFlags_NoTitlebar = UI7MAKEFLAG(0),
|
|
||||||
UI7MenuFlags_TitleMid = UI7MAKEFLAG(1),
|
|
||||||
UI7MenuFlags_Scrolling = MAKEFLAG(2),
|
|
||||||
};
|
|
||||||
|
|
||||||
class DrawCmd;
|
|
||||||
class UI7DrawList {
|
|
||||||
public:
|
|
||||||
UI7DrawList() = default;
|
|
||||||
~UI7DrawList() = default;
|
|
||||||
|
|
||||||
void AddRectangle(R7Vec2 pos, R7Vec2 szs, RD7Color clr);
|
|
||||||
void AddRectangle(R7Vec2 pos, R7Vec2 szs, unsigned int clr);
|
|
||||||
void AddTriangle(R7Vec2 pos0, R7Vec2 pos1, R7Vec2 pos2, RD7Color clr);
|
|
||||||
void AddTriangle(R7Vec2 pos0, R7Vec2 pos1, R7Vec2 pos2, unsigned int clr);
|
|
||||||
void AddText(R7Vec2 pos, const std::string &text, RD7Color clr,
|
|
||||||
RD7TextFlags flags = 0, R7Vec2 box = R7Vec2());
|
|
||||||
void AddText(R7Vec2 pos, const std::string &text, unsigned int clr,
|
|
||||||
RD7TextFlags flags = 0, R7Vec2 box = R7Vec2());
|
|
||||||
void AddImage(R7Vec2 pos, RenderD7::Image::Ref img);
|
|
||||||
void AddCall(std::shared_ptr<DrawCmd> cmd);
|
|
||||||
|
|
||||||
void Process(bool auto_clear = true);
|
|
||||||
void Clear();
|
|
||||||
|
|
||||||
RD7_SMART_CTOR(UI7DrawList)
|
|
||||||
|
|
||||||
private:
|
|
||||||
void AddDebugCall(std::shared_ptr<DrawCmd> cmd);
|
|
||||||
std::vector<std::shared_ptr<DrawCmd>> list;
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace UI7 {
|
|
||||||
// Key functions
|
|
||||||
void Init();
|
|
||||||
void Deinit();
|
|
||||||
void Update();
|
|
||||||
float GetTime();
|
|
||||||
float GetDeltaTime();
|
|
||||||
bool &IsDebugging();
|
|
||||||
// Internal Function
|
|
||||||
// Should not be used
|
|
||||||
void Debug();
|
|
||||||
bool &DebugMenu();
|
|
||||||
|
|
||||||
bool Button(const std::string &label, R7Vec2 size = R7Vec2(0, 0));
|
|
||||||
void Checkbox(const std::string &label, bool &c);
|
|
||||||
void Label(const std::string &label, RD7TextFlags flags = 0);
|
|
||||||
void Progressbar(float value);
|
|
||||||
/// @brief Draw Image in Menu
|
|
||||||
/// @param img Pointer f.e to RenderD7::Image2
|
|
||||||
void Image(RenderD7::Image::Ref img);
|
|
||||||
void BrowserList(const std::vector<std::string> &entrys, int &selection,
|
|
||||||
RD7TextFlags txtflags = 0, R7Vec2 size = R7Vec2(0, 0),
|
|
||||||
int max_entrys = 13);
|
|
||||||
void InputText(const std::string &label, std::string &text,
|
|
||||||
const std::string &hint = "");
|
|
||||||
bool BeginMenu(const std::string &title, R7Vec2 size = R7Vec2(0, 0),
|
|
||||||
UI7MenuFlags flags = 0);
|
|
||||||
void EndMenu();
|
|
||||||
void Grid(const std::string &name, const R7Vec2 &size, const R7Vec2 &entry_size,
|
|
||||||
void (*display_func)(void *, R7Vec2), void **data_array,
|
|
||||||
size_t num_entrys);
|
|
||||||
void ColorSelector(const std::string &label, unsigned int &color);
|
|
||||||
bool BeginTree(const std::string &text);
|
|
||||||
void EndTree();
|
|
||||||
R7Vec2 GetCursorPos();
|
|
||||||
void SetCursorPos(R7Vec2 cp);
|
|
||||||
void RestoreCursor();
|
|
||||||
void SameLine();
|
|
||||||
// Internal API (For Creating Custom Objects)
|
|
||||||
bool InBox(R7Vec2 inpos, R7Vec2 boxpos, R7Vec2 boxsize);
|
|
||||||
void MoveCursor(R7Vec2 size);
|
|
||||||
bool HandleScrolling(R7Vec2 &pos, R7Vec2 size);
|
|
||||||
bool InMenu();
|
|
||||||
namespace Menu {
|
|
||||||
// All of them return the Main BG DrawList if Menu is null
|
|
||||||
UI7DrawList::Ref GetBackgroundList();
|
|
||||||
UI7DrawList::Ref GetList();
|
|
||||||
UI7DrawList::Ref GetForegroundList();
|
|
||||||
// Other Menu Specific Functions
|
|
||||||
float GetScrollingOffset();
|
|
||||||
void SetScrollingOffset(float off);
|
|
||||||
bool IsScrolling();
|
|
||||||
} // namespace Menu
|
|
||||||
// DrawLists
|
|
||||||
UI7DrawList::Ref GetForegroundList();
|
|
||||||
UI7DrawList::Ref GetBackgroundList();
|
|
||||||
} // namespace UI7
|
|
8681
include/renderd7/external/stb_image.h
vendored
8681
include/renderd7/external/stb_image.h
vendored
File diff suppressed because it is too large
Load Diff
2054
include/renderd7/external/stb_image_write.h
vendored
2054
include/renderd7/external/stb_image_write.h
vendored
File diff suppressed because it is too large
Load Diff
5636
include/renderd7/external/stb_truetype.h
vendored
5636
include/renderd7/external/stb_truetype.h
vendored
File diff suppressed because it is too large
Load Diff
@ -1,38 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <renderd7/external/json.hpp>
|
|
||||||
#include <renderd7/renderd7.hpp>
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
namespace IDB {
|
|
||||||
void Start();
|
|
||||||
void Stop();
|
|
||||||
void Restart();
|
|
||||||
} // namespace IDB
|
|
||||||
} // namespace RenderD7
|
|
||||||
|
|
||||||
using RD7Flags = int;
|
|
||||||
enum RD7Flags_ {
|
|
||||||
RD7Flags_None = 0,
|
|
||||||
RD7Flags_MemTrack = 1 << 0,
|
|
||||||
RD7Flags_SceneSystem = 1 << 1,
|
|
||||||
RD7Flags_ShowSplash = 1 << 2,
|
|
||||||
RD7Flags_Default = RD7Flags_SceneSystem,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Outdated HidApi (HidV2Patched)
|
|
||||||
extern u32 d7_hDown;
|
|
||||||
extern u32 d7_hHeld;
|
|
||||||
extern u32 d7_hUp;
|
|
||||||
extern u32 d7_hRepeat; // Inofficial lol
|
|
||||||
extern touchPosition d7_touch;
|
|
||||||
|
|
||||||
// Modern Global Api
|
|
||||||
extern int rd7_max_objects;
|
|
||||||
extern C3D_RenderTarget *rd7_top;
|
|
||||||
extern C3D_RenderTarget *rd7_top_right;
|
|
||||||
extern C3D_RenderTarget *rd7_bottom;
|
|
||||||
extern RD7Flags rd7_flags;
|
|
||||||
|
|
||||||
// Draw2
|
|
||||||
extern float rd7_draw2_tsm;
|
|
@ -1,70 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include <renderd7/Net.hpp>
|
|
||||||
#include <renderd7/external/json.hpp>
|
|
||||||
#include <renderd7/global_db.hpp>
|
|
||||||
#include <renderd7/renderd7.hpp>
|
|
||||||
|
|
||||||
#define CFGVER "1"
|
|
||||||
#define THEMEVER "0"
|
|
||||||
|
|
||||||
#ifndef V_RD7BTIME
|
|
||||||
#define V_RD7BTIME "SUBMODULE"
|
|
||||||
#endif
|
|
||||||
#ifndef V_RD7CSTRING
|
|
||||||
#define V_RD7CSTRING "SUBMODULE"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Base
|
|
||||||
extern bool rd7i_do_splash;
|
|
||||||
extern bool rd7i_enable_scene_system;
|
|
||||||
extern bool rd7i_debugging;
|
|
||||||
extern bool rd7i_enable_memtrack;
|
|
||||||
extern std::string rd7i_app_name;
|
|
||||||
extern std::string rd7i_config_path;
|
|
||||||
extern nlohmann::json rd7i_config;
|
|
||||||
extern u8 rd7i_console_model;
|
|
||||||
extern u8 rd7i_system_region;
|
|
||||||
extern bool rd7i_is_citra;
|
|
||||||
extern bool rd7i_settings;
|
|
||||||
extern R7Vec2 rd7i_hid_touch_pos;
|
|
||||||
extern C2D_TextBuf rd7i_text_buffer;
|
|
||||||
extern C2D_TextBuf rd7i_d2_dimbuf;
|
|
||||||
extern C2D_Font rd7i_base_font;
|
|
||||||
extern bool rd7i_is_ndsp;
|
|
||||||
extern bool rd7i_running;
|
|
||||||
extern std::unique_ptr<RenderD7::Scene> rd7i_fade_scene;
|
|
||||||
extern std::vector<std::unique_ptr<RenderD7::Ovl>> rd7i_overlays;
|
|
||||||
extern unsigned int rd7i_frames;
|
|
||||||
extern u64 rd7i_last_time;
|
|
||||||
extern float rd7i_framerate;
|
|
||||||
extern u32 rd7i_mt_color;
|
|
||||||
extern u32 rd7i_mt_txtcolor;
|
|
||||||
extern bool rd7i_mt_screen;
|
|
||||||
extern float rd7i_mt_txtSize;
|
|
||||||
extern bool rd7i_metrikd;
|
|
||||||
extern bool rd7i_ftraced;
|
|
||||||
extern u64 rd7i_delta_time;
|
|
||||||
extern u64 rd7i_last_tm;
|
|
||||||
extern float rd7i_dtm;
|
|
||||||
extern float rd7i_time;
|
|
||||||
extern bool rd7i_fadeout;
|
|
||||||
extern bool rd7i_fadein;
|
|
||||||
extern bool rd7i_fadeout2;
|
|
||||||
extern bool rd7i_fadein2;
|
|
||||||
extern int rd7i_fadealpha;
|
|
||||||
extern int rd7i_fadecolor;
|
|
||||||
extern bool rd7i_wait_fade;
|
|
||||||
extern bool rd7i_fade_exit;
|
|
||||||
extern bool rd7i_fade_scene_wait;
|
|
||||||
extern bool rd7i_idb_running;
|
|
||||||
extern bool rd7i_graphics_on;
|
|
||||||
extern bool rd7i_amdt;
|
|
||||||
extern void* rd7i_soc_buf;
|
|
||||||
extern bool rd7i_is_am_init;
|
|
||||||
extern RenderD7::Theme::Ref rd7i_active_theme;
|
|
||||||
extern bool rd7i_lggrf;
|
|
||||||
|
|
||||||
// Use function for protection
|
|
||||||
RenderD7::LoggerBase::Ref _rd7i_logger();
|
|
||||||
RenderD7::Net::Error rd7i_soc_init();
|
|
||||||
void rd7i_soc_deinit();
|
|
@ -1,24 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
// clang-format off
|
|
||||||
#include <string>
|
|
||||||
#include <renderd7/external/json.hpp>
|
|
||||||
// clang-format on
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
namespace Lang {
|
|
||||||
/// @brief Get 3ds System lang! [en] by default
|
|
||||||
/// @return Sytemlang as string
|
|
||||||
std::string GetSys();
|
|
||||||
/// @brief Get The Translation String
|
|
||||||
/// @param key Key of Translation
|
|
||||||
/// @return The Translated String
|
|
||||||
std::string Get(const std::string &key);
|
|
||||||
/// @brief Load A Language json
|
|
||||||
/// @param lang The Language Key [en], [de], etc, or getSys()
|
|
||||||
void Load(const std::string &lang);
|
|
||||||
// New funcs
|
|
||||||
std::string GetName();
|
|
||||||
std::string GetAuthor();
|
|
||||||
std::string GetShortcut();
|
|
||||||
} // namespace Lang
|
|
||||||
} // namespace RenderD7
|
|
@ -1,30 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <cstdint>
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#define NPI_NIMG_ (uint32_t)0x4e494d47 // Magic: NIMG
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
struct nimg {
|
|
||||||
unsigned int magic; // Magic number defaults do NPI_NIMG_
|
|
||||||
int width;
|
|
||||||
int height;
|
|
||||||
int format;
|
|
||||||
int compression;
|
|
||||||
std::vector<unsigned char> pixel_buffer;
|
|
||||||
|
|
||||||
nimg(int w = 0, int h = 0, int fmt = 0, int cmp = 0) {
|
|
||||||
magic = NPI_NIMG_;
|
|
||||||
width = w;
|
|
||||||
height = h;
|
|
||||||
format = fmt;
|
|
||||||
compression = cmp;
|
|
||||||
pixel_buffer.resize((w * h) * (format ? 3 : 4));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
nimg NIMG_Load(std::string path);
|
|
||||||
nimg NIMG_LoadFromMem(unsigned char* buffer, size_t bf_size);
|
|
||||||
void NIMG_Save(nimg image, std::string path);
|
|
||||||
} // namespace RenderD7
|
|
@ -1,134 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include <tuple>
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
class Parameter {
|
|
||||||
private:
|
|
||||||
using id = size_t;
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct type {
|
|
||||||
static void id() {}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
static id type_id() {
|
|
||||||
return reinterpret_cast<id>(&type<T>::id);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
using decay = typename std::decay<T>::type;
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
using none =
|
|
||||||
typename std::enable_if<!std::is_same<Parameter, T>::value>::type;
|
|
||||||
|
|
||||||
struct base {
|
|
||||||
virtual ~base() {}
|
|
||||||
virtual bool is(id) const = 0;
|
|
||||||
virtual base *copy() const = 0;
|
|
||||||
} *p = nullptr;
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct data : base, std::tuple<T> {
|
|
||||||
using std::tuple<T>::tuple;
|
|
||||||
|
|
||||||
T &get() & { return std::get<0>(*this); }
|
|
||||||
T const &get() const & { return std::get<0>(*this); }
|
|
||||||
|
|
||||||
bool is(id i) const override { return i == type_id<T>(); }
|
|
||||||
base *copy() const override { return new data{get()}; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
T &stat() {
|
|
||||||
return static_cast<data<T> &>(*p).get();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
T const &stat() const {
|
|
||||||
return static_cast<data<T> const &>(*p).get();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
T &dyn() {
|
|
||||||
return dynamic_cast<data<T> &>(*p).get();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
T const &dyn() const {
|
|
||||||
return dynamic_cast<data<T> const &>(*p).get();
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* @brief Default constructor
|
|
||||||
*/
|
|
||||||
Parameter() {}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Destructs the Parameter
|
|
||||||
*/
|
|
||||||
~Parameter() { delete p; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Copy constructor
|
|
||||||
* @param s The Parameter to copy
|
|
||||||
*/
|
|
||||||
Parameter(Parameter &&s) : p{s.p} { s.p = nullptr; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Const copy constructor
|
|
||||||
* @param s The Parameter to copy
|
|
||||||
*/
|
|
||||||
Parameter(Parameter const &s) : p{s.p->copy()} {}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Initializes the Parameter with the given value
|
|
||||||
* @param x The value to initialize the Parameter with
|
|
||||||
*/
|
|
||||||
template <typename T, typename U = decay<T>, typename = none<U>>
|
|
||||||
Parameter(T &&x) : p{new data<U>{std::forward<T>(x)}} {}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Overloads the assignment operator
|
|
||||||
* @param s The value to set the Parameter to
|
|
||||||
*/
|
|
||||||
Parameter &operator=(Parameter s) {
|
|
||||||
swap(*this, s);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
friend void swap(Parameter &s, Parameter &r) { std::swap(s.p, r.p); }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Clears the Parameter
|
|
||||||
*/
|
|
||||||
void clear() {
|
|
||||||
delete p;
|
|
||||||
p = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Checks whether the Parameter is the given type
|
|
||||||
* @tparam T The type to check
|
|
||||||
* @return Whether the Parameter has the given type or not
|
|
||||||
*/
|
|
||||||
template <typename T>
|
|
||||||
bool is() const {
|
|
||||||
return p ? p->is(type_id<T>()) : false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Returns the value of the Parameter
|
|
||||||
* @tparam T The type of the Parameter
|
|
||||||
* @return The value of the Parameter
|
|
||||||
* @warning If the type of the Parameter doesn't match the type of it's stored
|
|
||||||
* value, it will result in undefined behaviour.
|
|
||||||
*/
|
|
||||||
template <typename T>
|
|
||||||
T &get() & {
|
|
||||||
return stat<T>();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
} // namespace RenderD7
|
|
@ -1,196 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
/// c++ Includes
|
|
||||||
#include <cstring>
|
|
||||||
#include <map>
|
|
||||||
#include <memory>
|
|
||||||
#include <stack>
|
|
||||||
#include <string>
|
|
||||||
/// c includes
|
|
||||||
#include <dirent.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <time.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
/// 3ds Includes
|
|
||||||
#include <3ds.h>
|
|
||||||
#include <citro2d.h>
|
|
||||||
#include <citro3d.h>
|
|
||||||
/// RenderD7 Includes
|
|
||||||
#include <renderd7/Color.hpp>
|
|
||||||
#include <renderd7/FunctionTrace.hpp>
|
|
||||||
#include <renderd7/Hardware.hpp>
|
|
||||||
#include <renderd7/Logger.hpp>
|
|
||||||
#include <renderd7/Memory.hpp>
|
|
||||||
#include <renderd7/Overlays.hpp>
|
|
||||||
#include <renderd7/Ovl.hpp>
|
|
||||||
#include <renderd7/Render2.hpp>
|
|
||||||
#include <renderd7/ResultDecoder.hpp>
|
|
||||||
#include <renderd7/Sheet.hpp>
|
|
||||||
#include <renderd7/Sprite.hpp>
|
|
||||||
#include <renderd7/SpriteAnimation.hpp>
|
|
||||||
#include <renderd7/Tasks.hpp>
|
|
||||||
#include <renderd7/Time.hpp>
|
|
||||||
#include <renderd7/lang.hpp>
|
|
||||||
#include <renderd7/parameter.hpp>
|
|
||||||
#include <renderd7/stringtool.hpp>
|
|
||||||
#include <renderd7/thread.hpp>
|
|
||||||
|
|
||||||
#define RENDERD7VSTRING "0.9.5"
|
|
||||||
|
|
||||||
#define DEFAULT_CENTER 0.5f
|
|
||||||
|
|
||||||
/// @param rd7_max_objects Config Param for C2D Mac objects
|
|
||||||
extern int rd7_max_objects;
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
// Reference to the New Renderer
|
|
||||||
R2Base::Ref R2();
|
|
||||||
// Reference to Global Logger
|
|
||||||
LoggerBase::Ref Logger();
|
|
||||||
/// @brief Get Deltatime
|
|
||||||
/// @return Deltatime
|
|
||||||
float GetDeltaTime();
|
|
||||||
|
|
||||||
/// @brief Scene Class
|
|
||||||
class Scene {
|
|
||||||
public:
|
|
||||||
/// @brief Stack of the Scenes
|
|
||||||
static std::stack<std::unique_ptr<Scene>> scenes;
|
|
||||||
/// @brief Deconstructor
|
|
||||||
virtual ~Scene() {}
|
|
||||||
virtual void Logic() = 0;
|
|
||||||
/// @brief Draw Func to Override
|
|
||||||
virtual void Draw() const = 0;
|
|
||||||
/// @brief Push a Scene to Stack
|
|
||||||
/// @param scene Scene to Push
|
|
||||||
/// @param fade FadeEffect (Not Correctly Implementet yet)
|
|
||||||
static void Load(std::unique_ptr<Scene> scene, bool fade = false);
|
|
||||||
/// @brief Go Back a Scene
|
|
||||||
static void Back();
|
|
||||||
/// @brief do the Draw (Called in RenderD7::MainLoop())
|
|
||||||
static void doDraw();
|
|
||||||
static void doLogic();
|
|
||||||
};
|
|
||||||
|
|
||||||
/// @brief Integrated Setting Menu of RenderD7
|
|
||||||
class RSettings : public RenderD7::Scene {
|
|
||||||
private:
|
|
||||||
/// @brief State (Define for Menus)
|
|
||||||
enum RState {
|
|
||||||
RSETTINGS, // Main Settings Menu
|
|
||||||
RIDB, // Internal Debugger
|
|
||||||
ROVERLAYS, // Overlay Settings
|
|
||||||
RFTRACE, // FTRace Menu
|
|
||||||
RUI7, // UI7 Menu
|
|
||||||
RLOGS, // Logs
|
|
||||||
};
|
|
||||||
|
|
||||||
/// @param shared_request Defines requests from Draw to Logic
|
|
||||||
/// As it is not planned to make Draw non const you'll need
|
|
||||||
/// A map of data or bool values that are mutable ake
|
|
||||||
/// editable by const functions
|
|
||||||
mutable std::map<unsigned int, unsigned int> shared_request;
|
|
||||||
/// @param m_state Current menu State (Default=MainMenu aka RSETTINGS)
|
|
||||||
RenderD7::RSettings::RState m_state = RenderD7::RSettings::RState::RSETTINGS;
|
|
||||||
|
|
||||||
/// @brief Position in FTrace Menu
|
|
||||||
int ftrace_index = 0;
|
|
||||||
|
|
||||||
/// @param mtovlstate State of Metricks Overlay
|
|
||||||
std::string mtovlstate = "false";
|
|
||||||
/// @param mtscreenstate Screen the Overlay is Set to
|
|
||||||
std::string mtscreenstate = "Top";
|
|
||||||
std::string kbd_test;
|
|
||||||
RD7KeyboardState kbd_state;
|
|
||||||
bool statemtold = false;
|
|
||||||
bool stateftold = false;
|
|
||||||
float tmp_txt;
|
|
||||||
|
|
||||||
public:
|
|
||||||
/// @brief Constructor
|
|
||||||
RSettings();
|
|
||||||
/// @brief Override for Draw
|
|
||||||
/// @param
|
|
||||||
void Draw(void) const override;
|
|
||||||
/// @brief Deconstructor
|
|
||||||
~RSettings();
|
|
||||||
void Logic() override;
|
|
||||||
};
|
|
||||||
|
|
||||||
/// @brief Show Up the RenderD7-Settings Menu
|
|
||||||
void LoadSettings();
|
|
||||||
/// @brief Show Up The Theme Editor
|
|
||||||
void LoadThemeEditor();
|
|
||||||
/// @brief Get's The Programs Time running
|
|
||||||
/// @return Time Running
|
|
||||||
float GetTime();
|
|
||||||
/// @brief Get Framerate as Number
|
|
||||||
/// @return FPS
|
|
||||||
int GetFps();
|
|
||||||
|
|
||||||
/// @brief Get A Rendom Int
|
|
||||||
/// @param b From
|
|
||||||
/// @param e To
|
|
||||||
/// @return Random Int
|
|
||||||
int GetRandomInt(int b, int e);
|
|
||||||
/// @brief Fade In
|
|
||||||
/// @param duration Duration in Frames
|
|
||||||
void FadeIn();
|
|
||||||
/// @brief Fade Out
|
|
||||||
/// @param duration Duration in Frames
|
|
||||||
void FadeOut();
|
|
||||||
/// @brief Display Fade Effects
|
|
||||||
void FadeDisplay();
|
|
||||||
|
|
||||||
namespace Init {
|
|
||||||
/// @brief Init Default RenderD7
|
|
||||||
/// @param app_name Name of Your App
|
|
||||||
/// @return ResCode
|
|
||||||
Result Main(std::string app_name = "RD7Game");
|
|
||||||
/// @brief Init Minimal RenderD7 (For better Hax2.x support)
|
|
||||||
/// @param app_name Name of Your App
|
|
||||||
/// @return ResCode
|
|
||||||
Result Minimal(std::string app_name = "RD7Game");
|
|
||||||
/// @brief Reload the Graphics Engine
|
|
||||||
/// @return ResCode
|
|
||||||
Result Reload();
|
|
||||||
/// @brief Init Graphics Only (NOT SUPPORTET use Reload)
|
|
||||||
void Graphics();
|
|
||||||
/// @brief Init Ndsp for Sounds
|
|
||||||
void NdspFirm();
|
|
||||||
} // namespace Init
|
|
||||||
|
|
||||||
namespace FS {
|
|
||||||
/// @brief Check if File exists
|
|
||||||
/// @param path Path to the File
|
|
||||||
/// @return exists or not
|
|
||||||
bool FileExist(const std::string &path);
|
|
||||||
} // namespace FS
|
|
||||||
|
|
||||||
/// @brief Check if Ndsp is Init
|
|
||||||
/// @return is or not
|
|
||||||
bool IsNdspInit();
|
|
||||||
/// @brief Get Current Framerate as String
|
|
||||||
/// @return Framerate String
|
|
||||||
std::string GetFramerate();
|
|
||||||
/// @brief MainLoop of RenderD7s
|
|
||||||
/// @return Is Still Running or not
|
|
||||||
bool MainLoop();
|
|
||||||
/// @brief Exit App (brak the MainLoop)
|
|
||||||
void ExitApp();
|
|
||||||
|
|
||||||
/// @brief Clear the Citro2D TextBuffers
|
|
||||||
/// @param
|
|
||||||
void ClearTextBufs(void);
|
|
||||||
|
|
||||||
/// @brief Draw Overlays And end the Frame. DO NEVER USE C3D_FRAMEEND cause it
|
|
||||||
/// breaks Overlay crash Security
|
|
||||||
void FrameEnd();
|
|
||||||
|
|
||||||
/// @brief Returns App Working Directory path
|
|
||||||
/// @return AppDir Path
|
|
||||||
std::string GetAppDirectory();
|
|
||||||
/// @brief returns path to the Data Directory
|
|
||||||
/// @return data dir path
|
|
||||||
std::string GetDataDirectory();
|
|
||||||
} // namespace RenderD7
|
|
@ -1,8 +0,0 @@
|
|||||||
// THIS FILE WAS GENERATED BY generate_assets.py!!!
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <cstddef>
|
|
||||||
|
|
||||||
extern unsigned char renderd7_logo[];
|
|
||||||
extern size_t renderd7_logo_size;
|
|
@ -1,10 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
#define RD7_SMART_CTOR(type) \
|
|
||||||
using Ref = std::shared_ptr<type>; \
|
|
||||||
template <typename... args> \
|
|
||||||
static Ref New(args&&... cargs) { \
|
|
||||||
return std::make_shared<type>(std::forward<args>(cargs)...); \
|
|
||||||
}
|
|
@ -1,103 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include <iomanip>
|
|
||||||
#include <iostream>
|
|
||||||
#include <sstream>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
/// @brief Check if A String ends with
|
|
||||||
/// @param name Input String
|
|
||||||
/// @param extensions Extensions to Check for
|
|
||||||
/// @return Ends with or not
|
|
||||||
inline bool NameIsEndingWith(const std::string &name,
|
|
||||||
const std::vector<std::string> &extensions) {
|
|
||||||
if (name.substr(0, 2) == "._") return false;
|
|
||||||
|
|
||||||
if (name.size() == 0) return false;
|
|
||||||
|
|
||||||
if (extensions.size() == 0) return true;
|
|
||||||
|
|
||||||
for (int i = 0; i < (int)extensions.size(); i++) {
|
|
||||||
const std::string ext = extensions.at(i);
|
|
||||||
if (strcasecmp(name.c_str() + name.size() - ext.size(), ext.c_str()) == 0)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
/// @brief Format Milliseconds to clean string (Stolen from one of my Mc
|
|
||||||
/// Plugins)
|
|
||||||
/// @param t_time Time in ms
|
|
||||||
/// @return String
|
|
||||||
inline std::string MsTimeFmt(float t_time, bool dems = false) {
|
|
||||||
std::ostringstream oss;
|
|
||||||
|
|
||||||
if (t_time < 0.001f) {
|
|
||||||
oss << std::fixed << std::setprecision(2) << t_time * 1000.0f << "ns";
|
|
||||||
} else if (t_time < 1.0f) {
|
|
||||||
oss << std::fixed << std::setprecision(2) << t_time << "ms";
|
|
||||||
} else if (t_time < 60000.0f) {
|
|
||||||
int seconds = static_cast<int>(t_time / 1000.0f);
|
|
||||||
float milliseconds = t_time - (seconds * 1000.0f);
|
|
||||||
|
|
||||||
if (seconds > 0) {
|
|
||||||
oss << seconds << "s ";
|
|
||||||
}
|
|
||||||
if (!dems)
|
|
||||||
oss << std::fixed << std::setprecision(2) << milliseconds << "ms";
|
|
||||||
} else {
|
|
||||||
int minutes = static_cast<int>(t_time / 60000.0f);
|
|
||||||
int seconds = static_cast<int>((t_time - (minutes * 60000.0f)) / 1000.0f);
|
|
||||||
float milliseconds = t_time - (minutes * 60000.0f) - (seconds * 1000.0f);
|
|
||||||
|
|
||||||
oss << minutes << "m ";
|
|
||||||
if (seconds > 0 || milliseconds > 0.0f) {
|
|
||||||
oss << seconds << "s ";
|
|
||||||
}
|
|
||||||
if (milliseconds > 0.0f && !dems) {
|
|
||||||
oss << std::fixed << std::setprecision(2) << milliseconds << "ms";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return oss.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::string FormatBytes(int bytes) {
|
|
||||||
char out[32];
|
|
||||||
|
|
||||||
if (bytes == 1)
|
|
||||||
snprintf(out, sizeof(out), "%d Byte", bytes);
|
|
||||||
|
|
||||||
else if (bytes < 1024)
|
|
||||||
snprintf(out, sizeof(out), "%d Bytes", bytes);
|
|
||||||
|
|
||||||
else if (bytes < 1024 * 1024)
|
|
||||||
snprintf(out, sizeof(out), "%.1f KB", (float)bytes / 1024);
|
|
||||||
|
|
||||||
else if (bytes < 1024 * 1024 * 1024)
|
|
||||||
snprintf(out, sizeof(out), "%.1f MB", (float)bytes / 1024 / 1024);
|
|
||||||
|
|
||||||
else
|
|
||||||
snprintf(out, sizeof(out), "%.1f GB", (float)bytes / 1024 / 1024 / 1024);
|
|
||||||
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
} // namespace RenderD7
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
T GetFileName(T const &path, T const &delims = "/\\") {
|
|
||||||
return path.substr(path.find_last_of(delims) + 1);
|
|
||||||
}
|
|
||||||
template <class T>
|
|
||||||
T remove_ext(T const &filename) {
|
|
||||||
typename T::size_type const p(filename.find_last_of('.'));
|
|
||||||
return p > 0 && p != T::npos ? filename.substr(0, p) : filename;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
std::string Int_To_Hex(T i) {
|
|
||||||
std::stringstream stream;
|
|
||||||
stream << "0x" << std::setfill('0') << std::setw(sizeof(T) * 2) << std::hex
|
|
||||||
<< i;
|
|
||||||
return stream.str();
|
|
||||||
}
|
|
@ -1,25 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <renderd7/nimg.hpp>
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
class swr {
|
|
||||||
public:
|
|
||||||
swr(int w, int h);
|
|
||||||
swr();
|
|
||||||
~swr();
|
|
||||||
nimg& get_image() { return image; }
|
|
||||||
void load_file(const std::string& path);
|
|
||||||
void load_nimg(const std::string& path);
|
|
||||||
|
|
||||||
// Rendering
|
|
||||||
void draw_pixel(int x, int y, unsigned int color);
|
|
||||||
void draw_rect(int x, int y, int w, int h, unsigned int color, int t = 1);
|
|
||||||
void draw_rect_solid(int x, int y, int w, int h, unsigned int color);
|
|
||||||
void draw_line(int x1, int y1, int x2, int y2, unsigned int color, int t = 1);
|
|
||||||
void flip(bool h, bool v);
|
|
||||||
|
|
||||||
private:
|
|
||||||
nimg image;
|
|
||||||
};
|
|
||||||
} // namespace RenderD7
|
|
@ -1,122 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include <3ds.h>
|
|
||||||
|
|
||||||
#include <atomic>
|
|
||||||
#include <functional>
|
|
||||||
#include <renderd7/parameter.hpp>
|
|
||||||
|
|
||||||
using CTRU_Thread = Thread;
|
|
||||||
|
|
||||||
#define THREAD_STACK_SIZE 0x1000
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
class Thread {
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* @brief Default constructor
|
|
||||||
* @note This should only be called when calling m3d::Thread::initialize()
|
|
||||||
* before calling m3d::Thread::start()
|
|
||||||
*/
|
|
||||||
Thread();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Constructs the thread
|
|
||||||
* @param t_function The thread function
|
|
||||||
* @param t_parameter The parameter to pass to the function
|
|
||||||
* @param t_autostart Whether the thread should start instantly
|
|
||||||
* @param t_detached Whether the thread starts detached or not
|
|
||||||
* @param t_stackSize The stacksize allocated for the thread in bytes (rounded
|
|
||||||
* to multiples of 8 bytes)
|
|
||||||
* @note t_function needs to be of type `void` and take one (and only one)
|
|
||||||
* parameter of type m3d::Parameter
|
|
||||||
* @warning If the thread priority is lower than the priority of the calling
|
|
||||||
* thread, the thread will never get executed. Use
|
|
||||||
* m3d::Thread::getCurrentPriority() to get the priority of the current thread
|
|
||||||
*/
|
|
||||||
Thread(std::function<void(RenderD7::Parameter)> t_function,
|
|
||||||
RenderD7::Parameter t_parameter = nullptr, bool t_autostart = false,
|
|
||||||
bool t_detached = false,
|
|
||||||
unsigned long long int t_stackSize = 4 * 1024);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Destructs the thread
|
|
||||||
*/
|
|
||||||
virtual ~Thread();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Initializes the thread
|
|
||||||
* @param t_function The thread function
|
|
||||||
* @param t_parameter The parameter to pass to the function
|
|
||||||
* @param t_autostart Whether the thread should start instantly
|
|
||||||
* @param t_detached Whether the thread starts detached or not
|
|
||||||
* @param t_stackSize The stacksize allocated for the thread in bytes (rounded
|
|
||||||
* to multiples of 8 bytes)
|
|
||||||
* @note t_function needs to be of type `void` and take one (and only one)
|
|
||||||
* parameter of type m3d::Parameter
|
|
||||||
* @warning If the thread priority is lower than the priority of the calling
|
|
||||||
* thread, the thread will never get executed. Use
|
|
||||||
* m3d::Thread::getCurrentPriority() to get the priority of the current thread
|
|
||||||
*/
|
|
||||||
void initialize(std::function<void(RenderD7::Parameter)> t_function,
|
|
||||||
RenderD7::Parameter t_parameter = nullptr,
|
|
||||||
bool t_autostart = false, bool t_detached = false,
|
|
||||||
unsigned long long int t_stackSize = 4 * 1024);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Sets the size of the stack that gets allocated for the next thread
|
|
||||||
* that get's started
|
|
||||||
* @param t_stackSize The allocated space in bytes (rounded to multiples of 8
|
|
||||||
* bytes)
|
|
||||||
*/
|
|
||||||
void setStackSize(unsigned long long int t_stackSize);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Starts the thread. To restart it, call Thread::join() before
|
|
||||||
* @param t_detached Whether the thread should start detached or not
|
|
||||||
*/
|
|
||||||
void start(bool t_detached = false);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Detaches the thread
|
|
||||||
*/
|
|
||||||
void kill();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Waits for the thread to finish
|
|
||||||
* @param t_timeout The timeout in nanoseconds. Leave it for no timeout
|
|
||||||
*/
|
|
||||||
void join(long long unsigned int t_timeout = U64_MAX);
|
|
||||||
|
|
||||||
bool isRunning();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Puts the thread to sleep
|
|
||||||
*
|
|
||||||
* This is needed if you have multiple threads running at the same time. It
|
|
||||||
* doesn't affect the execution-time of the thread, it just makes it possible
|
|
||||||
* for the other threads to get their chance to shine.
|
|
||||||
*/
|
|
||||||
static void sleep();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Sleeps for the given time
|
|
||||||
* @param t_milliseconds The time to sleep in milliseconds
|
|
||||||
*/
|
|
||||||
static void sleep(int t_milliseconds);
|
|
||||||
|
|
||||||
private:
|
|
||||||
struct ThreadData {
|
|
||||||
RenderD7::Parameter m_parameter;
|
|
||||||
std::function<void(RenderD7::Parameter)> m_function;
|
|
||||||
std::atomic<bool> *m_running;
|
|
||||||
};
|
|
||||||
|
|
||||||
static void threadFunction(void *t_arg);
|
|
||||||
/* data */
|
|
||||||
int m_priority, m_stackSize;
|
|
||||||
bool m_started;
|
|
||||||
std::atomic<bool> m_running;
|
|
||||||
RenderD7::Thread::ThreadData m_data;
|
|
||||||
CTRU_Thread m_thread;
|
|
||||||
};
|
|
||||||
} // namespace RenderD7
|
|
20
internal/Clock.cpp
Normal file
20
internal/Clock.cpp
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#include "Clock.hpp"
|
||||||
|
|
||||||
|
namespace rnd7 {
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
Time Clock::getElapsedTime() const {
|
||||||
|
return getCurrentTime() - m_startTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
Time Clock::restart() {
|
||||||
|
Time now = getCurrentTime();
|
||||||
|
Time elapsed = now - m_startTime;
|
||||||
|
m_startTime = now;
|
||||||
|
|
||||||
|
return elapsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
23
internal/Clock.hpp
Normal file
23
internal/Clock.hpp
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#include <Time.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
namespace rnd7 {
|
||||||
|
class Clock {
|
||||||
|
public:
|
||||||
|
Clock() {};
|
||||||
|
|
||||||
|
virtual ~Clock() {};
|
||||||
|
|
||||||
|
|
||||||
|
virtual Time getCurrentTime() const { return Time{}; };
|
||||||
|
|
||||||
|
Time getElapsedTime() const;
|
||||||
|
|
||||||
|
Time restart();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
Time m_startTime; ///< Time of last reset, in microseconds
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
200
internal/Time.cpp
Normal file
200
internal/Time.cpp
Normal file
@ -0,0 +1,200 @@
|
|||||||
|
#include "Time.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
namespace rnd7 {
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
const Time Time::Zero_;
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
Time::Time() :
|
||||||
|
m_microseconds(0) {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
float Time::asSeconds() const {
|
||||||
|
return m_microseconds / 1000000.f;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
int Time::asMilliseconds() const {
|
||||||
|
return static_cast<int>(m_microseconds / 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
long Time::asMicroseconds() const {
|
||||||
|
return m_microseconds;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
Time::Time(long microseconds) :
|
||||||
|
m_microseconds(microseconds) {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
Time seconds(float amount) {
|
||||||
|
return Time(static_cast<long>(amount * 1000000));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
Time milliseconds(int amount) {
|
||||||
|
return Time(static_cast<long>(amount) * 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
Time microseconds(long amount) {
|
||||||
|
return Time(amount);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
bool operator==(Time left, Time right) {
|
||||||
|
return left.asMicroseconds() == right.asMicroseconds();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
bool operator!=(Time left, Time right) {
|
||||||
|
return left.asMicroseconds() != right.asMicroseconds();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
bool operator<(Time left, Time right) {
|
||||||
|
return left.asMicroseconds() < right.asMicroseconds();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
bool operator>(Time left, Time right) {
|
||||||
|
return left.asMicroseconds() > right.asMicroseconds();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
bool operator<=(Time left, Time right) {
|
||||||
|
return left.asMicroseconds() <= right.asMicroseconds();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
bool operator>=(Time left, Time right) {
|
||||||
|
return left.asMicroseconds() >= right.asMicroseconds();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
Time operator-(Time right) {
|
||||||
|
return microseconds(-right.asMicroseconds());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
Time operator+(Time left, Time right) {
|
||||||
|
return microseconds(left.asMicroseconds() + right.asMicroseconds());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
Time &operator+=(Time &left, Time right) {
|
||||||
|
return left = left + right;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
Time operator-(Time left, Time right) {
|
||||||
|
return microseconds(left.asMicroseconds() - right.asMicroseconds());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
Time &operator-=(Time &left, Time right) {
|
||||||
|
return left = left - right;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
Time operator*(Time left, float right) {
|
||||||
|
return seconds(left.asSeconds() * right);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
Time operator*(Time left, long right) {
|
||||||
|
return microseconds(left.asMicroseconds() * right);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
Time operator*(float left, Time right) {
|
||||||
|
return right * left;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
Time operator*(long left, Time right) {
|
||||||
|
return right * left;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
Time &operator*=(Time &left, float right) {
|
||||||
|
return left = left * right;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
Time &operator*=(Time &left, long right) {
|
||||||
|
return left = left * right;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
Time operator/(Time left, float right) {
|
||||||
|
return seconds(left.asSeconds() / right);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
Time operator/(Time left, long right) {
|
||||||
|
return microseconds(left.asMicroseconds() / right);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
Time &operator/=(Time &left, float right) {
|
||||||
|
return left = left / right;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
Time &operator/=(Time &left, long right) {
|
||||||
|
return left = left / right;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
float operator/(Time left, Time right) {
|
||||||
|
return left.asSeconds() / right.asSeconds();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
Time operator%(Time left, Time right) {
|
||||||
|
return microseconds(left.asMicroseconds() % right.asMicroseconds());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
Time &operator%=(Time &left, Time right) {
|
||||||
|
return left = left % right;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
82
internal/Time.hpp
Normal file
82
internal/Time.hpp
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
namespace rnd7 {
|
||||||
|
class Time {
|
||||||
|
public:
|
||||||
|
|
||||||
|
Time();
|
||||||
|
|
||||||
|
float asSeconds() const;
|
||||||
|
|
||||||
|
int asMilliseconds() const;
|
||||||
|
|
||||||
|
long asMicroseconds() const;
|
||||||
|
|
||||||
|
static const Time Zero_;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
friend Time seconds(float);
|
||||||
|
|
||||||
|
friend Time milliseconds(int);
|
||||||
|
|
||||||
|
friend Time microseconds(long);
|
||||||
|
|
||||||
|
explicit Time(long microseconds);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
long m_microseconds; ///< Time value stored as microseconds
|
||||||
|
};
|
||||||
|
|
||||||
|
Time seconds(float amount);
|
||||||
|
|
||||||
|
Time milliseconds(int amount);
|
||||||
|
|
||||||
|
Time microseconds(long amount);
|
||||||
|
|
||||||
|
bool operator==(Time left, Time right);
|
||||||
|
|
||||||
|
bool operator!=(Time left, Time right);
|
||||||
|
|
||||||
|
bool operator<(Time left, Time right);
|
||||||
|
|
||||||
|
bool operator>(Time left, Time right);
|
||||||
|
bool operator<=(Time left, Time right);
|
||||||
|
|
||||||
|
bool operator>=(Time left, Time right);
|
||||||
|
|
||||||
|
Time operator-(Time right);
|
||||||
|
Time operator+(Time left, Time right);
|
||||||
|
|
||||||
|
Time &operator+=(Time &left, Time right);
|
||||||
|
|
||||||
|
Time operator-(Time left, Time right);
|
||||||
|
|
||||||
|
Time &operator-=(Time &left, Time right);
|
||||||
|
|
||||||
|
Time operator*(Time left, float right);
|
||||||
|
|
||||||
|
Time operator*(Time left, long right);
|
||||||
|
|
||||||
|
Time operator*(float left, Time right);
|
||||||
|
|
||||||
|
Time operator*(long left, Time right);
|
||||||
|
|
||||||
|
Time &operator*=(Time &left, float right);
|
||||||
|
|
||||||
|
Time &operator*=(Time &left, long right);
|
||||||
|
|
||||||
|
Time operator/(Time left, float right);
|
||||||
|
|
||||||
|
Time operator/(Time left, long right);
|
||||||
|
|
||||||
|
Time &operator/=(Time &left, float right);
|
||||||
|
|
||||||
|
Time &operator/=(Time &left, long right);
|
||||||
|
|
||||||
|
float operator/(Time left, Time right);
|
||||||
|
|
||||||
|
Time operator%(Time left, Time right);
|
||||||
|
|
||||||
|
Time &operator%=(Time &left, Time right);
|
||||||
|
|
||||||
|
}
|
40
internal/engine.hpp
Normal file
40
internal/engine.hpp
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <3ds.h>
|
||||||
|
#include <citro2d.h>
|
||||||
|
#include <citro3d.h>
|
||||||
|
#include <memory>
|
||||||
|
#include <stack>
|
||||||
|
#include <string>
|
||||||
|
#include <functional>
|
||||||
|
#include <vector>
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <cstring>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <iostream>
|
||||||
|
#include <codecvt>
|
||||||
|
#include <map>
|
||||||
|
#include "lang.hpp"
|
||||||
|
#include "parameter.hpp"
|
||||||
|
#include "thread.hpp"
|
||||||
|
#include "ini.hpp"
|
||||||
|
#include "stringtool.hpp"
|
||||||
|
|
||||||
|
enum EngineType
|
||||||
|
{
|
||||||
|
_2D,
|
||||||
|
_3D
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace Npi
|
||||||
|
class Game {
|
||||||
|
public:
|
||||||
|
Game(EngineType, std::string name);
|
||||||
|
~Game(){}
|
||||||
|
private:
|
||||||
|
std::string g_name;
|
||||||
|
EngineType g_etype;
|
||||||
|
};
|
||||||
|
}
|
679
internal/ini.hpp
Normal file
679
internal/ini.hpp
Normal file
@ -0,0 +1,679 @@
|
|||||||
|
#ifndef INI_INI_H_
|
||||||
|
#define INI_INI_H_
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <sstream>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <utility>
|
||||||
|
#include <unordered_map>
|
||||||
|
#include <vector>
|
||||||
|
#include <memory>
|
||||||
|
#include <fstream>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <cctype>
|
||||||
|
|
||||||
|
namespace INI
|
||||||
|
{
|
||||||
|
namespace INIStringUtil
|
||||||
|
{
|
||||||
|
const char* const whitespaceDelimiters = " \t\n\r\f\v";
|
||||||
|
inline void trim(std::string& str)
|
||||||
|
{
|
||||||
|
str.erase(str.find_last_not_of(whitespaceDelimiters) + 1);
|
||||||
|
str.erase(0, str.find_first_not_of(whitespaceDelimiters));
|
||||||
|
}
|
||||||
|
#ifndef INI_CASE_SENSITIVE
|
||||||
|
inline void toLower(std::string& str)
|
||||||
|
{
|
||||||
|
std::transform(str.begin(), str.end(), str.begin(), [](const char c) {
|
||||||
|
return static_cast<const char>(std::tolower(c));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
inline void replace(std::string& str, std::string const& a, std::string const& b)
|
||||||
|
{
|
||||||
|
if (!a.empty())
|
||||||
|
{
|
||||||
|
std::size_t pos = 0;
|
||||||
|
while ((pos = str.find(a, pos)) != std::string::npos)
|
||||||
|
{
|
||||||
|
str.replace(pos, a.size(), b);
|
||||||
|
pos += b.size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#ifdef _WIN32
|
||||||
|
const char* const endl = "\r\n";
|
||||||
|
#else
|
||||||
|
const char* const endl = "\n";
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class INIMap
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
using T_DataIndexMap = std::unordered_map<std::string, std::size_t>;
|
||||||
|
using T_DataItem = std::pair<std::string, T>;
|
||||||
|
using T_DataContainer = std::vector<T_DataItem>;
|
||||||
|
using T_MultiArgs = typename std::vector<std::pair<std::string, T>>;
|
||||||
|
|
||||||
|
T_DataIndexMap dataIndexMap;
|
||||||
|
T_DataContainer data;
|
||||||
|
|
||||||
|
inline std::size_t setEmpty(std::string& key)
|
||||||
|
{
|
||||||
|
std::size_t index = data.size();
|
||||||
|
dataIndexMap[key] = index;
|
||||||
|
data.emplace_back(key, T());
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
using const_iterator = typename T_DataContainer::const_iterator;
|
||||||
|
|
||||||
|
INIMap() { }
|
||||||
|
|
||||||
|
INIMap(INIMap const& other)
|
||||||
|
{
|
||||||
|
std::size_t data_size = other.data.size();
|
||||||
|
for (std::size_t i = 0; i < data_size; ++i)
|
||||||
|
{
|
||||||
|
auto const& key = other.data[i].first;
|
||||||
|
auto const& obj = other.data[i].second;
|
||||||
|
data.emplace_back(key, obj);
|
||||||
|
}
|
||||||
|
dataIndexMap = T_DataIndexMap(other.dataIndexMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
T& operator[](std::string key)
|
||||||
|
{
|
||||||
|
INIStringUtil::trim(key);
|
||||||
|
#ifndef INI_CASE_SENSITIVE
|
||||||
|
INIStringUtil::toLower(key);
|
||||||
|
#endif
|
||||||
|
auto it = dataIndexMap.find(key);
|
||||||
|
bool hasIt = (it != dataIndexMap.end());
|
||||||
|
std::size_t index = (hasIt) ? it->second : setEmpty(key);
|
||||||
|
return data[index].second;
|
||||||
|
}
|
||||||
|
T get(std::string key) const
|
||||||
|
{
|
||||||
|
INIStringUtil::trim(key);
|
||||||
|
#ifndef INI_CASE_SENSITIVE
|
||||||
|
INIStringUtil::toLower(key);
|
||||||
|
#endif
|
||||||
|
auto it = dataIndexMap.find(key);
|
||||||
|
if (it == dataIndexMap.end())
|
||||||
|
{
|
||||||
|
return T();
|
||||||
|
}
|
||||||
|
return T(data[it->second].second);
|
||||||
|
}
|
||||||
|
bool has(std::string key) const
|
||||||
|
{
|
||||||
|
INIStringUtil::trim(key);
|
||||||
|
#ifndef INI_CASE_SENSITIVE
|
||||||
|
INIStringUtil::toLower(key);
|
||||||
|
#endif
|
||||||
|
return (dataIndexMap.count(key) == 1);
|
||||||
|
}
|
||||||
|
void set(std::string key, T obj)
|
||||||
|
{
|
||||||
|
INIStringUtil::trim(key);
|
||||||
|
#ifndef INI_CASE_SENSITIVE
|
||||||
|
INIStringUtil::toLower(key);
|
||||||
|
#endif
|
||||||
|
auto it = dataIndexMap.find(key);
|
||||||
|
if (it != dataIndexMap.end())
|
||||||
|
{
|
||||||
|
data[it->second].second = obj;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dataIndexMap[key] = data.size();
|
||||||
|
data.emplace_back(key, obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void set(T_MultiArgs const& multiArgs)
|
||||||
|
{
|
||||||
|
for (auto const& it : multiArgs)
|
||||||
|
{
|
||||||
|
auto const& key = it.first;
|
||||||
|
auto const& obj = it.second;
|
||||||
|
set(key, obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bool remove(std::string key)
|
||||||
|
{
|
||||||
|
INIStringUtil::trim(key);
|
||||||
|
#ifndef INI_CASE_SENSITIVE
|
||||||
|
INIStringUtil::toLower(key);
|
||||||
|
#endif
|
||||||
|
auto it = dataIndexMap.find(key);
|
||||||
|
if (it != dataIndexMap.end())
|
||||||
|
{
|
||||||
|
std::size_t index = it->second;
|
||||||
|
data.erase(data.begin() + index);
|
||||||
|
dataIndexMap.erase(it);
|
||||||
|
for (auto& it2 : dataIndexMap)
|
||||||
|
{
|
||||||
|
auto& vi = it2.second;
|
||||||
|
if (vi > index)
|
||||||
|
{
|
||||||
|
vi--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
void clear()
|
||||||
|
{
|
||||||
|
data.clear();
|
||||||
|
dataIndexMap.clear();
|
||||||
|
}
|
||||||
|
std::size_t size() const
|
||||||
|
{
|
||||||
|
return data.size();
|
||||||
|
}
|
||||||
|
const_iterator begin() const { return data.begin(); }
|
||||||
|
const_iterator end() const { return data.end(); }
|
||||||
|
};
|
||||||
|
|
||||||
|
using INIStructure = INIMap<INIMap<std::string>>;
|
||||||
|
|
||||||
|
namespace INIParser
|
||||||
|
{
|
||||||
|
using T_ParseValues = std::pair<std::string, std::string>;
|
||||||
|
|
||||||
|
enum class PDataType : char
|
||||||
|
{
|
||||||
|
PDATA_NONE,
|
||||||
|
PDATA_COMMENT,
|
||||||
|
PDATA_SECTION,
|
||||||
|
PDATA_KEYVALUE,
|
||||||
|
PDATA_UNKNOWN
|
||||||
|
};
|
||||||
|
|
||||||
|
inline PDataType parseLine(std::string line, T_ParseValues& parseData)
|
||||||
|
{
|
||||||
|
parseData.first.clear();
|
||||||
|
parseData.second.clear();
|
||||||
|
INIStringUtil::trim(line);
|
||||||
|
if (line.empty())
|
||||||
|
{
|
||||||
|
return PDataType::PDATA_NONE;
|
||||||
|
}
|
||||||
|
char firstCharacter = line[0];
|
||||||
|
if (firstCharacter == ';')
|
||||||
|
{
|
||||||
|
return PDataType::PDATA_COMMENT;
|
||||||
|
}
|
||||||
|
if (firstCharacter == '[')
|
||||||
|
{
|
||||||
|
auto commentAt = line.find_first_of(';');
|
||||||
|
if (commentAt != std::string::npos)
|
||||||
|
{
|
||||||
|
line = line.substr(0, commentAt);
|
||||||
|
}
|
||||||
|
auto closingBracketAt = line.find_last_of(']');
|
||||||
|
if (closingBracketAt != std::string::npos)
|
||||||
|
{
|
||||||
|
auto section = line.substr(1, closingBracketAt - 1);
|
||||||
|
INIStringUtil::trim(section);
|
||||||
|
parseData.first = section;
|
||||||
|
return PDataType::PDATA_SECTION;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
auto lineNorm = line;
|
||||||
|
INIStringUtil::replace(lineNorm, "\\=", " ");
|
||||||
|
auto equalsAt = lineNorm.find_first_of('=');
|
||||||
|
if (equalsAt != std::string::npos)
|
||||||
|
{
|
||||||
|
auto key = line.substr(0, equalsAt);
|
||||||
|
INIStringUtil::trim(key);
|
||||||
|
INIStringUtil::replace(key, "\\=", "=");
|
||||||
|
auto value = line.substr(equalsAt + 1);
|
||||||
|
INIStringUtil::trim(value);
|
||||||
|
parseData.first = key;
|
||||||
|
parseData.second = value;
|
||||||
|
return PDataType::PDATA_KEYVALUE;
|
||||||
|
}
|
||||||
|
return PDataType::PDATA_UNKNOWN;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class INIReader
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using T_LineData = std::vector<std::string>;
|
||||||
|
using T_LineDataPtr = std::shared_ptr<T_LineData>;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::ifstream fileReadStream;
|
||||||
|
T_LineDataPtr lineData;
|
||||||
|
|
||||||
|
T_LineData readFile()
|
||||||
|
{
|
||||||
|
std::string fileContents;
|
||||||
|
fileReadStream.seekg(0, std::ios::end);
|
||||||
|
fileContents.resize(fileReadStream.tellg());
|
||||||
|
fileReadStream.seekg(0, std::ios::beg);
|
||||||
|
std::size_t fileSize = fileContents.size();
|
||||||
|
fileReadStream.read(&fileContents[0], fileSize);
|
||||||
|
fileReadStream.close();
|
||||||
|
T_LineData output;
|
||||||
|
if (fileSize == 0)
|
||||||
|
{
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
std::string buffer;
|
||||||
|
buffer.reserve(50);
|
||||||
|
for (std::size_t i = 0; i < fileSize; ++i)
|
||||||
|
{
|
||||||
|
char& c = fileContents[i];
|
||||||
|
if (c == '\n')
|
||||||
|
{
|
||||||
|
output.emplace_back(buffer);
|
||||||
|
buffer.clear();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (c != '\0' && c != '\r')
|
||||||
|
{
|
||||||
|
buffer += c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
output.emplace_back(buffer);
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
INIReader(std::string const& filename, bool keepLineData = false)
|
||||||
|
{
|
||||||
|
fileReadStream.open(filename, std::ios::in | std::ios::binary);
|
||||||
|
if (keepLineData)
|
||||||
|
{
|
||||||
|
lineData = std::make_shared<T_LineData>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
~INIReader() { }
|
||||||
|
|
||||||
|
bool operator>>(INIStructure& data)
|
||||||
|
{
|
||||||
|
if (!fileReadStream.is_open())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
T_LineData fileLines = readFile();
|
||||||
|
std::string section;
|
||||||
|
bool inSection = false;
|
||||||
|
INIParser::T_ParseValues parseData;
|
||||||
|
for (auto const& line : fileLines)
|
||||||
|
{
|
||||||
|
auto parseResult = INIParser::parseLine(line, parseData);
|
||||||
|
if (parseResult == INIParser::PDataType::PDATA_SECTION)
|
||||||
|
{
|
||||||
|
inSection = true;
|
||||||
|
data[section = parseData.first];
|
||||||
|
}
|
||||||
|
else if (inSection && parseResult == INIParser::PDataType::PDATA_KEYVALUE)
|
||||||
|
{
|
||||||
|
auto const& key = parseData.first;
|
||||||
|
auto const& value = parseData.second;
|
||||||
|
data[section][key] = value;
|
||||||
|
}
|
||||||
|
if (lineData && parseResult != INIParser::PDataType::PDATA_UNKNOWN)
|
||||||
|
{
|
||||||
|
if (parseResult == INIParser::PDataType::PDATA_KEYVALUE && !inSection)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
lineData->emplace_back(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
T_LineDataPtr getLines()
|
||||||
|
{
|
||||||
|
return lineData;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class INIGenerator
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
std::ofstream fileWriteStream;
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool prettyPrint = false;
|
||||||
|
|
||||||
|
INIGenerator(std::string const& filename)
|
||||||
|
{
|
||||||
|
fileWriteStream.open(filename, std::ios::out | std::ios::binary);
|
||||||
|
}
|
||||||
|
~INIGenerator() { }
|
||||||
|
|
||||||
|
bool operator<<(INIStructure const& data)
|
||||||
|
{
|
||||||
|
if (!fileWriteStream.is_open())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!data.size())
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
auto it = data.begin();
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
auto const& section = it->first;
|
||||||
|
auto const& collection = it->second;
|
||||||
|
fileWriteStream
|
||||||
|
<< "["
|
||||||
|
<< section
|
||||||
|
<< "]";
|
||||||
|
if (collection.size())
|
||||||
|
{
|
||||||
|
fileWriteStream << INIStringUtil::endl;
|
||||||
|
auto it2 = collection.begin();
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
auto key = it2->first;
|
||||||
|
INIStringUtil::replace(key, "=", "\\=");
|
||||||
|
auto value = it2->second;
|
||||||
|
INIStringUtil::trim(value);
|
||||||
|
fileWriteStream
|
||||||
|
<< key
|
||||||
|
<< ((prettyPrint) ? " = " : "=")
|
||||||
|
<< value;
|
||||||
|
if (++it2 == collection.end())
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fileWriteStream << INIStringUtil::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (++it == data.end())
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fileWriteStream << INIStringUtil::endl;
|
||||||
|
if (prettyPrint)
|
||||||
|
{
|
||||||
|
fileWriteStream << INIStringUtil::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class INIWriter
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
using T_LineData = std::vector<std::string>;
|
||||||
|
using T_LineDataPtr = std::shared_ptr<T_LineData>;
|
||||||
|
|
||||||
|
std::string filename;
|
||||||
|
|
||||||
|
T_LineData getLazyOutput(T_LineDataPtr const& lineData, INIStructure& data, INIStructure& original)
|
||||||
|
{
|
||||||
|
T_LineData output;
|
||||||
|
INIParser::T_ParseValues parseData;
|
||||||
|
std::string sectionCurrent;
|
||||||
|
bool parsingSection = false;
|
||||||
|
bool continueToNextSection = false;
|
||||||
|
bool discardNextEmpty = false;
|
||||||
|
bool writeNewKeys = false;
|
||||||
|
std::size_t lastKeyLine = 0;
|
||||||
|
for (auto line = lineData->begin(); line != lineData->end(); ++line)
|
||||||
|
{
|
||||||
|
if (!writeNewKeys)
|
||||||
|
{
|
||||||
|
auto parseResult = INIParser::parseLine(*line, parseData);
|
||||||
|
if (parseResult == INIParser::PDataType::PDATA_SECTION)
|
||||||
|
{
|
||||||
|
if (parsingSection)
|
||||||
|
{
|
||||||
|
writeNewKeys = true;
|
||||||
|
parsingSection = false;
|
||||||
|
--line;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
sectionCurrent = parseData.first;
|
||||||
|
if (data.has(sectionCurrent))
|
||||||
|
{
|
||||||
|
parsingSection = true;
|
||||||
|
continueToNextSection = false;
|
||||||
|
discardNextEmpty = false;
|
||||||
|
output.emplace_back(*line);
|
||||||
|
lastKeyLine = output.size();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
continueToNextSection = true;
|
||||||
|
discardNextEmpty = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (parseResult == INIParser::PDataType::PDATA_KEYVALUE)
|
||||||
|
{
|
||||||
|
if (continueToNextSection)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (data.has(sectionCurrent))
|
||||||
|
{
|
||||||
|
auto& collection = data[sectionCurrent];
|
||||||
|
auto const& key = parseData.first;
|
||||||
|
auto const& value = parseData.second;
|
||||||
|
if (collection.has(key))
|
||||||
|
{
|
||||||
|
auto outputValue = collection[key];
|
||||||
|
if (value == outputValue)
|
||||||
|
{
|
||||||
|
output.emplace_back(*line);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
INIStringUtil::trim(outputValue);
|
||||||
|
auto lineNorm = *line;
|
||||||
|
INIStringUtil::replace(lineNorm, "\\=", " ");
|
||||||
|
auto equalsAt = lineNorm.find_first_of('=');
|
||||||
|
auto valueAt = lineNorm.find_first_not_of(
|
||||||
|
INIStringUtil::whitespaceDelimiters,
|
||||||
|
equalsAt + 1
|
||||||
|
);
|
||||||
|
std::string outputLine = line->substr(0, valueAt);
|
||||||
|
if (prettyPrint && equalsAt + 1 == valueAt)
|
||||||
|
{
|
||||||
|
outputLine += " ";
|
||||||
|
}
|
||||||
|
outputLine += outputValue;
|
||||||
|
output.emplace_back(outputLine);
|
||||||
|
}
|
||||||
|
lastKeyLine = output.size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (discardNextEmpty && line->empty())
|
||||||
|
{
|
||||||
|
discardNextEmpty = false;
|
||||||
|
}
|
||||||
|
else if (parseResult != INIParser::PDataType::PDATA_UNKNOWN)
|
||||||
|
{
|
||||||
|
output.emplace_back(*line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (writeNewKeys || std::next(line) == lineData->end())
|
||||||
|
{
|
||||||
|
T_LineData linesToAdd;
|
||||||
|
if (data.has(sectionCurrent) && original.has(sectionCurrent))
|
||||||
|
{
|
||||||
|
auto const& collection = data[sectionCurrent];
|
||||||
|
auto const& collectionOriginal = original[sectionCurrent];
|
||||||
|
for (auto const& it : collection)
|
||||||
|
{
|
||||||
|
auto key = it.first;
|
||||||
|
if (collectionOriginal.has(key))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
auto value = it.second;
|
||||||
|
INIStringUtil::replace(key, "=", "\\=");
|
||||||
|
INIStringUtil::trim(value);
|
||||||
|
linesToAdd.emplace_back(
|
||||||
|
key + ((prettyPrint) ? " = " : "=") + value
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!linesToAdd.empty())
|
||||||
|
{
|
||||||
|
output.insert(
|
||||||
|
output.begin() + lastKeyLine,
|
||||||
|
linesToAdd.begin(),
|
||||||
|
linesToAdd.end()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (writeNewKeys)
|
||||||
|
{
|
||||||
|
writeNewKeys = false;
|
||||||
|
--line;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (auto const& it : data)
|
||||||
|
{
|
||||||
|
auto const& section = it.first;
|
||||||
|
if (original.has(section))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (prettyPrint && output.size() > 0 && !output.back().empty())
|
||||||
|
{
|
||||||
|
output.emplace_back();
|
||||||
|
}
|
||||||
|
output.emplace_back("[" + section + "]");
|
||||||
|
auto const& collection = it.second;
|
||||||
|
for (auto const& it2 : collection)
|
||||||
|
{
|
||||||
|
auto key = it2.first;
|
||||||
|
auto value = it2.second;
|
||||||
|
INIStringUtil::replace(key, "=", "\\=");
|
||||||
|
INIStringUtil::trim(value);
|
||||||
|
output.emplace_back(
|
||||||
|
key + ((prettyPrint) ? " = " : "=") + value
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool prettyPrint = false;
|
||||||
|
|
||||||
|
INIWriter(std::string const& filename)
|
||||||
|
: filename(filename)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
~INIWriter() { }
|
||||||
|
|
||||||
|
bool operator<<(INIStructure& data)
|
||||||
|
{
|
||||||
|
struct stat buf;
|
||||||
|
bool fileExists = (stat(filename.c_str(), &buf) == 0);
|
||||||
|
if (!fileExists)
|
||||||
|
{
|
||||||
|
INIGenerator generator(filename);
|
||||||
|
generator.prettyPrint = prettyPrint;
|
||||||
|
return generator << data;
|
||||||
|
}
|
||||||
|
INIStructure originalData;
|
||||||
|
T_LineDataPtr lineData;
|
||||||
|
bool readSuccess = false;
|
||||||
|
{
|
||||||
|
INIReader reader(filename, true);
|
||||||
|
if ((readSuccess = reader >> originalData))
|
||||||
|
{
|
||||||
|
lineData = reader.getLines();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!readSuccess)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
T_LineData output = getLazyOutput(lineData, data, originalData);
|
||||||
|
std::ofstream fileWriteStream(filename, std::ios::out | std::ios::binary);
|
||||||
|
if (fileWriteStream.is_open())
|
||||||
|
{
|
||||||
|
if (output.size())
|
||||||
|
{
|
||||||
|
auto line = output.begin();
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
fileWriteStream << *line;
|
||||||
|
if (++line == output.end())
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fileWriteStream << INIStringUtil::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class INIFile
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
std::string filename;
|
||||||
|
|
||||||
|
public:
|
||||||
|
INIFile(std::string const& filename)
|
||||||
|
: filename(filename)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
~INIFile() { }
|
||||||
|
|
||||||
|
bool read(INIStructure& data) const
|
||||||
|
{
|
||||||
|
if (data.size())
|
||||||
|
{
|
||||||
|
data.clear();
|
||||||
|
}
|
||||||
|
if (filename.empty())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
INIReader reader(filename);
|
||||||
|
return reader >> data;
|
||||||
|
}
|
||||||
|
bool generate(INIStructure const& data, bool pretty = false) const
|
||||||
|
{
|
||||||
|
if (filename.empty())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
INIGenerator generator(filename);
|
||||||
|
generator.prettyPrint = pretty;
|
||||||
|
return generator << data;
|
||||||
|
}
|
||||||
|
bool write(INIStructure& data, bool pretty = false) const
|
||||||
|
{
|
||||||
|
if (filename.empty())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
INIWriter writer(filename);
|
||||||
|
writer.prettyPrint = pretty;
|
||||||
|
return writer << data;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
98
internal/lang.cpp
Normal file
98
internal/lang.cpp
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
#include "lang.hpp"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <3ds.h>
|
||||||
|
static nlohmann::json appJson;
|
||||||
|
|
||||||
|
std::string RenderD7::Lang::getSys()
|
||||||
|
{
|
||||||
|
|
||||||
|
u8 language = 1;
|
||||||
|
CFGU_GetSystemLanguage(&language);
|
||||||
|
|
||||||
|
switch(language) {
|
||||||
|
case 0:
|
||||||
|
return "jp"; // Japanese
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
return "en"; // English
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
return "fr"; // French
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
return "de"; // German
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
return "it"; // Italian
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 5:
|
||||||
|
return "es"; // Spanish
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 6:
|
||||||
|
return "zh-CN"; // Chinese (Simplified)
|
||||||
|
break;
|
||||||
|
|
||||||
|
// case 7:
|
||||||
|
// return "ko"; // Korean
|
||||||
|
// break;
|
||||||
|
|
||||||
|
// case 8:
|
||||||
|
// return "nl"; // Dutch
|
||||||
|
// break;
|
||||||
|
|
||||||
|
case 9:
|
||||||
|
return "pt"; // Portuguese
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 10:
|
||||||
|
return "ru"; // Russian
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 11:
|
||||||
|
return "zh-TW"; // Chinese (Traditional)
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return "en"; // Fall back to English if missing
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
std::string RenderD7::Lang::get(const std::string &key) {
|
||||||
|
if (!appJson.contains(key)) return key;
|
||||||
|
|
||||||
|
return appJson.at(key).get_ref<const std::string&>();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderD7::Lang::load(const std::string &lang) {
|
||||||
|
FILE *values;
|
||||||
|
|
||||||
|
if (access(("romfs:/lang/" + lang + "/app.json").c_str(), F_OK) == 0) {
|
||||||
|
values = fopen(("romfs:/lang/" + lang + "/app.json").c_str(), "rt");
|
||||||
|
if (values) {
|
||||||
|
appJson = nlohmann::json::parse(values, nullptr, false);
|
||||||
|
fclose(values);
|
||||||
|
}
|
||||||
|
if (appJson.is_discarded())
|
||||||
|
appJson = { };
|
||||||
|
return;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
values = fopen("romfs:/lang/en/app.json", "rt");
|
||||||
|
if (values) {
|
||||||
|
appJson = nlohmann::json::parse(values, nullptr, false);
|
||||||
|
fclose(values);
|
||||||
|
}
|
||||||
|
if (appJson.is_discarded())
|
||||||
|
appJson = { };
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
16
internal/lang.hpp
Normal file
16
internal/lang.hpp
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <string>
|
||||||
|
#include "json.hpp"
|
||||||
|
|
||||||
|
/// RenderD7::Lang
|
||||||
|
namespace RenderD7::Lang
|
||||||
|
{
|
||||||
|
/// Get the 3ds System Language
|
||||||
|
std::string getSys();
|
||||||
|
/// Get a translated string
|
||||||
|
/// key: The Key so the code can find your string
|
||||||
|
std::string get(const std::string &key);
|
||||||
|
/// Load the lang file from dir structure en/app.json for sample
|
||||||
|
/// lang: the folder name en, fr, de ... . I prefer geSys()
|
||||||
|
void load(const std::string &lang);
|
||||||
|
} /// RenderD7::Lang
|
112
internal/parameter.hpp
Normal file
112
internal/parameter.hpp
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <tuple>
|
||||||
|
|
||||||
|
namespace RenderD7{
|
||||||
|
class Parameter
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
using id = size_t;
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct type { static void id() { } };
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
static id type_id() { return reinterpret_cast<id>(&type<T>::id); }
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
using decay = typename std::decay<T>::type;
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
using none = typename std::enable_if<!std::is_same<Parameter, T>::value>::type;
|
||||||
|
|
||||||
|
struct base
|
||||||
|
{
|
||||||
|
virtual ~base() { }
|
||||||
|
virtual bool is(id) const = 0;
|
||||||
|
virtual base *copy() const = 0;
|
||||||
|
} *p = nullptr;
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct data : base, std::tuple<T>
|
||||||
|
{
|
||||||
|
using std::tuple<T>::tuple;
|
||||||
|
|
||||||
|
T &get() & { return std::get<0>(*this); }
|
||||||
|
T const &get() const& { return std::get<0>(*this); }
|
||||||
|
|
||||||
|
bool is(id i) const override { return i == type_id<T>(); }
|
||||||
|
base *copy() const override { return new data{get()}; }
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
T &stat() { return static_cast<data<T>&>(*p).get(); }
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
T const &stat() const { return static_cast<data<T> const&>(*p).get(); }
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
T &dyn() { return dynamic_cast<data<T>&>(*p).get(); }
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
T const &dyn() const { return dynamic_cast<data<T> const&>(*p).get(); }
|
||||||
|
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Default constructor
|
||||||
|
*/
|
||||||
|
Parameter() { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Destructs the Parameter
|
||||||
|
*/
|
||||||
|
~Parameter() { delete p; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Copy constructor
|
||||||
|
* @param s The Parameter to copy
|
||||||
|
*/
|
||||||
|
Parameter(Parameter &&s) : p{s.p} { s.p = nullptr; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Const copy constructor
|
||||||
|
* @param s The Parameter to copy
|
||||||
|
*/
|
||||||
|
Parameter(Parameter const &s) : p{s.p->copy()} { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initializes the Parameter with the given value
|
||||||
|
* @param x The value to initialize the Parameter with
|
||||||
|
*/
|
||||||
|
template<typename T, typename U = decay<T>, typename = none<U>>
|
||||||
|
Parameter(T &&x) : p{new data<U>{std::forward<T>(x)}} { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Overloads the assignment operator
|
||||||
|
* @param s The value to set the Parameter to
|
||||||
|
*/
|
||||||
|
Parameter &operator=(Parameter s) { swap(*this, s); return *this; }
|
||||||
|
|
||||||
|
friend void swap(Parameter &s, Parameter &r) { std::swap(s.p, r.p); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Clears the Parameter
|
||||||
|
*/
|
||||||
|
void clear() { delete p; p = nullptr; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Checks whether the Parameter is the given type
|
||||||
|
* @tparam T The type to check
|
||||||
|
* @return Whether the Parameter has the given type or not
|
||||||
|
*/
|
||||||
|
template<typename T>
|
||||||
|
bool is() const { return p ? p->is(type_id<T>()) : false; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Returns the value of the Parameter
|
||||||
|
* @tparam T The type of the Parameter
|
||||||
|
* @return The value of the Parameter
|
||||||
|
* @warning If the type of the Parameter doesn't match the type of it's stored value, it will result in undefined behaviour.
|
||||||
|
*/
|
||||||
|
template<typename T> T &get() & { return stat<T>(); }
|
||||||
|
};
|
||||||
|
}
|
11
internal/stringtool.hpp
Normal file
11
internal/stringtool.hpp
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
template<class T>
|
||||||
|
T GetFileName(T const & path, T const & delims = "/\\")
|
||||||
|
{
|
||||||
|
return path.substr(path.find_last_of(delims) + 1);
|
||||||
|
}
|
||||||
|
template<class T>
|
||||||
|
T remove_ext(T const & filename)
|
||||||
|
{
|
||||||
|
typename T::size_type const p(filename.find_last_of('.'));
|
||||||
|
return p > 0 && p != T::npos ? filename.substr(0, p) : filename;
|
||||||
|
}
|
81
internal/thread.cpp
Normal file
81
internal/thread.cpp
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
#include "thread.hpp"
|
||||||
|
namespace RenderD7 {
|
||||||
|
void Threads::Exit()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
Thread::Thread() :
|
||||||
|
m_started(false),
|
||||||
|
m_running(false) { /* do nothing */ }
|
||||||
|
|
||||||
|
Thread::Thread(std::function<void(RenderD7::Parameter)> t_function, RenderD7::Parameter t_parameter, bool t_autostart, bool t_detached, unsigned long long int t_stackSize) :
|
||||||
|
m_started(false),
|
||||||
|
m_running(false) {
|
||||||
|
initialize(t_function, t_parameter, t_autostart, t_detached, t_stackSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
Thread::~Thread() {
|
||||||
|
join();
|
||||||
|
|
||||||
|
if (m_started) threadFree(m_thread);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Thread::initialize(std::function<void(RenderD7::Parameter)> t_function, RenderD7::Parameter t_parameter, bool t_autostart, bool t_detached, unsigned long long int t_stackSize) {
|
||||||
|
m_stackSize = t_stackSize;
|
||||||
|
m_data.m_parameter = t_parameter;
|
||||||
|
m_data.m_function = t_function;
|
||||||
|
m_data.m_running = &m_running;
|
||||||
|
|
||||||
|
if (t_autostart) {
|
||||||
|
start(t_detached);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Thread::setStackSize(unsigned long long int t_stackSize) {
|
||||||
|
m_stackSize = t_stackSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Thread::start(bool t_detached) {
|
||||||
|
if (!m_running) {
|
||||||
|
m_started = true;
|
||||||
|
m_running = true;
|
||||||
|
s32 prio;
|
||||||
|
svcGetThreadPriority(&prio, CUR_THREAD_HANDLE);
|
||||||
|
m_thread = threadCreate(threadFunction, &m_data, m_stackSize, prio + 1, -2, t_detached);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Thread::kill() {
|
||||||
|
threadDetach(m_thread);
|
||||||
|
m_running = false;
|
||||||
|
m_started = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Thread::join(long long unsigned int t_timeout) {
|
||||||
|
if (m_running) {
|
||||||
|
threadJoin(m_thread, t_timeout);
|
||||||
|
threadFree(m_thread);
|
||||||
|
m_running = false;
|
||||||
|
m_started = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Thread::isRunning() {
|
||||||
|
return m_running;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Thread::sleep() {
|
||||||
|
svcSleepThread(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Thread::sleep(int t_milliseconds) {
|
||||||
|
svcSleepThread(1000000 * t_milliseconds);
|
||||||
|
}
|
||||||
|
|
||||||
|
// private methods
|
||||||
|
void Thread::threadFunction(void* arg) {
|
||||||
|
RenderD7::Thread::ThreadData data = *static_cast<RenderD7::Thread::ThreadData*>(arg);
|
||||||
|
data.m_function(data.m_parameter);
|
||||||
|
*data.m_running = false;
|
||||||
|
}
|
||||||
|
}
|
119
internal/thread.hpp
Normal file
119
internal/thread.hpp
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <3ds.h>
|
||||||
|
#include <atomic>
|
||||||
|
#include <functional>
|
||||||
|
#include <string>
|
||||||
|
#include "parameter.hpp"
|
||||||
|
|
||||||
|
using CTRU_Thread = Thread;
|
||||||
|
|
||||||
|
#define THREAD_STACK_SIZE 0x1000
|
||||||
|
|
||||||
|
namespace RenderD7 {
|
||||||
|
namespace Threads
|
||||||
|
{
|
||||||
|
inline bool threadrunning = false;
|
||||||
|
|
||||||
|
struct Thread
|
||||||
|
{
|
||||||
|
Handle handle;
|
||||||
|
void (*ep)(void);
|
||||||
|
bool finished;
|
||||||
|
void* stacktop;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool Create();
|
||||||
|
bool Join();
|
||||||
|
void Exit();
|
||||||
|
}
|
||||||
|
class Thread {
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Default constructor
|
||||||
|
* @note This should only be called when calling m3d::Thread::initialize() before calling m3d::Thread::start()
|
||||||
|
*/
|
||||||
|
Thread();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructs the thread
|
||||||
|
* @param t_function The thread function
|
||||||
|
* @param t_parameter The parameter to pass to the function
|
||||||
|
* @param t_autostart Whether the thread should start instantly
|
||||||
|
* @param t_detached Whether the thread starts detached or not
|
||||||
|
* @param t_stackSize The stacksize allocated for the thread in bytes (rounded to multiples of 8 bytes)
|
||||||
|
* @note t_function needs to be of type `void` and take one (and only one) parameter of type m3d::Parameter
|
||||||
|
* @warning If the thread priority is lower than the priority of the calling thread, the thread will never get executed. Use m3d::Thread::getCurrentPriority() to get the priority of the current thread
|
||||||
|
*/
|
||||||
|
Thread(std::function<void(RenderD7::Parameter)> t_function, RenderD7::Parameter t_parameter = nullptr, bool t_autostart = false, bool t_detached = false, unsigned long long int t_stackSize = 4 * 1024);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Destructs the thread
|
||||||
|
*/
|
||||||
|
virtual ~Thread();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initializes the thread
|
||||||
|
* @param t_function The thread function
|
||||||
|
* @param t_parameter The parameter to pass to the function
|
||||||
|
* @param t_autostart Whether the thread should start instantly
|
||||||
|
* @param t_detached Whether the thread starts detached or not
|
||||||
|
* @param t_stackSize The stacksize allocated for the thread in bytes (rounded to multiples of 8 bytes)
|
||||||
|
* @note t_function needs to be of type `void` and take one (and only one) parameter of type m3d::Parameter
|
||||||
|
* @warning If the thread priority is lower than the priority of the calling thread, the thread will never get executed. Use m3d::Thread::getCurrentPriority() to get the priority of the current thread
|
||||||
|
*/
|
||||||
|
void initialize(std::function<void(RenderD7::Parameter)> t_function, RenderD7::Parameter t_parameter = nullptr, bool t_autostart = false, bool t_detached = false, unsigned long long int t_stackSize = 4 * 1024);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets the size of the stack that gets allocated for the next thread that get's started
|
||||||
|
* @param t_stackSize The allocated space in bytes (rounded to multiples of 8 bytes)
|
||||||
|
*/
|
||||||
|
void setStackSize(unsigned long long int t_stackSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Starts the thread. To restart it, call Thread::join() before
|
||||||
|
* @param t_detached Whether the thread should start detached or not
|
||||||
|
*/
|
||||||
|
void start(bool t_detached = false);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Detaches the thread
|
||||||
|
*/
|
||||||
|
void kill();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Waits for the thread to finish
|
||||||
|
* @param t_timeout The timeout in nanoseconds. Leave it for no timeout
|
||||||
|
*/
|
||||||
|
void join(long long unsigned int t_timeout = U64_MAX);
|
||||||
|
|
||||||
|
bool isRunning();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Puts the thread to sleep
|
||||||
|
*
|
||||||
|
* This is needed if you have multiple threads running at the same time. It doesn't affect the execution-time of the thread, it just makes it possible for the other threads to get their chance to shine.
|
||||||
|
*/
|
||||||
|
static void sleep();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sleeps for the given time
|
||||||
|
* @param t_milliseconds The time to sleep in milliseconds
|
||||||
|
*/
|
||||||
|
static void sleep(int t_milliseconds);
|
||||||
|
|
||||||
|
private:
|
||||||
|
struct ThreadData {
|
||||||
|
RenderD7::Parameter m_parameter;
|
||||||
|
std::function<void(RenderD7::Parameter)> m_function;
|
||||||
|
std::atomic<bool>* m_running;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void threadFunction(void* t_arg);
|
||||||
|
/* data */
|
||||||
|
int m_priority, m_stackSize;
|
||||||
|
bool m_started;
|
||||||
|
std::atomic<bool> m_running;
|
||||||
|
RenderD7::Thread::ThreadData m_data;
|
||||||
|
CTRU_Thread m_thread;
|
||||||
|
};
|
||||||
|
}
|
17
internal/tween.hpp
Normal file
17
internal/tween.hpp
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#include "Clock.hpp"
|
||||||
|
|
||||||
|
namespace rnd7{
|
||||||
|
enum class TweenType : int {Position = 1, Color, Alpha};
|
||||||
|
|
||||||
|
enum class TweenLoop : int {None = 1, Loop = 2,};
|
||||||
|
|
||||||
|
enum class TweenDirection : int {Current, Forward, Backward};
|
||||||
|
|
||||||
|
enum class TweenState : int {Playing = 1, Stopped};
|
||||||
|
class Tween
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Tween(float from, float to, float duration, TweenLoop loop, TweenState state);
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
60
log.cpp
Normal file
60
log.cpp
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
#include "log.hpp"
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
std::string Log::format(const std::string& fmt_str, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
char* fp = NULL;
|
||||||
|
va_start(ap, fmt_str);
|
||||||
|
vasprintf(&fp, fmt_str.c_str(), ap);
|
||||||
|
va_end(ap);
|
||||||
|
std::unique_ptr<char, decltype(free)*> formatted(fp, free);
|
||||||
|
return std::string(formatted.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string Log::logDate(void)
|
||||||
|
{
|
||||||
|
time_t unixTime;
|
||||||
|
struct tm timeStruct;
|
||||||
|
time(&unixTime);
|
||||||
|
localtime_r(&unixTime, &timeStruct);
|
||||||
|
return format("%04i-%02i-%02i %02i:%02i:%02i", timeStruct.tm_year + 1900, timeStruct.tm_mon + 1, timeStruct.tm_mday,
|
||||||
|
timeStruct.tm_hour, timeStruct.tm_min, timeStruct.tm_sec);
|
||||||
|
}
|
||||||
|
|
||||||
|
Log::Log()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Log::Init(const char *filename)
|
||||||
|
{
|
||||||
|
std::string name = "logs/Log_" + Log::logDate() + filename + ".txt";
|
||||||
|
this->filename = name.c_str();
|
||||||
|
if ((access(name.c_str(), F_OK) == 0))
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FILE* logfile = fopen((name.c_str()), "w");
|
||||||
|
fclose(logfile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Log::Write(std::string debug_text)
|
||||||
|
{
|
||||||
|
std::ofstream logFile;
|
||||||
|
logFile.open((this->filename), std::ofstream::app);
|
||||||
|
std::string writeDebug = "[";
|
||||||
|
writeDebug += logDate();
|
||||||
|
writeDebug += "] ";
|
||||||
|
writeDebug += debug_text.c_str();
|
||||||
|
logFile << writeDebug << std::endl;
|
||||||
|
logFile.close();
|
||||||
|
}
|
||||||
|
Log::~Log()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
30
log.hpp
Normal file
30
log.hpp
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <fstream>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string>
|
||||||
|
#include <time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
/** Log Class */
|
||||||
|
class Log
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/** Construct */
|
||||||
|
Log();
|
||||||
|
/** Deconstruct */
|
||||||
|
~Log();
|
||||||
|
/// Init the log file
|
||||||
|
/// \param filename name for the file
|
||||||
|
void Init(const char *filename);
|
||||||
|
/// Write Text to logfile
|
||||||
|
/// \param debug_text your text
|
||||||
|
void Write(std::string debug_text);
|
||||||
|
/// Get the date
|
||||||
|
std::string logDate(void);
|
||||||
|
/// Format to logstyle
|
||||||
|
/// \param fmt_str the formatted style
|
||||||
|
std::string format(const std::string& fmt_str, ...);
|
||||||
|
private:
|
||||||
|
/// param filename the name of the logfile
|
||||||
|
std::string filename;
|
||||||
|
};
|
44
mkdocs.yaml
44
mkdocs.yaml
@ -1,44 +0,0 @@
|
|||||||
site_name: RenderD7 Docs
|
|
||||||
site_description:
|
|
||||||
theme:
|
|
||||||
name: material
|
|
||||||
custom_dir: docs/overrides
|
|
||||||
features:
|
|
||||||
- navigation.indexes
|
|
||||||
palette:
|
|
||||||
# Palette toggle for light mode
|
|
||||||
- scheme: default
|
|
||||||
primary: red
|
|
||||||
accent: red
|
|
||||||
toggle:
|
|
||||||
icon: material/brightness-7
|
|
||||||
name: Switch to dark mode
|
|
||||||
|
|
||||||
# Palette toggle for dark mode
|
|
||||||
- scheme: slate
|
|
||||||
primary: red
|
|
||||||
accent: red
|
|
||||||
toggle:
|
|
||||||
icon: material/brightness-4
|
|
||||||
name: Switch to light mode
|
|
||||||
|
|
||||||
markdown_extensions:
|
|
||||||
- def_list
|
|
||||||
- attr_list
|
|
||||||
- admonition
|
|
||||||
- pymdownx.details
|
|
||||||
- pymdownx.superfences
|
|
||||||
- pymdownx.arithmatex:
|
|
||||||
generic: true
|
|
||||||
- pymdownx.emoji:
|
|
||||||
emoji_index: !!python/name:materialx.emoji.twemoji
|
|
||||||
emoji_generator: !!python/name:materialx.emoji.to_svg
|
|
||||||
plugins:
|
|
||||||
- search
|
|
||||||
extra_css:
|
|
||||||
- stylesheets/doxide.css
|
|
||||||
extra_javascript:
|
|
||||||
- javascripts/mathjax.js
|
|
||||||
- https://polyfill.io/v3/polyfill.min.js?features=es6
|
|
||||||
- https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js
|
|
||||||
|
|
978
renderd7.cpp
Normal file
978
renderd7.cpp
Normal file
@ -0,0 +1,978 @@
|
|||||||
|
#include "renderd7.hpp"
|
||||||
|
#include "log.hpp"
|
||||||
|
#include <regex>
|
||||||
|
|
||||||
|
#define RGBA8(r, g, b, a) ((((r) & 0xFF) << 0) | (((g) & 0xFF) << 8) | (((b) & 0xFF) << 16) | (((a) & 0xFF) << 24))
|
||||||
|
#define D7_NOTHING C2D_Color32(0, 0, 0, 0)
|
||||||
|
#define CFGVER "0"
|
||||||
|
Log renderd7log;
|
||||||
|
float animtime;
|
||||||
|
bool isndspinit = false;
|
||||||
|
bool running = true;
|
||||||
|
std::stack<std::unique_ptr<RenderD7::Scene>> RenderD7::Scene::scenes;
|
||||||
|
//std::vector<RenderD7::Ovl> overlays;
|
||||||
|
bool usedbgmsg = false;
|
||||||
|
std::string dspststus = "Not Initialisized!";
|
||||||
|
|
||||||
|
int cobj___;
|
||||||
|
int maxobj__;
|
||||||
|
|
||||||
|
//INI::INIFile cfgfile;
|
||||||
|
std::unique_ptr<INI::INIFile> cfgfile = nullptr;
|
||||||
|
INI::INIStructure cfgstruct;
|
||||||
|
|
||||||
|
std::string D_app_name;
|
||||||
|
|
||||||
|
u32 d7_hDown;
|
||||||
|
u32 d7_hHeld;
|
||||||
|
u32 d7_hUp;
|
||||||
|
touchPosition d7_touch;
|
||||||
|
|
||||||
|
C2D_TextBuf TextBuf;
|
||||||
|
C2D_Font Font;
|
||||||
|
|
||||||
|
// Fps Calc
|
||||||
|
static float current_fps = 0.0f;
|
||||||
|
static unsigned int frames = 0;
|
||||||
|
static u64 last_time = 0;
|
||||||
|
float d11framerate = 0;
|
||||||
|
//-----------------
|
||||||
|
|
||||||
|
//Metrik-------------------------------------
|
||||||
|
u32 mt_color;
|
||||||
|
u32 mt_txtcolor;
|
||||||
|
|
||||||
|
int mt_screen;
|
||||||
|
//int mt_width = mt_screen ? 320 : 400;
|
||||||
|
float mt_txtSize;
|
||||||
|
bool metrikd = false;
|
||||||
|
double mt_fpsgraph[320];
|
||||||
|
//-------------------------------------------
|
||||||
|
bool currentScreen = false;
|
||||||
|
|
||||||
|
C3D_RenderTarget* Top;
|
||||||
|
C3D_RenderTarget* TopRight;
|
||||||
|
C3D_RenderTarget* Bottom;
|
||||||
|
|
||||||
|
#define DSEVENBLACK C2D_Color32(0, 0 ,0, 255)
|
||||||
|
#define DSEVENWHITE C2D_Color32(255, 255, 255, 255)
|
||||||
|
RenderD7::SpriteSheetAnimation::SpriteSheetAnimation()
|
||||||
|
{
|
||||||
|
renderd7log.Write("SpriteSheetAnimation createt!");
|
||||||
|
}
|
||||||
|
RenderD7::SpriteSheetAnimation::~SpriteSheetAnimation()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
bool RenderD7::DrawImageFromSheet(RenderD7::Sheet* sheet, size_t index, float x, float y, float scaleX, float scaleY)
|
||||||
|
{
|
||||||
|
if (sheet->spritesheet != nullptr)
|
||||||
|
{
|
||||||
|
if (C2D_SpriteSheetCount(sheet->spritesheet) >= index)
|
||||||
|
{
|
||||||
|
return C2D_DrawImageAt(C2D_SpriteSheetGetImage(sheet->spritesheet, index), x, y, 0.5f, nullptr, scaleX, scaleY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
void RenderD7::Init::NdspFirm(bool useit)
|
||||||
|
{
|
||||||
|
if (useit)
|
||||||
|
{
|
||||||
|
if ( access( "sdmc:/3ds/dspfirm.cdc", F_OK ) != -1 )
|
||||||
|
{
|
||||||
|
ndspInit();
|
||||||
|
isndspinit = true;
|
||||||
|
dspststus = "Initialisized success!";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dspststus = "Not found: dspfirm.cdc";
|
||||||
|
renderd7log.Write("RenderD7: SoundEngine Error! ndspfirm not found!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void RenderD7::Exit::NdspFirm()
|
||||||
|
{
|
||||||
|
if (isndspinit)
|
||||||
|
{
|
||||||
|
ndspExit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void RenderD7::Msg::Display(std::string titletxt, std::string subtext, C3D_RenderTarget *target)
|
||||||
|
{
|
||||||
|
C3D_FrameBegin(C3D_FRAME_SYNCDRAW);
|
||||||
|
C2D_TargetClear(Top, DSEVENBLACK);
|
||||||
|
C2D_TargetClear(Bottom, DSEVENBLACK);
|
||||||
|
RenderD7::ClearTextBufs();
|
||||||
|
RenderD7::OnScreen(Top);
|
||||||
|
RenderD7::DrawRect(0, 0, 400, 240, RenderD7::Color::Hex("#111111"));
|
||||||
|
RenderD7::OnScreen(Bottom);
|
||||||
|
RenderD7::DrawRect(0, 0, 320, 240, RenderD7::Color::Hex("#111111"));
|
||||||
|
RenderD7::OnScreen(target);
|
||||||
|
RenderD7::DrawRect(0, 0, 400, 26, RenderD7::Color::Hex("#333333", 200));
|
||||||
|
RenderD7::DrawText(5, 2, 0.7f, DSEVENWHITE, titletxt);
|
||||||
|
RenderD7::DrawText(5, 30, 0.6f, DSEVENWHITE, subtext);
|
||||||
|
|
||||||
|
C3D_FrameEnd(0);
|
||||||
|
}
|
||||||
|
void RenderD7::Msg::DisplayWithProgress(std::string titletext, std::string subtext, float current, float total, u32 prgbarcolor)
|
||||||
|
{
|
||||||
|
RenderD7::ClearTextBufs();
|
||||||
|
C3D_FrameBegin(C3D_FRAME_SYNCDRAW);
|
||||||
|
C2D_TargetClear(Top, DSEVENBLACK);
|
||||||
|
C2D_TargetClear(Bottom, DSEVENBLACK);
|
||||||
|
char str[256];
|
||||||
|
snprintf(str, sizeof(str), "(%.2f%%)", ((float)current/(float)total) * 100.0f);
|
||||||
|
RenderD7::OnScreen(Top);
|
||||||
|
RenderD7::DrawRect(0, 0, 400, 240, RenderD7::Color::Hex("#111111"));
|
||||||
|
RenderD7::DrawRect(0, 0, 400, 26, RenderD7::Color::Hex("#333333", 200));
|
||||||
|
RenderD7::DrawText(5, 2, 0.7f, DSEVENWHITE, titletext);
|
||||||
|
RenderD7::DrawText(5, 30, 0.6f, DSEVENWHITE, subtext);
|
||||||
|
RenderD7::DrawRect(30, 120, 342, 30, RenderD7::Color::Hex("#333333"));
|
||||||
|
RenderD7::DrawRect(31, 121, (int)(((float)current / (float)total) * 338.0f), 28, prgbarcolor);
|
||||||
|
RenderD7::DrawTextCentered(5, 124, 0.7f, RenderD7::Color::Hex("#111111"), str, 390);
|
||||||
|
RenderD7::OnScreen(Bottom);
|
||||||
|
RenderD7::DrawRect(0, 0, 320, 240, RenderD7::Color::Hex("#111111"));
|
||||||
|
|
||||||
|
C3D_FrameEnd(0);
|
||||||
|
}
|
||||||
|
void RenderD7::SetupLog()
|
||||||
|
{
|
||||||
|
renderd7log.Init("sdmc:/RenderD7.log");
|
||||||
|
}
|
||||||
|
void RenderD7::SpriteSheetAnimation::Setup(RenderD7::Sheet *sheet, size_t imagecount, size_t startimage, float frame_begin, float frame_finish)
|
||||||
|
{
|
||||||
|
D_totaltime = frame_begin;
|
||||||
|
renderd7log.Write("frame_begin success");
|
||||||
|
this->images = imagecount;
|
||||||
|
renderd7log.Write("imagecount success");
|
||||||
|
this->sheet = sheet;
|
||||||
|
renderd7log.Write("sheet success");
|
||||||
|
this->time = frame_finish;
|
||||||
|
renderd7log.Write("frame_finish success");
|
||||||
|
RenderD7::SpriteSheetAnimation::FromSheet(this->sheet, startimage);
|
||||||
|
}
|
||||||
|
void RenderD7::SpriteSheetAnimation::Play(float timespeed)
|
||||||
|
{
|
||||||
|
D_totaltime += timespeed;
|
||||||
|
if (D_totaltime >= time)
|
||||||
|
{
|
||||||
|
D_totaltime -= time;
|
||||||
|
imgs++;
|
||||||
|
if (imgs == images)
|
||||||
|
{
|
||||||
|
imgs = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RenderD7::SpriteSheetAnimation::FromSheet(sheet, imgs);
|
||||||
|
//RenderD7::SpriteSheetAnimation::Draw();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderD7::Error::DisplayError(std::string toptext, std::string errortext, int timesec)
|
||||||
|
{
|
||||||
|
RenderD7::ClearTextBufs();
|
||||||
|
C3D_FrameBegin(C3D_FRAME_SYNCDRAW);
|
||||||
|
C2D_TargetClear(Top, DSEVENBLACK);
|
||||||
|
C2D_TargetClear(Bottom, DSEVENBLACK);
|
||||||
|
RenderD7::OnScreen(Top);
|
||||||
|
RenderD7::DrawText(0, 0, 0.7f, DSEVENWHITE, toptext);
|
||||||
|
RenderD7::DrawText(0, 30, 0.6f, DSEVENWHITE, errortext);
|
||||||
|
C3D_FrameEnd(0);
|
||||||
|
int time = 60*timesec;
|
||||||
|
for (int i = 0; i < 60*timesec; i++) {
|
||||||
|
RenderD7::DrawRect(0, 236, (int)(((float)i / (float)60*timesec) * 400.0f), 4, RenderD7::Color::Hex("#00ff00"));
|
||||||
|
gspWaitForVBlank();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void RenderD7::Error::DisplayFatalError(std::string toptext, std::string errortext)
|
||||||
|
{
|
||||||
|
bool error___ = true;
|
||||||
|
RenderD7::ClearTextBufs();
|
||||||
|
C3D_FrameBegin(C3D_FRAME_SYNCDRAW);
|
||||||
|
C2D_TargetClear(Top, DSEVENBLACK);
|
||||||
|
C2D_TargetClear(Bottom, DSEVENBLACK);
|
||||||
|
RenderD7::OnScreen(Top);
|
||||||
|
RenderD7::DrawTextCentered(0, 0, 0.7f, DSEVENWHITE, toptext, 400);
|
||||||
|
RenderD7::DrawTextCentered(0, 100, 0.6f, DSEVENWHITE, errortext, 400);
|
||||||
|
RenderD7::DrawTextCentered(0, 200, 0.6f, DSEVENWHITE, "Press Start to Exit!", 400);
|
||||||
|
C3D_FrameEnd(0);
|
||||||
|
while (error___)
|
||||||
|
{
|
||||||
|
if(d7_hDown & KEY_START)
|
||||||
|
{
|
||||||
|
RenderD7::ExitApp();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
u32 RenderD7::Color::Hex(const std::string color, u8 a)
|
||||||
|
{
|
||||||
|
if (color.length() < 7 || std::regex_search(color.substr(1), std::regex("[^0-9A-Fa-f]"))) { // invalid color.
|
||||||
|
return D7_NOTHING;
|
||||||
|
}
|
||||||
|
int r = std::stoi(color.substr(1, 2), nullptr, 16);
|
||||||
|
int g = std::stoi(color.substr(3, 2), nullptr, 16);
|
||||||
|
int b = std::stoi(color.substr(5, 2), nullptr, 16);
|
||||||
|
return RGBA8(r, g, b, a);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderD7::Scene::doDraw() {
|
||||||
|
if(!RenderD7::Scene::scenes.empty())
|
||||||
|
RenderD7::Scene::scenes.top()->Draw();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderD7::Scene::doLogic(u32 hDown, u32 hHeld, u32 hUp, touchPosition touch) {
|
||||||
|
if(!RenderD7::Scene::scenes.empty())
|
||||||
|
RenderD7::Scene::scenes.top()->Logic(hDown, hHeld, hUp, touch);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderD7::Scene::Load(std::unique_ptr<Scene> scene)
|
||||||
|
{
|
||||||
|
Scene::scenes.push(std::move(scene));
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderD7::Scene::Back() {
|
||||||
|
if(RenderD7::Scene::scenes.size() > 0)
|
||||||
|
RenderD7::Scene::scenes.pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderD7::OnScreen(C3D_RenderTarget *target)
|
||||||
|
{
|
||||||
|
C2D_SceneBegin(target);
|
||||||
|
}
|
||||||
|
|
||||||
|
void frameloop()
|
||||||
|
{
|
||||||
|
frames++;
|
||||||
|
u64 delta_time = osGetTime() - last_time;
|
||||||
|
if (delta_time >= 1000) {
|
||||||
|
current_fps = frames/(delta_time/1000.0f)+1;
|
||||||
|
frames = 0;
|
||||||
|
last_time = osGetTime();
|
||||||
|
}
|
||||||
|
d11framerate = current_fps;
|
||||||
|
mt_fpsgraph[320] = current_fps;
|
||||||
|
}
|
||||||
|
float getframerate()
|
||||||
|
{
|
||||||
|
return d11framerate;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string RenderD7::GetFramerate()
|
||||||
|
{
|
||||||
|
return (std::to_string((int)d11framerate).substr(0, 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RenderD7::MainLoop()
|
||||||
|
{
|
||||||
|
if (!aptMainLoop()) return false;
|
||||||
|
hidScanInput();
|
||||||
|
d7_hDown = hidKeysDown();
|
||||||
|
d7_hUp = hidKeysUp();
|
||||||
|
d7_hHeld = hidKeysHeld();
|
||||||
|
hidTouchRead(&d7_touch);
|
||||||
|
|
||||||
|
RenderD7::ClearTextBufs();
|
||||||
|
C3D_FrameBegin(C3D_FRAME_SYNCDRAW);
|
||||||
|
|
||||||
|
C2D_TargetClear(Top, C2D_Color32(0, 0, 0, 0));
|
||||||
|
C2D_TargetClear(Bottom, C2D_Color32(0, 0, 0, 0));
|
||||||
|
frameloop();
|
||||||
|
RenderD7::Scene::doDraw();
|
||||||
|
RenderD7::Scene::doLogic(d7_hDown, d7_hHeld, d7_hUp, d7_touch);
|
||||||
|
|
||||||
|
//if (metrikd)RenderD7::DrawMetrikOvl();
|
||||||
|
return running;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
RenderD7::Sheet::Sheet()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
RenderD7::Sheet::~Sheet()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
Result RenderD7::Sheet::Load(const char *path)
|
||||||
|
{
|
||||||
|
this->spritesheet = C2D_SpriteSheetLoad(path);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderD7::Sheet::Free()
|
||||||
|
{
|
||||||
|
C2D_SpriteSheetFree(this->spritesheet);
|
||||||
|
}
|
||||||
|
|
||||||
|
RenderD7::Sprite::Sprite()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
RenderD7::Sprite::~Sprite()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
void RenderD7::Sprite::FromSheet(RenderD7::Sheet *sheet, size_t index)
|
||||||
|
{
|
||||||
|
C2D_SpriteFromSheet(&this->sprite, sheet->spritesheet, index);
|
||||||
|
}
|
||||||
|
bool RenderD7::Sprite::Draw()
|
||||||
|
{
|
||||||
|
return C2D_DrawSprite(&this->sprite);
|
||||||
|
}
|
||||||
|
void RenderD7::Sprite::SetCenter(float x, float y)
|
||||||
|
{
|
||||||
|
C2D_SpriteSetCenter(&this->sprite, x, y);
|
||||||
|
}
|
||||||
|
void RenderD7::Sprite::SetPos(float x, float y)
|
||||||
|
{
|
||||||
|
C2D_SpriteSetPos(&this->sprite, x, y);
|
||||||
|
}
|
||||||
|
void RenderD7::Sprite::SetRotation(float rotation)
|
||||||
|
{
|
||||||
|
C2D_SpriteSetRotation(&this->sprite, rotation);
|
||||||
|
}
|
||||||
|
void RenderD7::Sprite::Rotate(float speed)
|
||||||
|
{
|
||||||
|
C2D_SpriteRotateDegrees(&this->sprite, speed);
|
||||||
|
}
|
||||||
|
float RenderD7::Sprite::getHeigh()
|
||||||
|
{
|
||||||
|
return this->sprite.params.pos.h;
|
||||||
|
}
|
||||||
|
float RenderD7::Sprite::getWidth()
|
||||||
|
{
|
||||||
|
return this->sprite.params.pos.w;
|
||||||
|
}
|
||||||
|
float RenderD7::Sprite::getPosX()
|
||||||
|
{
|
||||||
|
return this->sprite.params.pos.x;
|
||||||
|
}
|
||||||
|
float RenderD7::Sprite::getPosY()
|
||||||
|
{
|
||||||
|
return this->sprite.params.pos.y;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderD7::Sprite::FromImage(RenderD7::Image *img)
|
||||||
|
{
|
||||||
|
C2D_SpriteFromImage(&this->sprite, img->img);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderD7::Sprite::SetScale(float x, float y)
|
||||||
|
{
|
||||||
|
C2D_SpriteScale(&this->sprite, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderD7::ClearTextBufs(void)
|
||||||
|
{
|
||||||
|
C2D_TextBufClear(TextBuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RenderD7::DrawRect(float x, float y, float w, float h, u32 color)
|
||||||
|
{
|
||||||
|
return C2D_DrawRectSolid(x, y, 0.5f, w, h, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RenderD7::DrawPx(float x, float y, u32 color)
|
||||||
|
{
|
||||||
|
return C2D_DrawRectSolid(x, y, 0.5f, 1, 1, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderD7::DrawTextCentered(float x, float y, float size, u32 color, std::string Text, int maxWidth, int maxHeight, C2D_Font fnt) {
|
||||||
|
float lineHeight, widthScale;
|
||||||
|
|
||||||
|
// Check for the lineHeight.
|
||||||
|
if (fnt != nullptr) {
|
||||||
|
lineHeight = RenderD7::GetTextHeight(size, " ", fnt);
|
||||||
|
} else {
|
||||||
|
lineHeight = RenderD7::GetTextHeight(size, " ");
|
||||||
|
}
|
||||||
|
|
||||||
|
int line = 0;
|
||||||
|
while(Text.find('\n') != Text.npos) {
|
||||||
|
if (maxWidth == 0) {
|
||||||
|
// Do the widthScale.
|
||||||
|
if (fnt != nullptr) {
|
||||||
|
widthScale = RenderD7::GetTextWidth(size, Text.substr(0, Text.find('\n')), fnt);
|
||||||
|
} else {
|
||||||
|
widthScale = RenderD7::GetTextWidth(size, Text.substr(0, Text.find('\n')));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Do the widthScale 2.
|
||||||
|
if (fnt != nullptr) {
|
||||||
|
widthScale = std::min((float)maxWidth, RenderD7::GetTextWidth(size, Text.substr(0, Text.find('\n')), fnt));
|
||||||
|
} else {
|
||||||
|
widthScale = std::min((float)maxWidth, RenderD7::GetTextWidth(size, Text.substr(0, Text.find('\n'))));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (fnt != nullptr) {
|
||||||
|
RenderD7::DrawText((currentScreen ? 200 : 160)+x-(widthScale/2), y+(lineHeight*line), size, color, Text.substr(0, Text.find('\n')), maxWidth, maxHeight, fnt);
|
||||||
|
} else {
|
||||||
|
RenderD7::DrawText((currentScreen ? 200 : 160)+x-(widthScale/2), y+(lineHeight*line), size, color, Text.substr(0, Text.find('\n')), maxWidth, maxHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
Text = Text.substr(Text.find('\n')+1);
|
||||||
|
line++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (maxWidth == 0) {
|
||||||
|
// Do the next WidthScale.
|
||||||
|
if (fnt != nullptr) {
|
||||||
|
widthScale = RenderD7::GetTextWidth(size, Text.substr(0, Text.find('\n')), fnt);
|
||||||
|
} else {
|
||||||
|
widthScale = RenderD7::GetTextWidth(size, Text.substr(0, Text.find('\n')));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// And again.
|
||||||
|
if (fnt != nullptr) {
|
||||||
|
widthScale = std::min((float)maxWidth, RenderD7::GetTextWidth(size, Text.substr(0, Text.find('\n')), fnt));
|
||||||
|
} else {
|
||||||
|
widthScale = std::min((float)maxWidth, RenderD7::GetTextWidth(size, Text.substr(0, Text.find('\n'))));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (fnt != nullptr) {
|
||||||
|
RenderD7::DrawText((currentScreen ? 200 : 160)+x-(widthScale/2), y+(lineHeight*line), size, color, Text.substr(0, Text.find('\n')), maxWidth, maxHeight, fnt);
|
||||||
|
} else {
|
||||||
|
RenderD7::DrawText((currentScreen ? 200 : 160)+x-(widthScale/2), y+(lineHeight*line), size, color, Text.substr(0, Text.find('\n')), maxWidth, maxHeight);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw String or Text.
|
||||||
|
void RenderD7::DrawText(float x, float y, float size, u32 color, std::string Text, int maxWidth, int maxHeight, C2D_Font fnt) {
|
||||||
|
C2D_Text c2d_text;
|
||||||
|
|
||||||
|
if (fnt != nullptr) {
|
||||||
|
C2D_TextFontParse(&c2d_text, fnt, TextBuf, Text.c_str());
|
||||||
|
} else {
|
||||||
|
C2D_TextFontParse(&c2d_text, Font, TextBuf, Text.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
C2D_TextOptimize(&c2d_text);
|
||||||
|
|
||||||
|
float heightScale;
|
||||||
|
if (maxHeight == 0) {
|
||||||
|
heightScale = size;
|
||||||
|
} else {
|
||||||
|
if (fnt != nullptr) {
|
||||||
|
heightScale = std::min(size, size*(maxHeight/RenderD7::GetTextHeight(size, Text, fnt)));
|
||||||
|
} else {
|
||||||
|
heightScale = std::min(size, size*(maxHeight/RenderD7::GetTextHeight(size, Text)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (maxWidth == 0) {
|
||||||
|
C2D_DrawText(&c2d_text, C2D_WithColor, x, y, 0.5f, size, heightScale, color);
|
||||||
|
} else {
|
||||||
|
if (fnt != nullptr) {
|
||||||
|
C2D_DrawText(&c2d_text, C2D_WithColor, x, y, 0.5f, std::min(size, size*(maxWidth/RenderD7::GetTextWidth(size, Text, fnt))), heightScale, color);
|
||||||
|
} else {
|
||||||
|
C2D_DrawText(&c2d_text, C2D_WithColor, x, y, 0.5f, std::min(size, size*(maxWidth/RenderD7::GetTextWidth(size, Text))), heightScale, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void RenderD7::DrawTextLeft(float x, float y, float size, u32 color, std::string Text, int maxWidth, int maxHeight, C2D_Font fnt)
|
||||||
|
{
|
||||||
|
RenderD7::DrawText(x - RenderD7::GetTextWidth(size, Text, fnt), y, size, color, Text, maxWidth, maxHeight, fnt);
|
||||||
|
}
|
||||||
|
// Get String or Text Width.
|
||||||
|
float RenderD7::GetTextWidth(float size, std::string Text, C2D_Font fnt) {
|
||||||
|
float width = 0;
|
||||||
|
if (fnt != nullptr) {
|
||||||
|
GetTextSize(size, &width, NULL, Text, fnt);
|
||||||
|
} else {
|
||||||
|
GetTextSize(size, &width, NULL, Text);
|
||||||
|
}
|
||||||
|
return width;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get String or Text Size.
|
||||||
|
void RenderD7::GetTextSize(float size, float *width, float *height, std::string Text, C2D_Font fnt) {
|
||||||
|
C2D_Text c2d_text;
|
||||||
|
if (fnt != nullptr) {
|
||||||
|
C2D_TextFontParse(&c2d_text, fnt, TextBuf, Text.c_str());
|
||||||
|
} else {
|
||||||
|
C2D_TextFontParse(&c2d_text, Font, TextBuf, Text.c_str());
|
||||||
|
}
|
||||||
|
C2D_TextGetDimensions(&c2d_text, size, size, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Get String or Text Height.
|
||||||
|
float RenderD7::GetTextHeight(float size, std::string Text, C2D_Font fnt) {
|
||||||
|
float height = 0;
|
||||||
|
if (fnt != nullptr) {
|
||||||
|
GetTextSize(size, NULL, &height, Text.c_str(), fnt);
|
||||||
|
} else {
|
||||||
|
GetTextSize(size, NULL, &height, Text.c_str());
|
||||||
|
}
|
||||||
|
return height;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result RenderD7::loadFont(C2D_Font &fnt, const char* Path) {
|
||||||
|
fnt = C2D_FontLoad(Path); // Only load if found.
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unload a Font.
|
||||||
|
Result RenderD7::unloadFont(C2D_Font &fnt) {
|
||||||
|
if (fnt != nullptr) {
|
||||||
|
C2D_FontFree(fnt); // Make sure to only unload if not nullptr.
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RenderD7::DrawCircle(float x, float y, float radius, u32 color)
|
||||||
|
{
|
||||||
|
return C2D_DrawCircleSolid(x, y, 0.5f, radius, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MetrikThread(RenderD7::Parameter param) {
|
||||||
|
while (true) {
|
||||||
|
RenderD7::DrawMetrikOvl();
|
||||||
|
RenderD7::Thread::sleep(1000 * 1); // wait; also, this is needed to allow for concurrency (refer to the documentation for m3d::Thread::sleep())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Result RenderD7::Init::Main(std::string app_name)
|
||||||
|
{
|
||||||
|
gfxInitDefault();
|
||||||
|
aptInit();
|
||||||
|
romfsInit();
|
||||||
|
cfguInit();
|
||||||
|
if (cobj___){maxobj__ = cobj___;}
|
||||||
|
if (!cobj___){maxobj__ = C2D_DEFAULT_MAX_OBJECTS;}
|
||||||
|
D_app_name = app_name;
|
||||||
|
std::string cfgpath = "sdmc:/RenderD7/Apps/";
|
||||||
|
cfgpath += D_app_name;
|
||||||
|
mkdir("sdmc:/RenderD7/", 0777);
|
||||||
|
mkdir("sdmc:/RenderD7/Apps", 0777);
|
||||||
|
mkdir(cfgpath.c_str(), 0777);
|
||||||
|
bool renew = false;
|
||||||
|
if (FS::FileExist(cfgpath + "/config.ini"))
|
||||||
|
{
|
||||||
|
cfgfile = std::make_unique<INI::INIFile>(cfgpath + "/config.ini");
|
||||||
|
cfgfile->read(cfgstruct);
|
||||||
|
std::string version = cfgstruct["info"]["version"];
|
||||||
|
if (version != CFGVER) renew = true;
|
||||||
|
}
|
||||||
|
if (!FS::FileExist(cfgpath + "/config.ini") || renew)
|
||||||
|
{
|
||||||
|
cfgfile = std::make_unique<INI::INIFile>(cfgpath+ "/config.ini");
|
||||||
|
cfgfile->read(cfgstruct);
|
||||||
|
cfgstruct["info"]["version"] = CFGVER;
|
||||||
|
cfgstruct["info"]["renderd7ver"] = RENDERD7VSTRING;
|
||||||
|
cfgstruct["settings"]["doscreentimeout"] = "0";
|
||||||
|
cfgstruct["settings"]["forcetimeoutLB"] = "1";
|
||||||
|
cfgstruct["settings"]["forceFrameRate"] = "60";
|
||||||
|
cfgstruct["settings"]["super-reselution"] = "0";
|
||||||
|
cfgstruct["metrik-settings"]["enableoverlay"] = "0";
|
||||||
|
cfgstruct["metrik-settings"]["Screen"] = "0";
|
||||||
|
cfgstruct["metrik-settings"]["txtColor"] = "#ffffff";
|
||||||
|
cfgstruct["metrik-settings"]["txtColorA"] = "255";
|
||||||
|
cfgstruct["metrik-settings"]["ColorA"] = "255";
|
||||||
|
cfgstruct["metrik-settings"]["Color"] = "#000000";
|
||||||
|
cfgstruct["metrik-settings"]["txtSize"] = "0.7f";
|
||||||
|
cfgfile->write(cfgstruct);
|
||||||
|
}
|
||||||
|
cfgfile = std::make_unique<INI::INIFile>(cfgpath+ "/config.ini");
|
||||||
|
cfgfile->read(cfgstruct);
|
||||||
|
std::string Fps = cfgstruct["settings"]["forceFrameRate"];
|
||||||
|
C3D_FrameRate(RenderD7::Convert::StringtoFloat(Fps));
|
||||||
|
metrikd = RenderD7::Convert::FloatToBool(RenderD7::Convert::StringtoFloat(cfgstruct["metrik-settings"]["enableoverlay"]));
|
||||||
|
mt_txtcolor = RenderD7::Color::Hex(cfgstruct["metrik-settings"]["txtColor"], (u8)RenderD7::Convert::StringtoFloat(cfgstruct["metrik-settings"]["txtColorA"]));
|
||||||
|
mt_color = RenderD7::Color::Hex(cfgstruct["metrik-settings"]["Color"], (u8)RenderD7::Convert::StringtoFloat(cfgstruct["metrik-settings"]["ColorA"]));
|
||||||
|
mt_txtSize = RenderD7::Convert::StringtoFloat(cfgstruct["metrik-settings"]["txtSize"]);
|
||||||
|
mt_screen = RenderD7::Convert::StringtoInt(cfgstruct["metrik-settings"]["Screen"]);
|
||||||
|
|
||||||
|
osSetSpeedupEnable(true);
|
||||||
|
|
||||||
|
C3D_Init(C3D_DEFAULT_CMDBUF_SIZE);
|
||||||
|
C2D_Init(size_t(maxobj__));
|
||||||
|
C2D_Prepare();
|
||||||
|
Top = C2D_CreateScreenTarget(GFX_TOP, GFX_LEFT);
|
||||||
|
TopRight = C2D_CreateScreenTarget(GFX_TOP, GFX_RIGHT);
|
||||||
|
Bottom = C2D_CreateScreenTarget(GFX_BOTTOM, GFX_LEFT);
|
||||||
|
TextBuf = C2D_TextBufNew(4096);
|
||||||
|
Font = C2D_FontLoadSystem(CFG_REGION_USA);
|
||||||
|
//RenderD7::Msg::Display("RenderD7", "RenderD7 init success!\nWaiting for MainLoop!", Top);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
void RenderD7::Exit::Main()
|
||||||
|
{
|
||||||
|
cfgfile->write(cfgstruct);
|
||||||
|
if (RenderD7::Threads::threadrunning) RenderD7::Threads::Exit();
|
||||||
|
C2D_TextBufDelete(TextBuf);
|
||||||
|
C2D_Fini();
|
||||||
|
C3D_Fini();
|
||||||
|
aptExit();
|
||||||
|
gfxExit();
|
||||||
|
romfsExit();
|
||||||
|
cfguExit();
|
||||||
|
romfsExit();
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderD7::DrawTObjects(std::vector<RenderD7::TObject> tobjects, u32 color, u32 txtcolor, int selection, u32 selbgcolor, u32 selcolor)
|
||||||
|
{
|
||||||
|
for(int i = 0; i < (int)tobjects.size(); i++)
|
||||||
|
{
|
||||||
|
if (selection == i)
|
||||||
|
{
|
||||||
|
RenderD7::DrawRect(tobjects[i].x - 2, tobjects[i].y - 2, tobjects[i].w + 4, tobjects[i].h + 4, selbgcolor);
|
||||||
|
RenderD7::DrawRect(tobjects[i].x, tobjects[i].y, tobjects[i].w, tobjects[i].h, color);
|
||||||
|
RenderD7::DrawRect(tobjects[i].x, tobjects[i].y, tobjects[i].w, tobjects[i].h, selcolor);
|
||||||
|
RenderD7::DrawText(tobjects[i].x + (tobjects[i].w/2) - RenderD7::GetTextHeight(tobjects[i].txtsize , tobjects[i].text) + tobjects[i].correctx, tobjects[i].y + (tobjects[i].h/2) - RenderD7::GetTextHeight(tobjects[i].txtsize, tobjects[i].text) + tobjects[i].correcty, tobjects[i].txtsize, txtcolor, tobjects[i].text);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
RenderD7::DrawRect(tobjects[i].x, tobjects[i].y - 1, tobjects[i].w, tobjects[i].h, color);
|
||||||
|
RenderD7::DrawText(tobjects[i].x + (tobjects[i].w/2) - RenderD7::GetTextHeight(tobjects[i].txtsize , tobjects[i].text) + tobjects[i].correctx, tobjects[i].y + (tobjects[i].h/2) - RenderD7::GetTextHeight(tobjects[i].txtsize, tobjects[i].text) + tobjects[i].correcty, tobjects[i].txtsize, txtcolor, tobjects[i].text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderD7::DrawTLBtns(std::vector<RenderD7::TLBtn> btns, u32 color, int selection, u32 selbgcolor, u32 selcolor)
|
||||||
|
{
|
||||||
|
for(int i = 0; i < (int)btns.size(); i++)
|
||||||
|
{
|
||||||
|
if (selection == i)
|
||||||
|
{
|
||||||
|
RenderD7::DrawRect(btns[i].x - 2, btns[i].y - 2, btns[i].w + 4, btns[i].h + 4, selbgcolor);
|
||||||
|
RenderD7::DrawRect(btns[i].x, btns[i].y, btns[i].w, btns[i].h, color);
|
||||||
|
RenderD7::DrawRect(btns[i].x, btns[i].y, btns[i].w, btns[i].h, selcolor);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
RenderD7::DrawRect(btns[i].x, btns[i].y - 1, btns[i].w, btns[i].h, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderD7::ExitApp()
|
||||||
|
{
|
||||||
|
running = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RenderD7::touchTObj(touchPosition touch, RenderD7::TObject button)
|
||||||
|
{
|
||||||
|
if (touch.px >= button.x && touch.px <= (button.x + button.w) && touch.py >= button.y && touch.py <= (button.y + button.h)) return true;
|
||||||
|
else return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int RenderD7::GetRandomInt(int b, int e)
|
||||||
|
{
|
||||||
|
std::default_random_engine generator;
|
||||||
|
std::uniform_int_distribution<int> distribution(b, e);
|
||||||
|
int r = distribution(generator);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderD7::DrawSTObject(std::vector<RenderD7::TObject> tobject, int tobjectindex, u32 color, u32 txtcolor)
|
||||||
|
{
|
||||||
|
RenderD7::DrawRect(tobject[tobjectindex].x, tobject[tobjectindex].y, tobject[tobjectindex].w, tobject[tobjectindex].h, color);
|
||||||
|
RenderD7::DrawText(tobject[tobjectindex].x + (tobject[tobjectindex].w/2) - RenderD7::GetTextHeight(tobject[tobjectindex].txtsize , tobject[tobjectindex].text) + tobject[tobjectindex].correctx, tobject[tobjectindex].y + (tobject[tobjectindex].h/2) - RenderD7::GetTextHeight(tobject[tobjectindex].txtsize, tobject[tobjectindex].text) + tobject[tobjectindex].correcty, tobject[tobjectindex].txtsize, txtcolor, tobject[tobjectindex].text);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RenderD7::NameIsEndingWith(const std::string &name, const std::vector<std::string> &extensions) {
|
||||||
|
if (name.substr(0, 2) == "._") return false;
|
||||||
|
|
||||||
|
if (name.size() == 0) return false;
|
||||||
|
|
||||||
|
if (extensions.size() == 0) return true;
|
||||||
|
|
||||||
|
for(int i = 0; i < (int)extensions.size(); i++) {
|
||||||
|
const std::string ext = extensions.at(i);
|
||||||
|
if (strcasecmp(name.c_str() + name.size() - ext.size(), ext.c_str()) == 0) return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool dirEntryPredicate(const RenderD7::DirContent &lhs, const RenderD7::DirContent &rhs) {
|
||||||
|
if (!lhs.isDir && rhs.isDir) return false;
|
||||||
|
if (lhs.isDir && !rhs.isDir) return true;
|
||||||
|
|
||||||
|
return strcasecmp(lhs.name.c_str(), rhs.name.c_str()) < 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderD7::GetDirContentsExt(std::vector<RenderD7::DirContent> &dircontent, const std::vector<std::string> &extensions) {
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
dircontent.clear();
|
||||||
|
|
||||||
|
DIR *pdir = opendir(".");
|
||||||
|
|
||||||
|
if (pdir != nullptr) {
|
||||||
|
while(true) {
|
||||||
|
RenderD7::DirContent dirEntry;
|
||||||
|
|
||||||
|
struct dirent *pent = readdir(pdir);
|
||||||
|
if (pent == NULL) break;
|
||||||
|
|
||||||
|
stat(pent->d_name, &st);
|
||||||
|
dirEntry.name = pent->d_name;
|
||||||
|
dirEntry.isDir = (st.st_mode & S_IFDIR) ? true : false;
|
||||||
|
|
||||||
|
if (dirEntry.name.compare(".") != 0 && (dirEntry.isDir || RenderD7::NameIsEndingWith(dirEntry.name, extensions))) {
|
||||||
|
dircontent.push_back(dirEntry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
closedir(pdir);
|
||||||
|
}
|
||||||
|
sort(dircontent.begin(), dircontent.end(), dirEntryPredicate);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderD7::GetDirContents(std::vector<RenderD7::DirContent> &dircontent) {
|
||||||
|
RenderD7::GetDirContentsExt(dircontent, {});
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderD7::Image::LoadPng(const std::string path)
|
||||||
|
{
|
||||||
|
if (usedbgmsg)
|
||||||
|
{
|
||||||
|
RenderD7::Msg::Display("RenderD7", "Loading Png:" + path, Top);
|
||||||
|
}
|
||||||
|
std::vector<u8> ImageBuffer;
|
||||||
|
unsigned width, height;
|
||||||
|
if (loadet)
|
||||||
|
{
|
||||||
|
C3D_TexDelete(this->img.tex);
|
||||||
|
}
|
||||||
|
lodepng::decode(ImageBuffer, width, height, path);
|
||||||
|
|
||||||
|
this->img.tex = new C3D_Tex;
|
||||||
|
this->img.subtex = new Tex3DS_SubTexture({(u16)width, (u16)height, 0.0f, 1.0f, width / 1024.0f, 1.0f - (height / 1024.0f)});
|
||||||
|
|
||||||
|
C3D_TexInit(this->img.tex, 1024, 1024, GPU_RGBA8);
|
||||||
|
C3D_TexSetFilter(this->img.tex, GPU_LINEAR, GPU_LINEAR);
|
||||||
|
this->img.tex->border = 0xFFFFFFFF;
|
||||||
|
C3D_TexSetWrap(this->img.tex, GPU_CLAMP_TO_BORDER, GPU_CLAMP_TO_BORDER);
|
||||||
|
|
||||||
|
for (u32 x = 0; x < width && x < 1024; x++) {
|
||||||
|
for (u32 y = 0; y < height && y < 1024; y++) {
|
||||||
|
const u32 dstPos = ((((y >> 3) * (1024 >> 3) + (x >> 3)) << 6) +
|
||||||
|
((x & 1) | ((y & 1) << 1) | ((x & 2) << 1) | ((y & 2) << 2) |
|
||||||
|
((x & 4) << 2) | ((y & 4) << 3))) * 4;
|
||||||
|
|
||||||
|
const u32 srcPos = (y * width + x) * 4;
|
||||||
|
((uint8_t *)this->img.tex->data)[dstPos + 0] = ImageBuffer.data()[srcPos + 3];
|
||||||
|
((uint8_t *)this->img.tex->data)[dstPos + 1] = ImageBuffer.data()[srcPos + 2];
|
||||||
|
((uint8_t *)this->img.tex->data)[dstPos + 2] = ImageBuffer.data()[srcPos + 1];
|
||||||
|
((uint8_t *)this->img.tex->data)[dstPos + 3] = ImageBuffer.data()[srcPos + 0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
loadet = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderD7::Image::LoadPFromBuffer(const std::vector<u8> &buffer)
|
||||||
|
{
|
||||||
|
std::vector<u8> ImageBuffer;
|
||||||
|
if (loadet)
|
||||||
|
{
|
||||||
|
C3D_TexDelete(this->img.tex);
|
||||||
|
}
|
||||||
|
unsigned width, height;
|
||||||
|
lodepng::decode(ImageBuffer, width, height, buffer);
|
||||||
|
|
||||||
|
img.tex = new C3D_Tex;
|
||||||
|
img.subtex = new Tex3DS_SubTexture({(u16)width, (u16)height, 0.0f, 1.0f, width / 512.0f, 1.0f - (height / 512.0f)});
|
||||||
|
|
||||||
|
C3D_TexInit(img.tex, 512, 512, GPU_RGBA8);
|
||||||
|
C3D_TexSetFilter(img.tex, GPU_LINEAR, GPU_LINEAR);
|
||||||
|
img.tex->border = 0xFFFFFFFF;
|
||||||
|
C3D_TexSetWrap(img.tex, GPU_CLAMP_TO_BORDER, GPU_CLAMP_TO_BORDER);
|
||||||
|
|
||||||
|
for (u32 x = 0; x < width && x < 512; x++) {
|
||||||
|
for (u32 y = 0; y < height && y < 512; y++) {
|
||||||
|
const u32 dstPos = ((((y >> 3) * (512 >> 3) + (x >> 3)) << 6) +
|
||||||
|
((x & 1) | ((y & 1) << 1) | ((x & 2) << 1) | ((y & 2) << 2) |
|
||||||
|
((x & 4) << 2) | ((y & 4) << 3))) * 4;
|
||||||
|
|
||||||
|
const u32 srcPos = (y * width + x) * 4;
|
||||||
|
((uint8_t *)img.tex->data)[dstPos + 0] = ImageBuffer.data()[srcPos + 3];
|
||||||
|
((uint8_t *)img.tex->data)[dstPos + 1] = ImageBuffer.data()[srcPos + 2];
|
||||||
|
((uint8_t *)img.tex->data)[dstPos + 2] = ImageBuffer.data()[srcPos + 1];
|
||||||
|
((uint8_t *)img.tex->data)[dstPos + 3] = ImageBuffer.data()[srcPos + 0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RenderD7::DrawImage(C2D_Image img, float x, float y, float scaleX, float scaleY)
|
||||||
|
{
|
||||||
|
return C2D_DrawImageAt(img, x, y, 0.5f, nullptr, scaleX, scaleY);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RenderD7::Image::Draw(float x, float y, float scaleX, float scaleY)
|
||||||
|
{
|
||||||
|
return C2D_DrawImageAt(this->img, x, y, 0.5f, nullptr, scaleX, scaleY);
|
||||||
|
}
|
||||||
|
bool RenderD7::FS::FileExist(const std::string& path)
|
||||||
|
{
|
||||||
|
FILE *test = fopen(path.c_str(), "r");
|
||||||
|
if(test != NULL)
|
||||||
|
{
|
||||||
|
fclose(test);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RenderD7::IsNdspInit()
|
||||||
|
{
|
||||||
|
if (isndspinit)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderD7::DrawList1(RenderD7::ScrollList1 &l, float txtsize, C3D_RenderTarget *t)
|
||||||
|
{
|
||||||
|
RenderD7::OnScreen(t);
|
||||||
|
RenderD7::DrawRect(0, 0, 400, 240, RenderD7::Color::Hex("#dddddd"));
|
||||||
|
RenderD7::DrawText(0, 0, 0.8f, RenderD7::Color::Hex("#ffffff"), l.Text);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderD7::DrawMetrikOvl()
|
||||||
|
{
|
||||||
|
switch (mt_screen)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
RenderD7::OnScreen(Top);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
RenderD7::OnScreen(Bottom);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
RenderD7::OnScreen(Bottom);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
RenderD7::DrawText(0, 0, mt_txtSize, mt_txtcolor, "FPS: " + RenderD7::GetFramerate());
|
||||||
|
RenderD7::DrawText(0, 50, mt_txtSize, mt_txtcolor, "CPU: " + std::to_string(C3D_GetProcessingTime()*6.0f) + "%/" + std::to_string(C3D_GetProcessingTime()));
|
||||||
|
RenderD7::DrawText(0, 70, mt_txtSize, mt_txtcolor, "GPU: " + std::to_string(C3D_GetDrawingTime()*6.0f) + "%/" + std::to_string(C3D_GetDrawingTime()));
|
||||||
|
RenderD7::DrawText(0, 90, mt_txtSize, mt_txtcolor, "CMD: " + std::to_string(C3D_GetCmdBufUsage()*100.0f) + "%/" + std::to_string(C3D_GetCmdBufUsage()));
|
||||||
|
for (int z = 0; z < 320; z++)
|
||||||
|
{
|
||||||
|
C2D_DrawLine(z, 239 - mt_fpsgraph[z], mt_txtcolor, z + 1, 239 - mt_fpsgraph[z + 1], mt_txtcolor, 1, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RenderD7::DrawNFRect(float p1x, float p1y, float w, float h, u32 color, float scale)
|
||||||
|
{
|
||||||
|
C2D_DrawLine(p1x, p1y, color,w, p1y, color, scale, 1);
|
||||||
|
C2D_DrawLine(w, p1y, color,w, h, color, scale, 1);
|
||||||
|
C2D_DrawLine(w, h, color,p1x, h, color, scale, 1);
|
||||||
|
C2D_DrawLine(p1x, h, color,p1x, p1y, color, scale, 1);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderD7::FrameEnd()
|
||||||
|
{
|
||||||
|
if (metrikd)RenderD7::DrawMetrikOvl();
|
||||||
|
/*for (int i = 0; i < (int)overlays.size(); i++)
|
||||||
|
{
|
||||||
|
overlays[i].Draw();
|
||||||
|
}*/
|
||||||
|
if (d7_hHeld & KEY_L && d7_hHeld & KEY_R && d7_hDown & KEY_Y)
|
||||||
|
{
|
||||||
|
RenderD7::LoadSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
C3D_FrameEnd(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
RenderD7::RSettings::RSettings()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
RenderD7::RSettings::~RSettings()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderD7::RSettings::Draw(void) const
|
||||||
|
{
|
||||||
|
std::string metkkkkk = "Metrik: " + metrikd ? "true" : "false";
|
||||||
|
RenderD7::OnScreen(Top);
|
||||||
|
RenderD7::DrawRect(0, 0, 400, 20, RenderD7::Color::Hex("#111111"));
|
||||||
|
RenderD7::DrawRect(0, 20, 400, 220, RenderD7::Color::Hex("#eeeeee"));
|
||||||
|
RenderD7::DrawText(0, 0, 0.7f, DSEVENWHITE, "RenderD7->Settings");
|
||||||
|
RenderD7::DrawText(0, 22, 0.7f, DSEVENBLACK, metkkkkk);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderD7::RSettings::Logic(u32 hDown, u32 hHeld, u32 hUp, touchPosition touch)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (d7_hDown & KEY_B)
|
||||||
|
{
|
||||||
|
RenderD7::Scene::Back();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderD7::LoadSettings(){
|
||||||
|
RenderD7::Scene::Load(std::make_unique<RenderD7::RSettings>());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*void RenderD7::AddOvl(RenderD7::Ovl overlay)
|
||||||
|
{
|
||||||
|
overlays.push_back(overlay);
|
||||||
|
}*/
|
||||||
|
|
||||||
|
/*RenderD7::Console::Console()
|
||||||
|
{
|
||||||
|
this->x = 0;
|
||||||
|
this->y = 0;
|
||||||
|
this->w = 320;
|
||||||
|
this->h = 240;
|
||||||
|
this->color = {0, 0, 0, 255};
|
||||||
|
}
|
||||||
|
RenderD7::Console::Console(int x, int y, int w, int h, u8 a)
|
||||||
|
{
|
||||||
|
this->x = x;
|
||||||
|
this->y = y;
|
||||||
|
this->w = w;
|
||||||
|
this->h = h;
|
||||||
|
this->color = {0, 0, 0, a};
|
||||||
|
|
||||||
|
}
|
||||||
|
RenderD7::Console::Console(int x, int y, int w, int h, RenderD7::Color::rgba col)
|
||||||
|
{
|
||||||
|
this->x = x;
|
||||||
|
this->y = y;
|
||||||
|
this->w = w;
|
||||||
|
this->h = h;
|
||||||
|
this->color = col;
|
||||||
|
}
|
||||||
|
RenderD7::Console::Console(int x, int y, int w, int h, std::string name, RenderD7::Color::rgba col, RenderD7::Color::rgba barcol, RenderD7::Color::rgba outlinecol)
|
||||||
|
{
|
||||||
|
this->x = x;
|
||||||
|
this->y = y;
|
||||||
|
this->w = w;
|
||||||
|
this->h = h;
|
||||||
|
this->color = col;
|
||||||
|
this->outlinecol = outlinecol;
|
||||||
|
this->barcolor = barcol;
|
||||||
|
this->m_name = name;
|
||||||
|
}
|
||||||
|
RenderD7::Console::~Console()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
void RenderD7::Console::On(C3D_RenderTarget *t_cscreen)
|
||||||
|
{
|
||||||
|
this->cscreen = t_cscreen;
|
||||||
|
}
|
||||||
|
bool RenderD7::Console::Update()
|
||||||
|
{
|
||||||
|
bool dr_sc = true;
|
||||||
|
return dr_sc;
|
||||||
|
}
|
||||||
|
*/
|
324
renderd7.hpp
Normal file
324
renderd7.hpp
Normal file
@ -0,0 +1,324 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <3ds.h>
|
||||||
|
#include <citro2d.h>
|
||||||
|
#include <citro3d.h>
|
||||||
|
#include <memory>
|
||||||
|
#include <stack>
|
||||||
|
#include <string>
|
||||||
|
#include <functional>
|
||||||
|
#include <map>
|
||||||
|
#include <vector>
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <cstring>
|
||||||
|
#include <random>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <iostream>
|
||||||
|
#include "external/lodepng.h"
|
||||||
|
#include "external/fs.h"
|
||||||
|
#include <codecvt>
|
||||||
|
#include "lang.hpp"
|
||||||
|
#include "parameter.hpp"
|
||||||
|
#include "thread.hpp"
|
||||||
|
#include "ini.hpp"
|
||||||
|
#include "stringtool.hpp"
|
||||||
|
#include "Clock.hpp"
|
||||||
|
|
||||||
|
#define RENDERD7VSTRING "0.6.2"
|
||||||
|
#define CHANGELOG "0.6.2: \n0.6.10: rewrite Threadsystem, Improve framerate\n0.6.02: Fix Code in lang.hpp\nadd Draw Text Left Function.\nadd changelog\n0.6.01: add Threading system."
|
||||||
|
#define DEFAULT_CENTER 0.5f
|
||||||
|
|
||||||
|
extern C3D_RenderTarget* Top;
|
||||||
|
extern C3D_RenderTarget* TopRight;
|
||||||
|
extern C3D_RenderTarget* Bottom;
|
||||||
|
|
||||||
|
extern u32 d7_hDown;
|
||||||
|
extern u32 d7_hHeld;
|
||||||
|
extern u32 d7_hUp;
|
||||||
|
extern touchPosition d7_touch;
|
||||||
|
|
||||||
|
extern std::string dspststus;
|
||||||
|
|
||||||
|
/// RenderD7
|
||||||
|
namespace RenderD7
|
||||||
|
{
|
||||||
|
enum kbd{
|
||||||
|
SWKBD,
|
||||||
|
BKBD
|
||||||
|
};
|
||||||
|
enum kbd_type
|
||||||
|
{
|
||||||
|
NUMPAD,
|
||||||
|
STANDARD
|
||||||
|
};
|
||||||
|
/// Set current RenderScreen
|
||||||
|
/// \param target The RenderTarget Top, Bottom
|
||||||
|
void OnScreen(C3D_RenderTarget *target);
|
||||||
|
/** The Spritesheet Class */
|
||||||
|
class Sheet
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// Construct sheet
|
||||||
|
Sheet();
|
||||||
|
// Deconstruct sheet
|
||||||
|
~Sheet();
|
||||||
|
/// Load a Sritesheet
|
||||||
|
/// path: Path to the Spritesheet (.t3x)
|
||||||
|
Result Load(const char *path);
|
||||||
|
/// Unload the Spritesheet
|
||||||
|
void Free();
|
||||||
|
// The Spritesheet
|
||||||
|
C2D_SpriteSheet spritesheet;
|
||||||
|
};
|
||||||
|
/// Image Class
|
||||||
|
class Image
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// Load Image from Png
|
||||||
|
/// path: path to png file
|
||||||
|
void LoadPng(const std::string path);
|
||||||
|
/// Load the Image from buffer
|
||||||
|
/// buffer: the frame buffer
|
||||||
|
void LoadPFromBuffer(const std::vector<u8> &buffer);
|
||||||
|
/// Draw the Image directly
|
||||||
|
/// \param x The x position
|
||||||
|
/// \param y the y position
|
||||||
|
/// \param scaleX x scale from 0.0 to 1.0
|
||||||
|
/// \param scaleY y scale from 0.0 to 1.0
|
||||||
|
bool Draw(float x, float y, float scaleX = 1.0f, float scaleY = 1.0f);
|
||||||
|
/// \brief Get The Image
|
||||||
|
/// \return C2D_Image
|
||||||
|
C2D_Image Get(){return this->img;}
|
||||||
|
/// \img this is the C2D_Image
|
||||||
|
C2D_Image img;
|
||||||
|
/// \loadet whether the image is loadet or not
|
||||||
|
bool loadet = false;
|
||||||
|
};
|
||||||
|
/// Sprite Class
|
||||||
|
class Sprite
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// \brief Construct Sprite
|
||||||
|
Sprite();
|
||||||
|
~Sprite();
|
||||||
|
void FromSheet(RenderD7::Sheet *sheet, size_t index);
|
||||||
|
void FromImage(RenderD7::Image *img);
|
||||||
|
bool Draw();
|
||||||
|
void SetCenter(float x, float y);
|
||||||
|
void SetPos(float x, float y);
|
||||||
|
void SetScale(float x, float y);
|
||||||
|
void SetRotation(float rotation);
|
||||||
|
void Rotate(float speed);
|
||||||
|
float getWidth();
|
||||||
|
float getHeigh();
|
||||||
|
float getPosX();
|
||||||
|
float getPosY();
|
||||||
|
private:
|
||||||
|
C2D_ImageTint tint;
|
||||||
|
C2D_Sprite sprite;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Scene {
|
||||||
|
public:
|
||||||
|
static std::stack<std::unique_ptr<Scene>> scenes;
|
||||||
|
virtual ~Scene() {}
|
||||||
|
virtual void Logic(u32 hDown, u32 hHeld, u32 hUp, touchPosition touch) = 0;
|
||||||
|
virtual void Draw() const = 0;
|
||||||
|
//virtual void Ovl() const = 0;
|
||||||
|
static void Load(std::unique_ptr<Scene> scene);
|
||||||
|
static void Back();
|
||||||
|
static void doDraw();
|
||||||
|
static void doLogic(u32 hDown, u32 hHeld, u32 hUp, touchPosition touch);
|
||||||
|
//static void HandleOvl();
|
||||||
|
};
|
||||||
|
|
||||||
|
class RSettings : public RenderD7::Scene
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
/* data */
|
||||||
|
public:
|
||||||
|
RSettings();
|
||||||
|
void Draw(void) const override;
|
||||||
|
~RSettings();
|
||||||
|
void Logic(u32 hDown, u32 hHeld, u32 hUp, touchPosition touch) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
void LoadSettings();
|
||||||
|
|
||||||
|
/*class Ovl {
|
||||||
|
public:
|
||||||
|
virtual ~Ovl(){}
|
||||||
|
virtual void Draw() const = 0;
|
||||||
|
};
|
||||||
|
void AddOvl(RenderD7::Ovl overlay);*/
|
||||||
|
namespace Color
|
||||||
|
{
|
||||||
|
struct rgba
|
||||||
|
{
|
||||||
|
u8 r, g, b, a;
|
||||||
|
};
|
||||||
|
class RGBA{
|
||||||
|
public:
|
||||||
|
RGBA(u8 r, u8 g, u8 b, u8 a) : m_r(r),m_g(g),m_b(b),m_a(a){}
|
||||||
|
u32 toRGBA() const {return (m_r << 24) | (m_g << 16) | (m_b << 8) | m_a;}
|
||||||
|
|
||||||
|
u8 m_r, m_g ,m_b, m_a;
|
||||||
|
};
|
||||||
|
u32 Hex(const std::string color, u8 a = 255);
|
||||||
|
}
|
||||||
|
int GetRandomInt(int b, int e);
|
||||||
|
void DrawMetrikOvl();
|
||||||
|
bool DrawImageFromSheet(RenderD7::Sheet* sheet, size_t index, float x, float y, float scaleX = 1.0, float scaleY = 1.0);
|
||||||
|
namespace Error
|
||||||
|
{
|
||||||
|
void DisplayError(std::string toptext, std::string errortext, int timesec);
|
||||||
|
void DisplayFatalError(std::string toptext, std::string errortext);
|
||||||
|
}
|
||||||
|
namespace Init
|
||||||
|
{
|
||||||
|
Result Main(std::string app_name = "RD7Game");
|
||||||
|
void NdspFirm(bool useit = false);
|
||||||
|
}
|
||||||
|
namespace Exit
|
||||||
|
{
|
||||||
|
void Main();
|
||||||
|
void NdspFirm();
|
||||||
|
}
|
||||||
|
namespace Msg
|
||||||
|
{
|
||||||
|
void Display(std::string titletxt, std::string subtext, C3D_RenderTarget *target);
|
||||||
|
void DisplayWithProgress(std::string titletext, std::string subtext, float current, float total, u32 prgbarcolor);
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace Convert
|
||||||
|
{
|
||||||
|
inline float StringtoFloat(std::string inp){return std::atof(inp.c_str());}
|
||||||
|
inline int StringtoInt(std::string inp){return std::atoi(inp.c_str());}
|
||||||
|
inline bool FloatToBool(float inp){if(inp == 1)return true; else return false;}
|
||||||
|
}
|
||||||
|
namespace FS
|
||||||
|
{
|
||||||
|
bool FileExist(const std::string& path);
|
||||||
|
}
|
||||||
|
bool IsNdspInit();
|
||||||
|
void SetupLog(void);
|
||||||
|
std::string GetFramerate();
|
||||||
|
bool MainLoop();
|
||||||
|
void ExitApp();
|
||||||
|
|
||||||
|
void ClearTextBufs(void);
|
||||||
|
|
||||||
|
bool DrawRect(float x, float y, float w, float h, u32 color);
|
||||||
|
bool DrawNFRect(float p1x, float p1y, float w, float h, u32 color, float scale = 1);
|
||||||
|
bool DrawPx(float x, float y, u32 color);
|
||||||
|
void DrawTextCentered(float x, float y, float size, u32 color, std::string Text, int maxWidth = 0, int maxHeight = 0, C2D_Font fnt = nullptr);
|
||||||
|
void DrawText(float x, float y, float size, u32 color, std::string Text, int maxWidth = 0, int maxHeight = 0, C2D_Font fnt = nullptr);
|
||||||
|
void DrawTextLeft(float x, float y, float size, u32 color, std::string Text, int maxWidth = 0, int maxHeight = 0, C2D_Font fnt = nullptr);
|
||||||
|
float GetTextWidth(float size, std::string Text, C2D_Font fnt = nullptr);
|
||||||
|
void GetTextSize(float size, float *width, float *height, std::string Text, C2D_Font fnt = nullptr);
|
||||||
|
float GetTextHeight(float size, std::string Text, C2D_Font fnt = nullptr);
|
||||||
|
Result loadFont(C2D_Font &fnt, const char * Path = "");
|
||||||
|
Result unloadFont(C2D_Font &fnt);
|
||||||
|
bool DrawCircle(float x, float y, float radius, u32 color);
|
||||||
|
bool DrawImage(C2D_Image img, float x, float y, float scaleX = 1.0f, float scaleY = 1.0f);
|
||||||
|
void FrameEnd();
|
||||||
|
|
||||||
|
class SpriteSheetAnimation : public RenderD7::Sprite
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SpriteSheetAnimation();
|
||||||
|
~SpriteSheetAnimation();
|
||||||
|
void Setup(RenderD7::Sheet *sheet, size_t imagecount, size_t startimage, float frame_begin, float frame_finish);
|
||||||
|
void Play(float timespeed);
|
||||||
|
private:
|
||||||
|
size_t images;
|
||||||
|
size_t imgs = 0;
|
||||||
|
float D_totaltime;
|
||||||
|
RenderD7::Sheet *sheet;
|
||||||
|
float time;
|
||||||
|
};
|
||||||
|
struct TObject
|
||||||
|
{
|
||||||
|
int x; //Position X
|
||||||
|
int y; //Position Y
|
||||||
|
int w; //Button Width
|
||||||
|
int h; //Button Height
|
||||||
|
std::string text = ""; //Text
|
||||||
|
float correctx = 0; //Correct X Position
|
||||||
|
float correcty = 0; //Correct Y Position
|
||||||
|
float txtsize = 0.7f; //Set Text Size
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TLBtn
|
||||||
|
{
|
||||||
|
int x; //Position X
|
||||||
|
int y; //Position Y
|
||||||
|
int w; //Button Width
|
||||||
|
int h; //Button Height
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ScrollList1
|
||||||
|
{
|
||||||
|
std::string Text = "";
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ScrollList2
|
||||||
|
{
|
||||||
|
float x;
|
||||||
|
float y;
|
||||||
|
float w;
|
||||||
|
float h;
|
||||||
|
std::string Text = "";
|
||||||
|
};
|
||||||
|
/*enum ListType
|
||||||
|
{
|
||||||
|
ONE,
|
||||||
|
TWO
|
||||||
|
};*/
|
||||||
|
void DrawList1(RenderD7::ScrollList1 &l, float txtsize, C3D_RenderTarget *t);
|
||||||
|
void DrawTObjects(std::vector<RenderD7::TObject> tobjects, u32 color, u32 txtcolor, int selection = -1, u32 selbgcolor = RenderD7::Color::Hex("#2D98AF"), u32 selcolor = RenderD7::Color::Hex("#000000"));
|
||||||
|
void DrawSTObject(std::vector<RenderD7::TObject> tobject, int tobjectindex, u32 color, u32 txtcolor);
|
||||||
|
bool touchTObj(touchPosition touch, RenderD7::TObject button);
|
||||||
|
void DrawTLBtns(std::vector<RenderD7::TLBtn> btns, u32 color, int selection = -1, u32 selbgcolor = RenderD7::Color::Hex("#2D98AF"), u32 selcolor = RenderD7::Color::Hex("#000000"));
|
||||||
|
struct DirContent
|
||||||
|
{
|
||||||
|
std::string name;
|
||||||
|
std::string path;
|
||||||
|
bool isDir;
|
||||||
|
};
|
||||||
|
struct Checkbox
|
||||||
|
{
|
||||||
|
float x, y, s;
|
||||||
|
bool is_chexked = false;
|
||||||
|
u32 outcol, incol, chcol;
|
||||||
|
};
|
||||||
|
void DrawCheckbox(Checkbox box);
|
||||||
|
/*class Console
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Console();
|
||||||
|
Console(int x, int y, int w, int h, int a = 255);
|
||||||
|
Console(int x, int y, int w, int h, RenderD7::Color::rgba col);
|
||||||
|
Console(int x, int y, int w, int h, std::string name, RenderD7::Color::rgba col = {255, 255, 255, 255}, RenderD7::Color::rgba barcol = {0, 0, 0, 255}, RenderD7::Color::rgba outlinecol = {222, 222, 222, 255});
|
||||||
|
void On(C3D_RenderTarget *t_cscreen);
|
||||||
|
bool Update();
|
||||||
|
~Console();
|
||||||
|
private:
|
||||||
|
std::vector<std::string> m_lines;
|
||||||
|
int x, y, w, h;
|
||||||
|
std::string m_name = "";
|
||||||
|
C3D_RenderTarget *cscreen;
|
||||||
|
bool m_nconsole = false;
|
||||||
|
bool m_mconsole = false;
|
||||||
|
RenderD7::Color::rgba color = {255, 255, 255, 255};
|
||||||
|
RenderD7::Color::rgba outlinecol = {222, 222, 222, 255};
|
||||||
|
RenderD7::Color::rgba barcolor = {0, 0, 0, 255};
|
||||||
|
};*/
|
||||||
|
|
||||||
|
bool NameIsEndingWith(const std::string &name, const std::vector<std::string> &extensions);
|
||||||
|
void GetDirContentsExt(std::vector<RenderD7::DirContent> &dircontent, const std::vector<std::string> &extensions);
|
||||||
|
void GetDirContents(std::vector<RenderD7::DirContent> &dircontent);
|
||||||
|
|
||||||
|
} /// RenderD7
|
130
sound.cpp
Normal file
130
sound.cpp
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
#include "sound.hpp"
|
||||||
|
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstring>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
extern bool isndspinit;
|
||||||
|
using std::string;
|
||||||
|
|
||||||
|
// Reference: http://yannesposito.com/Scratch/en/blog/2010-10-14-Fun-with-wav/
|
||||||
|
typedef struct _WavHeader {
|
||||||
|
char magic[4]; // "RIFF"
|
||||||
|
u32 totallength; // Total file length, minus 8.
|
||||||
|
char wavefmt[8]; // Should be "WAVEfmt "
|
||||||
|
u32 format; // 16 for PCM format
|
||||||
|
u16 pcm; // 1 for PCM format
|
||||||
|
u16 channels; // Channels
|
||||||
|
u32 frequency; // Sampling frequency
|
||||||
|
u32 bytes_per_second;
|
||||||
|
u16 bytes_by_capture;
|
||||||
|
u16 bits_per_sample;
|
||||||
|
char data[4]; // "data"
|
||||||
|
u32 bytes_in_data;
|
||||||
|
} WavHeader;
|
||||||
|
static_assert(sizeof(WavHeader) == 44, "WavHeader size is not 44 bytes.");
|
||||||
|
|
||||||
|
sound::sound(const string& path, int channel, bool toloop) {
|
||||||
|
if (isndspinit){
|
||||||
|
ndspSetOutputMode(NDSP_OUTPUT_STEREO);
|
||||||
|
ndspSetOutputCount(2); // Num of buffers
|
||||||
|
|
||||||
|
// Reading wav file
|
||||||
|
FILE* fp = fopen(path.c_str(), "rb");
|
||||||
|
|
||||||
|
if (!fp) {
|
||||||
|
printf("Could not open the WAV file: %s\n", path.c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
WavHeader wavHeader;
|
||||||
|
size_t read = fread(&wavHeader, 1, sizeof(wavHeader), fp);
|
||||||
|
if (read != sizeof(wavHeader)) {
|
||||||
|
// Short read.
|
||||||
|
printf("WAV file header is too short: %s\n", path.c_str());
|
||||||
|
fclose(fp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify the header.
|
||||||
|
static const char RIFF_magic[4] = {'R','I','F','F'};
|
||||||
|
if (memcmp(wavHeader.magic, RIFF_magic, sizeof(wavHeader.magic)) != 0) {
|
||||||
|
// Incorrect magic number.
|
||||||
|
printf("Wrong file format.\n");
|
||||||
|
fclose(fp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wavHeader.totallength == 0 ||
|
||||||
|
(wavHeader.channels != 1 && wavHeader.channels != 2) ||
|
||||||
|
(wavHeader.bits_per_sample != 8 && wavHeader.bits_per_sample != 16)) {
|
||||||
|
// Unsupported WAV file.
|
||||||
|
printf("Corrupted wav file.\n");
|
||||||
|
fclose(fp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the file size.
|
||||||
|
fseek(fp, 0, SEEK_END);
|
||||||
|
dataSize = ftell(fp) - sizeof(wavHeader);
|
||||||
|
|
||||||
|
// Allocating and reading samples
|
||||||
|
data = static_cast<u8*>(linearAlloc(dataSize));
|
||||||
|
fseek(fp, 44, SEEK_SET);
|
||||||
|
fread(data, 1, dataSize, fp);
|
||||||
|
fclose(fp);
|
||||||
|
dataSize /= 2; // FIXME: 16-bit or stereo?
|
||||||
|
|
||||||
|
// Find the right format
|
||||||
|
u16 ndspFormat;
|
||||||
|
if (wavHeader.bits_per_sample == 8) {
|
||||||
|
ndspFormat = (wavHeader.channels == 1) ?
|
||||||
|
NDSP_FORMAT_MONO_PCM8 :
|
||||||
|
NDSP_FORMAT_STEREO_PCM8;
|
||||||
|
} else {
|
||||||
|
ndspFormat = (wavHeader.channels == 1) ?
|
||||||
|
NDSP_FORMAT_MONO_PCM16 :
|
||||||
|
NDSP_FORMAT_STEREO_PCM16;
|
||||||
|
}
|
||||||
|
|
||||||
|
ndspChnReset(channel);
|
||||||
|
ndspChnSetInterp(channel, NDSP_INTERP_NONE);
|
||||||
|
ndspChnSetRate(channel, float(wavHeader.frequency));
|
||||||
|
ndspChnSetFormat(channel, ndspFormat);
|
||||||
|
|
||||||
|
// Create and play a wav buffer
|
||||||
|
memset(&waveBuf, 0, sizeof(waveBuf));
|
||||||
|
|
||||||
|
waveBuf.data_vaddr = reinterpret_cast<u32*>(data);
|
||||||
|
waveBuf.nsamples = dataSize / (wavHeader.bits_per_sample >> 3);
|
||||||
|
waveBuf.looping = toloop;
|
||||||
|
waveBuf.status = NDSP_WBUF_FREE;
|
||||||
|
chnl = channel;}
|
||||||
|
}
|
||||||
|
|
||||||
|
sound::~sound() {
|
||||||
|
if (isndspinit){
|
||||||
|
waveBuf.data_vaddr = 0;
|
||||||
|
waveBuf.nsamples = 0;
|
||||||
|
waveBuf.looping = false;
|
||||||
|
waveBuf.status = 0;
|
||||||
|
ndspChnWaveBufClear(chnl);
|
||||||
|
|
||||||
|
if (data) {
|
||||||
|
linearFree(data);
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
|
||||||
|
void sound::play() {
|
||||||
|
if (isndspinit){
|
||||||
|
if (!data) return;
|
||||||
|
DSP_FlushDataCache(data, dataSize);
|
||||||
|
ndspChnWaveBufAdd(chnl, &waveBuf);}
|
||||||
|
}
|
||||||
|
|
||||||
|
void sound::stop() {
|
||||||
|
if (isndspinit){
|
||||||
|
if (!data) return;
|
||||||
|
ndspChnWaveBufClear(chnl);}
|
||||||
|
}
|
27
sound.hpp
Normal file
27
sound.hpp
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <3ds.h>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
/** Sound Class */
|
||||||
|
class sound {
|
||||||
|
public:
|
||||||
|
/// \brief Construct new Soundeffect
|
||||||
|
/// \param path Path to the .wav file
|
||||||
|
/// \param channel the channel 1-23
|
||||||
|
/// \param toloop true:loop the sound, false: don't loop
|
||||||
|
sound(const std::string& path, int channel = 1, bool toloop = false);
|
||||||
|
/** deconstruct the sound */
|
||||||
|
~sound();
|
||||||
|
/** play the sound */
|
||||||
|
void play();
|
||||||
|
/** stop the sound */
|
||||||
|
void stop();
|
||||||
|
|
||||||
|
private:
|
||||||
|
u32 dataSize;
|
||||||
|
ndspWaveBuf waveBuf;
|
||||||
|
u8* data = NULL;
|
||||||
|
int chnl;
|
||||||
|
};
|
||||||
|
|
229
source/Color.cpp
229
source/Color.cpp
@ -1,229 +0,0 @@
|
|||||||
#include <filesystem>
|
|
||||||
#include <fstream>
|
|
||||||
#include <map>
|
|
||||||
#include <renderd7/Color.hpp>
|
|
||||||
#include <renderd7/Message.hpp>
|
|
||||||
#include <renderd7/external/json.hpp>
|
|
||||||
#include <renderd7/internal_db.hpp>
|
|
||||||
|
|
||||||
void rd7i_swap32(unsigned int& c) {
|
|
||||||
c = ((c & 0xFF) << 24) | ((c & 0xFF00) << 8) | ((c & 0xFF0000) >> 8) |
|
|
||||||
((c & 0xFF000000) >> 24);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string RenderD7::Color::RGBA2Hex(unsigned int c32) {
|
|
||||||
rd7i_swap32(c32);
|
|
||||||
std::stringstream ss;
|
|
||||||
ss << "#";
|
|
||||||
ss << std::hex << std::setw(8) << std::setfill('0') << c32;
|
|
||||||
return ss.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Standart Color Converter
|
|
||||||
static const std::map<char, int> HEX_TO_DEC = {
|
|
||||||
{'0', 0}, {'1', 1}, {'2', 2}, {'3', 3}, {'4', 4}, {'5', 5},
|
|
||||||
{'6', 6}, {'7', 7}, {'8', 8}, {'9', 9}, {'a', 10}, {'b', 11},
|
|
||||||
{'c', 12}, {'d', 13}, {'e', 14}, {'f', 15}, {'A', 10}, {'B', 11},
|
|
||||||
{'C', 12}, {'D', 13}, {'E', 14}, {'F', 15}};
|
|
||||||
|
|
||||||
unsigned int rd7i_special_color_hex(const std::string& hex) {
|
|
||||||
if (hex.length() < 9 || std::find_if(hex.begin() + 1, hex.end(), [](char c) {
|
|
||||||
return !std::isxdigit(c);
|
|
||||||
}) != hex.end()) {
|
|
||||||
return rd7i_special_color_hex("#00000000");
|
|
||||||
}
|
|
||||||
|
|
||||||
int r = HEX_TO_DEC.at(hex[1]) * 16 + HEX_TO_DEC.at(hex[2]);
|
|
||||||
int g = HEX_TO_DEC.at(hex[3]) * 16 + HEX_TO_DEC.at(hex[4]);
|
|
||||||
int b = HEX_TO_DEC.at(hex[5]) * 16 + HEX_TO_DEC.at(hex[6]);
|
|
||||||
int a = HEX_TO_DEC.at(hex[7]) * 16 + HEX_TO_DEC.at(hex[8]);
|
|
||||||
|
|
||||||
return RGBA8(r, g, b, a);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Default Theme
|
|
||||||
const std::map<RD7Color, unsigned int> rd7i_default_theme = {
|
|
||||||
{RD7Color_Text, RGBA8(0, 0, 0, 255)},
|
|
||||||
{RD7Color_Text2, RGBA8(255, 255, 255, 255)}, // For Background change or so
|
|
||||||
{RD7Color_TextDisabled, RGBA8(170, 170, 170, 255)},
|
|
||||||
{RD7Color_Background, RGBA8(238, 238, 238, 255)},
|
|
||||||
{RD7Color_Header, RGBA8(17, 17, 17, 255)},
|
|
||||||
{RD7Color_Selector, RGBA8(34, 34, 34, 255)},
|
|
||||||
{RD7Color_SelectorFade, RGBA8(90, 90, 90, 255)},
|
|
||||||
{RD7Color_List0, RGBA8(204, 204, 204, 255)}, // List0 = % 2
|
|
||||||
{RD7Color_List1, RGBA8(187, 187, 187, 255)},
|
|
||||||
{RD7Color_MessageBackground, RGBA8(51, 51, 51, 255)},
|
|
||||||
{RD7Color_Button, RGBA8(17, 17, 17, 255)},
|
|
||||||
{RD7Color_ButtonHovered, RGBA8(34, 34, 34, 255)},
|
|
||||||
{RD7Color_ButtonDisabled, RGBA8(8, 8, 8, 255)},
|
|
||||||
{RD7Color_ButtonActive, RGBA8(42, 42, 42, 255)},
|
|
||||||
{RD7Color_Checkmark, RGBA8(42, 42, 42, 255)},
|
|
||||||
{RD7Color_FrameBg, RGBA8(85, 85, 85, 255)},
|
|
||||||
{RD7Color_FrameBgHovered, RGBA8(119, 119, 119, 255)},
|
|
||||||
{RD7Color_Progressbar, RGBA8(0, 255, 0, 255)},
|
|
||||||
};
|
|
||||||
|
|
||||||
void RenderD7::Theme::Load(const std::string& path) {
|
|
||||||
std::ifstream file(path);
|
|
||||||
if (!file.is_open()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
nlohmann::json js;
|
|
||||||
file >> js;
|
|
||||||
// clang-format off
|
|
||||||
if(THEMEVER != js["version"]) {
|
|
||||||
file.close();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this->clr_tab.clear();
|
|
||||||
this->clr_tab.resize(RD7Color_Len);
|
|
||||||
this->clr_tab[RD7Color_Text] = rd7i_special_color_hex(js["RD7Color_Text"].get<std::string>());
|
|
||||||
this->clr_tab[RD7Color_Text2] = rd7i_special_color_hex(js["RD7Color_Text2"].get<std::string>());
|
|
||||||
this->clr_tab[RD7Color_TextDisabled] = rd7i_special_color_hex(js["RD7Color_TextDisabled"].get<std::string>());
|
|
||||||
this->clr_tab[RD7Color_Background] = rd7i_special_color_hex(js["RD7Color_Background"].get<std::string>());
|
|
||||||
this->clr_tab[RD7Color_Header] = rd7i_special_color_hex(js["RD7Color_Header"].get<std::string>());
|
|
||||||
this->clr_tab[RD7Color_Selector] = rd7i_special_color_hex(js["RD7Color_Selector"].get<std::string>());
|
|
||||||
this->clr_tab[RD7Color_SelectorFade] = rd7i_special_color_hex(js["RD7Color_SelectorFade"].get<std::string>());
|
|
||||||
this->clr_tab[RD7Color_List0] = rd7i_special_color_hex(js["RD7Color_List0"].get<std::string>());
|
|
||||||
this->clr_tab[RD7Color_List1] = rd7i_special_color_hex(js["RD7Color_List1"].get<std::string>());
|
|
||||||
this->clr_tab[RD7Color_MessageBackground] = rd7i_special_color_hex(js["RD7Color_MessageBackground"].get<std::string>());
|
|
||||||
this->clr_tab[RD7Color_Button] = rd7i_special_color_hex(js["RD7Color_Button"].get<std::string>());
|
|
||||||
this->clr_tab[RD7Color_ButtonHovered] = rd7i_special_color_hex(js["RD7Color_ButtonHovered"].get<std::string>());
|
|
||||||
this->clr_tab[RD7Color_ButtonDisabled] = rd7i_special_color_hex(js["RD7Color_ButtonDisabled"].get<std::string>());
|
|
||||||
this->clr_tab[RD7Color_ButtonActive] = rd7i_special_color_hex(js["RD7Color_ButtonActive"].get<std::string>());
|
|
||||||
this->clr_tab[RD7Color_Checkmark] = rd7i_special_color_hex(js["RD7Color_Checkmark"].get<std::string>());
|
|
||||||
this->clr_tab[RD7Color_FrameBg] = rd7i_special_color_hex(js["RD7Color_FrameBg"].get<std::string>());
|
|
||||||
this->clr_tab[RD7Color_FrameBgHovered] = rd7i_special_color_hex(js["RD7Color_FrameBgHovered"].get<std::string>());
|
|
||||||
this->clr_tab[RD7Color_Progressbar] = rd7i_special_color_hex(js["RD7Color_Progressbar"].get<std::string>());
|
|
||||||
// clang-format on
|
|
||||||
file.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
void RenderD7::Theme::Default() {
|
|
||||||
this->clr_tab.clear();
|
|
||||||
this->clr_tab.resize(RD7Color_Len);
|
|
||||||
for (auto& it : rd7i_default_theme) {
|
|
||||||
this->clr_tab[it.first] = it.second;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void RenderD7::Theme::CopyOther(Theme::Ref theme) {
|
|
||||||
this->clr_tab.clear();
|
|
||||||
this->clr_tab.resize(RD7Color_Len);
|
|
||||||
for (int i = 0; i < (int)RD7Color_Len; i++) {
|
|
||||||
this->clr_tab[i] = theme->Get(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int RenderD7::Theme::Get(RD7Color clr) {
|
|
||||||
if (clr < 0 || clr >= RD7Color_Len) return 0;
|
|
||||||
return this->clr_tab[clr];
|
|
||||||
}
|
|
||||||
|
|
||||||
void RenderD7::Theme::Set(RD7Color clr, unsigned int v) {
|
|
||||||
if (clr < 0 || clr >= RD7Color_Len) return;
|
|
||||||
this->changes.push_back(change(clr, this->clr_tab[clr], v));
|
|
||||||
this->clr_tab[clr] = v;
|
|
||||||
}
|
|
||||||
void RenderD7::Theme::Swap(RD7Color a, RD7Color b) {
|
|
||||||
if (a < 0 || a >= RD7Color_Len || b < 0 || b >= RD7Color_Len) return;
|
|
||||||
auto c = this->clr_tab[a];
|
|
||||||
this->clr_tab[a] = this->clr_tab[b];
|
|
||||||
this->clr_tab[b] = c;
|
|
||||||
this->changes.push_back(change(a, b, c, this->clr_tab[a]));
|
|
||||||
}
|
|
||||||
|
|
||||||
void RenderD7::Theme::TextBy(RD7Color bg) {
|
|
||||||
if (!Color::RGBA(bg).is_light()) Swap(RD7Color_Text, RD7Color_Text2);
|
|
||||||
}
|
|
||||||
|
|
||||||
RD7Color RenderD7::Theme::AutoText(RD7Color bg) {
|
|
||||||
return Color::RGBA(bg).is_light() ? RD7Color_Text : RD7Color_Text2;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool RenderD7::Theme::Undo() {
|
|
||||||
if (!this->changes.size()) return false;
|
|
||||||
auto ch = this->changes[this->changes.size() - 1];
|
|
||||||
this->changes.pop_back();
|
|
||||||
if (ch.clr2) {
|
|
||||||
this->clr_tab[ch.clr2] = ch.to;
|
|
||||||
this->clr_tab[ch.clr] = ch.from;
|
|
||||||
} else {
|
|
||||||
this->clr_tab[ch.clr] = ch.from;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void RenderD7::Theme::UndoAll() {
|
|
||||||
while (Undo()) {
|
|
||||||
// Just Run Undo Until all is undone
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void RenderD7::Theme::Save(const std::string& path) {
|
|
||||||
if (std::filesystem::path(path).filename().string() == "renderd7.theme") {
|
|
||||||
if (!rd7i_amdt) {
|
|
||||||
RenderD7::PushMessage("Theme", "Default Theme cannot\nbe overwritten!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
std::ofstream file(path);
|
|
||||||
if (!file.is_open()) {
|
|
||||||
RenderD7::PushMessage("Theme", "Unable to\ncreate file!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
nlohmann::json js;
|
|
||||||
// clang-format off
|
|
||||||
js["version"] = THEMEVER;
|
|
||||||
js["RD7Color_Text"] = RenderD7::Color::RGBA2Hex(this->clr_tab[RD7Color_Text]);
|
|
||||||
js["RD7Color_Text2"] = RenderD7::Color::RGBA2Hex(this->clr_tab[RD7Color_Text2]);
|
|
||||||
js["RD7Color_TextDisabled"] =
|
|
||||||
RenderD7::Color::RGBA2Hex(this->clr_tab[RD7Color_TextDisabled]); js["RD7Color_Background"] =
|
|
||||||
RenderD7::Color::RGBA2Hex(this->clr_tab[RD7Color_Background]); js["RD7Color_Header"] =
|
|
||||||
RenderD7::Color::RGBA2Hex(this->clr_tab[RD7Color_Header]); js["RD7Color_Selector"] =
|
|
||||||
RenderD7::Color::RGBA2Hex(this->clr_tab[RD7Color_Selector]); js["RD7Color_SelectorFade"] =
|
|
||||||
RenderD7::Color::RGBA2Hex(this->clr_tab[RD7Color_SelectorFade]); js["RD7Color_List0"] =
|
|
||||||
RenderD7::Color::RGBA2Hex(this->clr_tab[RD7Color_List0]); js["RD7Color_List1"] =
|
|
||||||
RenderD7::Color::RGBA2Hex(this->clr_tab[RD7Color_List1]); js["RD7Color_MessageBackground"] =
|
|
||||||
RenderD7::Color::RGBA2Hex(this->clr_tab[RD7Color_MessageBackground]); js["RD7Color_Button"] =
|
|
||||||
RenderD7::Color::RGBA2Hex(this->clr_tab[RD7Color_Button]); js["RD7Color_ButtonHovered"] =
|
|
||||||
RenderD7::Color::RGBA2Hex(this->clr_tab[RD7Color_ButtonHovered]);
|
|
||||||
js["RD7Color_ButtonDisabled"] =
|
|
||||||
RenderD7::Color::RGBA2Hex(this->clr_tab[RD7Color_ButtonDisabled]);
|
|
||||||
js["RD7Color_ButtonActive"] =
|
|
||||||
RenderD7::Color::RGBA2Hex(this->clr_tab[RD7Color_ButtonActive]); js["RD7Color_Checkmark"] =
|
|
||||||
RenderD7::Color::RGBA2Hex(this->clr_tab[RD7Color_Checkmark]); js["RD7Color_FrameBg"] =
|
|
||||||
RenderD7::Color::RGBA2Hex(this->clr_tab[RD7Color_FrameBg]); js["RD7Color_FrameBgHovered"] =
|
|
||||||
RenderD7::Color::RGBA2Hex(this->clr_tab[RD7Color_FrameBgHovered]); js["RD7Color_Progressbar"]
|
|
||||||
= RenderD7::Color::RGBA2Hex(this->clr_tab[RD7Color_Progressbar]);
|
|
||||||
// clang-format on
|
|
||||||
file << js.dump(4);
|
|
||||||
file.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
RenderD7::Theme::Ref RenderD7::ThemeActive() { return rd7i_active_theme; }
|
|
||||||
|
|
||||||
void RenderD7::ThemeSet(RenderD7::Theme::Ref theme) {
|
|
||||||
rd7i_active_theme = theme;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int RenderD7::Color::Hex(const std::string& color, uint8_t a) {
|
|
||||||
if (color.length() < 7 ||
|
|
||||||
std::find_if(color.begin() + 1, color.end(),
|
|
||||||
[](char c) { return !std::isxdigit(c); }) != color.end()) {
|
|
||||||
return RenderD7::Color::Hex("#000000", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int r = HEX_TO_DEC.at(color[1]) * 16 + HEX_TO_DEC.at(color[2]);
|
|
||||||
int g = HEX_TO_DEC.at(color[3]) * 16 + HEX_TO_DEC.at(color[4]);
|
|
||||||
int b = HEX_TO_DEC.at(color[5]) * 16 + HEX_TO_DEC.at(color[6]);
|
|
||||||
|
|
||||||
return RGBA8(r, g, b, a);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string RenderD7::Color::RGB2Hex(int r, int g, int b) {
|
|
||||||
std::stringstream ss;
|
|
||||||
ss << "#";
|
|
||||||
ss << std::hex << (r << 16 | g << 8 | b);
|
|
||||||
return ss.str();
|
|
||||||
}
|
|
@ -1,58 +0,0 @@
|
|||||||
#include <3ds.h>
|
|
||||||
|
|
||||||
#include <renderd7/Error.hpp>
|
|
||||||
#include <renderd7/UI7.hpp>
|
|
||||||
#include <renderd7/internal_db.hpp>
|
|
||||||
#include <renderd7/renderd7.hpp>
|
|
||||||
|
|
||||||
void rd7i_save_report(const std::string& msg) {
|
|
||||||
auto ts = RenderD7::GetTimeStr();
|
|
||||||
std::ofstream f("sdmc:/RenderD7/Reports/report_" + ts + ".txt");
|
|
||||||
f << "RenderD7 Error [" << rd7i_app_name << ", " << ts << "]" << std::endl;
|
|
||||||
f << "Error Message: " << std::endl;
|
|
||||||
f << msg << std::endl;
|
|
||||||
f << "SysInfo: " << std::endl;
|
|
||||||
f << "- Citra -> " << (rd7i_is_citra ? "true" : "false") << std::endl;
|
|
||||||
f.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
void Error(const std::string& msg) {
|
|
||||||
rd7i_save_report(msg);
|
|
||||||
if (rd7i_graphics_on) {
|
|
||||||
while (aptMainLoop()) {
|
|
||||||
hidScanInput();
|
|
||||||
if (hidKeysDown() & KEY_START) break;
|
|
||||||
C3D_FrameBegin(C3D_FRAME_SYNCDRAW);
|
|
||||||
RenderD7::ClearTextBufs();
|
|
||||||
C2D_TargetClear(rd7_top, 0x00000000);
|
|
||||||
C2D_TargetClear(rd7_bottom, 0x00000000);
|
|
||||||
RenderD7::R2()->OnScreen(R2Screen_Top);
|
|
||||||
if (UI7::BeginMenu("RenderD7 - Error Manager", R7Vec2(),
|
|
||||||
UI7MenuFlags_TitleMid)) {
|
|
||||||
UI7::Label(msg, RD7TextFlags_Wrap);
|
|
||||||
UI7::Label("Press Start to Exit!");
|
|
||||||
UI7::EndMenu();
|
|
||||||
}
|
|
||||||
RenderD7::R2()->OnScreen(R2Screen_Bottom);
|
|
||||||
UI7::Update();
|
|
||||||
RenderD7::R2()->Process();
|
|
||||||
C3D_FrameEnd(0);
|
|
||||||
}
|
|
||||||
exit(0);
|
|
||||||
} else {
|
|
||||||
gfxInitDefault();
|
|
||||||
consoleInit(GFX_TOP, NULL);
|
|
||||||
printf("RENDERD7 - ERROR MANAGER\n\n%s\n", msg.c_str());
|
|
||||||
printf("Report Saved in\nsdmc:/RenderD7/Reports\n");
|
|
||||||
printf("Press Start to Exit\n");
|
|
||||||
while (aptMainLoop()) {
|
|
||||||
hidScanInput();
|
|
||||||
if (hidKeysDown() & KEY_START) break;
|
|
||||||
gfxSwapBuffers();
|
|
||||||
}
|
|
||||||
gfxExit();
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} // namespace RenderD7
|
|
@ -1,70 +0,0 @@
|
|||||||
#include <3ds.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include <cstring>
|
|
||||||
#include <renderd7/FileSystem.hpp>
|
|
||||||
// Debugging
|
|
||||||
#include <algorithm>
|
|
||||||
#include <filesystem>
|
|
||||||
#include <renderd7/stringtool.hpp>
|
|
||||||
|
|
||||||
bool ___dir__predicate__(const RenderD7::FileSystem::Entry &lhs,
|
|
||||||
const RenderD7::FileSystem::Entry &rhs) {
|
|
||||||
if (!lhs.dir && rhs.dir) return false;
|
|
||||||
if (lhs.dir && !rhs.dir) return true;
|
|
||||||
std::string a = lhs.name;
|
|
||||||
std::string b = rhs.name;
|
|
||||||
std::transform(a.begin(), a.end(), a.begin(),
|
|
||||||
[](int i) { return std::tolower(i); });
|
|
||||||
std::transform(b.begin(), b.end(), b.begin(),
|
|
||||||
[](int i) { return std::tolower(i); });
|
|
||||||
return a.compare(b) < 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string RenderD7::FileSystem::GetParentPath(std::string path,
|
|
||||||
std::string mount_point) {
|
|
||||||
std::string tcl = path;
|
|
||||||
if (path.substr(path.length() - 1, 1) != "/") {
|
|
||||||
tcl += "/";
|
|
||||||
}
|
|
||||||
std::string res =
|
|
||||||
std::filesystem::path(tcl).parent_path().parent_path().string();
|
|
||||||
if (res.length() > mount_point.length()) {
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
return mount_point;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<RenderD7::FileSystem::Entry> RenderD7::FileSystem::GetDirContent(
|
|
||||||
std::string path) {
|
|
||||||
std::vector<RenderD7::FileSystem::Entry> res;
|
|
||||||
for (const auto &entry :
|
|
||||||
std::filesystem::directory_iterator(std::filesystem::path(path))) {
|
|
||||||
res.push_back({entry.path().string(), GetFileName(entry.path().string()),
|
|
||||||
entry.is_directory()});
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<RenderD7::FileSystem::Entry>
|
|
||||||
RenderD7::FileSystem::GetDirContentsExt(
|
|
||||||
std::string &path, const std::vector<std::string> &extensions) {
|
|
||||||
std::vector<RenderD7::FileSystem::Entry> res;
|
|
||||||
for (auto const &it :
|
|
||||||
std::filesystem::directory_iterator(std::filesystem::path(path))) {
|
|
||||||
RenderD7::FileSystem::Entry temp;
|
|
||||||
std::string fn = it.path().string();
|
|
||||||
temp.name = GetFileName(fn);
|
|
||||||
temp.path = it.path().string().c_str();
|
|
||||||
temp.dir = it.is_directory();
|
|
||||||
if (NameIsEndingWith(GetFileName(it.path().string()), extensions) ||
|
|
||||||
it.is_directory()) {
|
|
||||||
res.push_back(temp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
std::sort(res.begin(), res.end(), ___dir__predicate__);
|
|
||||||
return res;
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
#include <renderd7/FunctionTrace.hpp>
|
|
||||||
|
|
||||||
std::map<std::string, RenderD7::Ftrace::FTRes> RenderD7::Ftrace::rd7_traces;
|
|
@ -1,47 +0,0 @@
|
|||||||
#include <renderd7/Hardware.hpp>
|
|
||||||
#include <renderd7/internal_db.hpp>
|
|
||||||
|
|
||||||
// Os Specific includes
|
|
||||||
#include <3ds.h>
|
|
||||||
|
|
||||||
void RenderD7::Hardware::Initialisize() {
|
|
||||||
mcuHwcInit();
|
|
||||||
atexit(mcuHwcExit);
|
|
||||||
ptmuInit();
|
|
||||||
atexit(ptmuExit);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool RenderD7::Hardware::IsHeadphones() {
|
|
||||||
if (rd7i_is_ndsp) {
|
|
||||||
bool inserted;
|
|
||||||
DSP_GetHeadphoneStatus(&inserted);
|
|
||||||
return inserted;
|
|
||||||
} else
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool RenderD7::Hardware::IsCharging() {
|
|
||||||
uint8_t var;
|
|
||||||
PTMU_GetBatteryChargeState(&var);
|
|
||||||
// Some Security Stuff
|
|
||||||
if (var < 0x00 && var > 0x01) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return (var == 0x01 ? true : false);
|
|
||||||
}
|
|
||||||
|
|
||||||
int RenderD7::Hardware::GetBatteryPercentage() {
|
|
||||||
uint8_t percentLevel = 0;
|
|
||||||
MCUHWC_GetBatteryLevel(&percentLevel);
|
|
||||||
return percentLevel;
|
|
||||||
}
|
|
||||||
|
|
||||||
float RenderD7::Hardware::Get3dSliderLevel() { return osGet3DSliderState(); }
|
|
||||||
|
|
||||||
float RenderD7::Hardware::GetSoundSliderLevel() {
|
|
||||||
uint8_t percentLevel;
|
|
||||||
MCUHWC_GetSoundSliderLevel(&percentLevel);
|
|
||||||
return (float)percentLevel / 100;
|
|
||||||
}
|
|
||||||
|
|
||||||
int RenderD7::Hardware::GetWifiLevel() { return osGetWifiStrength(); }
|
|
120
source/Hid.cpp
120
source/Hid.cpp
@ -1,120 +0,0 @@
|
|||||||
#include <map>
|
|
||||||
#include <renderd7/Hid.hpp>
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
class HidApi {
|
|
||||||
public:
|
|
||||||
HidApi() {}
|
|
||||||
~HidApi() {}
|
|
||||||
|
|
||||||
void setKdown(uint32_t &in) { actions[Hid::Down] = ∈ }
|
|
||||||
void setKheld(uint32_t &in) { actions[Hid::Held] = ∈ }
|
|
||||||
void setKup(uint32_t &in) { actions[Hid::Up] = ∈ }
|
|
||||||
void setKrepeat(uint32_t &in) { actions[Hid::DownRepeat] = ∈ }
|
|
||||||
void setTouchCoords(R7Vec2 &touch_coords) { touch_pos = &touch_coords; }
|
|
||||||
void setJS1Movement(R7Vec2 &mvmt) { js1_mv = &mvmt; }
|
|
||||||
void setJS2Movement(R7Vec2 &mvmt) { js2_mv = &mvmt; }
|
|
||||||
void bindKey(const std::string &event, uint32_t key) {
|
|
||||||
key_bindings[event] = key; // Overrides if existing
|
|
||||||
}
|
|
||||||
void lock(bool lock) { locked = lock; }
|
|
||||||
|
|
||||||
void clear() {
|
|
||||||
// Clears Functionality for 1 Frame
|
|
||||||
last_touch_pos = R7Vec2();
|
|
||||||
touch_pos[0] = R7Vec2();
|
|
||||||
dtp = R7Vec2();
|
|
||||||
backups[Hid::Down] = 0;
|
|
||||||
backups[Hid::Held] = 0;
|
|
||||||
backups[Hid::Up] = 0;
|
|
||||||
backups[Hid::DownRepeat] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isEvent(const std::string &event, Hid::Actions action) {
|
|
||||||
if (locked) return false;
|
|
||||||
if (key_bindings.find(event) == key_bindings.end())
|
|
||||||
return false; // Unknown Event
|
|
||||||
if (backups.find(action) == backups.end())
|
|
||||||
return false; // What? NOT Alowed acrion
|
|
||||||
if (backups[action] & key_bindings[event])
|
|
||||||
return true; // Action contains key as flag
|
|
||||||
return false; // Nothing to do
|
|
||||||
}
|
|
||||||
|
|
||||||
R7Vec2 getTouchPos() { return touch_pos[0]; }
|
|
||||||
R7Vec2 getLastTouchPos() { return last_touch_pos; }
|
|
||||||
R7Vec2 getTouchDownPos() { return dtp; }
|
|
||||||
|
|
||||||
void update() {
|
|
||||||
last_touch_pos = touch_pos[0];
|
|
||||||
if (isEvent("touch", Hid::Down)) {
|
|
||||||
dtp = touch_pos[0];
|
|
||||||
}
|
|
||||||
if (isEvent("touch", Hid::Up)) {
|
|
||||||
dtp = R7Vec2();
|
|
||||||
}
|
|
||||||
for (const auto &it : actions) {
|
|
||||||
backups[it.first] = it.second[0];
|
|
||||||
}
|
|
||||||
if (locked) {
|
|
||||||
actions[Hid::Down][0] = 0;
|
|
||||||
actions[Hid::Held][0] = 0;
|
|
||||||
actions[Hid::Up][0] = 0;
|
|
||||||
actions[Hid::DownRepeat][0] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::map<Hid::Actions, uint32_t *> actions;
|
|
||||||
std::map<Hid::Actions, uint32_t> backups;
|
|
||||||
R7Vec2 *touch_pos = nullptr;
|
|
||||||
R7Vec2 *js1_mv = nullptr;
|
|
||||||
R7Vec2 *js2_mv = nullptr;
|
|
||||||
|
|
||||||
R7Vec2 last_touch_pos;
|
|
||||||
R7Vec2 dtp;
|
|
||||||
|
|
||||||
std::map<std::string, uint32_t> key_bindings;
|
|
||||||
bool locked = false;
|
|
||||||
};
|
|
||||||
static HidApi hid_handler;
|
|
||||||
namespace Hid {
|
|
||||||
// Register Functions
|
|
||||||
// Register Current state values
|
|
||||||
void RegKeyDown(uint32_t &key_down) { hid_handler.setKdown(key_down); }
|
|
||||||
|
|
||||||
void RegKeyHeld(uint32_t &key_held) { hid_handler.setKheld(key_held); }
|
|
||||||
|
|
||||||
void RegKeyUp(uint32_t &key_up) { hid_handler.setKup(key_up); }
|
|
||||||
|
|
||||||
void RegKeyRepeat(uint32_t &repeat) { hid_handler.setKrepeat(repeat); }
|
|
||||||
|
|
||||||
void RegTouchCoords(R7Vec2 &touch_pos) {
|
|
||||||
hid_handler.setTouchCoords(touch_pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
void RegAnalog1Movement(R7Vec2 &movement) {
|
|
||||||
hid_handler.setJS1Movement(movement);
|
|
||||||
}
|
|
||||||
|
|
||||||
void RegAnalog2Movement(R7Vec2 &movement) {
|
|
||||||
hid_handler.setJS2Movement(movement);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Register Keys
|
|
||||||
void RegKeyEvent(const std::string &event, uint32_t key) {
|
|
||||||
hid_handler.bindKey(event, key);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsEvent(const std::string &event, Actions action) {
|
|
||||||
return hid_handler.isEvent(event, action);
|
|
||||||
}
|
|
||||||
R7Vec2 GetTouchPosition() { return hid_handler.getTouchPos(); }
|
|
||||||
R7Vec2 GetLastTouchPosition() { return hid_handler.getLastTouchPos(); }
|
|
||||||
R7Vec2 GetTouchDownPosition() { return hid_handler.getTouchDownPos(); }
|
|
||||||
void Update() { hid_handler.update(); }
|
|
||||||
void Lock() { hid_handler.lock(true); }
|
|
||||||
void Unlock() { hid_handler.lock(false); }
|
|
||||||
void Clear() { hid_handler.clear(); }
|
|
||||||
} // namespace Hid
|
|
||||||
} // namespace RenderD7
|
|
181
source/Image.cpp
181
source/Image.cpp
@ -1,181 +0,0 @@
|
|||||||
#include <renderd7/external/stb_image.h>
|
|
||||||
|
|
||||||
#include <renderd7/Image.hpp>
|
|
||||||
#include <renderd7/internal_db.hpp>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
static u32 __rd7i_gp2o__(u32 v) {
|
|
||||||
v--;
|
|
||||||
v |= v >> 1;
|
|
||||||
v |= v >> 2;
|
|
||||||
v |= v >> 4;
|
|
||||||
v |= v >> 8;
|
|
||||||
v |= v >> 16;
|
|
||||||
v++;
|
|
||||||
return (v >= 64 ? v : 64);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __rd7i_r24r32(std::vector<uint8_t> &out,
|
|
||||||
const std::vector<uint8_t> &in, const int &w,
|
|
||||||
const int &h) {
|
|
||||||
// Converts RGB24 to RGBA32
|
|
||||||
for (int y = 0; y < h; y++) {
|
|
||||||
for (int x = 0; x < w; x++) {
|
|
||||||
int src = (y * w + x) * 3;
|
|
||||||
int dst = (y * w + x) * 4;
|
|
||||||
out[dst + 0] = in[src + 0];
|
|
||||||
out[dst + 1] = in[src + 1];
|
|
||||||
out[dst + 2] = in[src + 2];
|
|
||||||
out[dst + 3] = 255;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __rd7i_maketex__(C3D_Tex *tex, Tex3DS_SubTexture *sub,
|
|
||||||
std::vector<unsigned char> &buf, int w, int h) {
|
|
||||||
if (!tex || !sub) {
|
|
||||||
_rd7i_logger()->Write("Invalid Inpit (objects have no adress!)");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// RGBA -> Abgr
|
|
||||||
for (int y = 0; y < h; y++) {
|
|
||||||
for (int x = 0; x < w; x++) {
|
|
||||||
int pos = (x + y * w) * 4;
|
|
||||||
auto r = buf[pos + 0];
|
|
||||||
auto g = buf[pos + 1];
|
|
||||||
auto b = buf[pos + 2];
|
|
||||||
auto a = buf[pos + 3];
|
|
||||||
buf[pos + 0] = a;
|
|
||||||
buf[pos + 1] = b;
|
|
||||||
buf[pos + 2] = g;
|
|
||||||
buf[pos + 3] = r;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pow2
|
|
||||||
int wp2 = __rd7i_gp2o__((unsigned int)w);
|
|
||||||
int hp2 = __rd7i_gp2o__((unsigned int)h);
|
|
||||||
|
|
||||||
sub->width = (u16)w;
|
|
||||||
sub->height = (u16)h;
|
|
||||||
sub->left = 0.0f;
|
|
||||||
sub->top = 1.0f;
|
|
||||||
sub->right = ((float)w / (float)wp2);
|
|
||||||
sub->bottom = 1.0 - ((float)h / (float)hp2);
|
|
||||||
|
|
||||||
// Texture Setup
|
|
||||||
C3D_TexInit(tex, (u16)wp2, (u16)hp2, GPU_RGBA8);
|
|
||||||
C3D_TexSetFilter(tex, GPU_NEAREST, GPU_NEAREST);
|
|
||||||
|
|
||||||
memset(tex->data, 0, tex->size);
|
|
||||||
|
|
||||||
for (int x = 0; x < w; x++) {
|
|
||||||
for (int y = 0; y < h; y++) {
|
|
||||||
int dst_pos = ((((y >> 3) * (wp2 >> 3) + (x >> 3)) << 6) +
|
|
||||||
((x & 1) | ((y & 1) << 1) | ((x & 2) << 1) |
|
|
||||||
((y & 2) << 2) | ((x & 4) << 2) | ((y & 4) << 3))) *
|
|
||||||
4;
|
|
||||||
int src_pos = (y * w + x) * 4;
|
|
||||||
|
|
||||||
memcpy(&((unsigned char *)tex->data)[dst_pos], &buf[src_pos], 4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
C3D_TexFlush(tex);
|
|
||||||
tex->border = 0x00000000;
|
|
||||||
C3D_TexSetWrap(tex, GPU_CLAMP_TO_BORDER, GPU_CLAMP_TO_BORDER);
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
|
|
||||||
void Image::Load(const std::string &path) {
|
|
||||||
// Make sure to cleanup
|
|
||||||
Delete();
|
|
||||||
ext = false;
|
|
||||||
// Setup Func and Load Data
|
|
||||||
int w, h, c = 0;
|
|
||||||
unsigned char *image = stbi_load(path.c_str(), &w, &h, &c, 4);
|
|
||||||
if (image == nullptr) {
|
|
||||||
//_rd7i_logger()->Write("Failed to Load Image: " + path);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Size/Fmt Check
|
|
||||||
if (w > 1024 || h > 1024) {
|
|
||||||
// Reason: Image to Large
|
|
||||||
//_rd7i_logger()->Write("Image too Large!");
|
|
||||||
stbi_image_free(image);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<unsigned char> wimg;
|
|
||||||
if (c == 3) {
|
|
||||||
//_rd7i_logger()->Write("Convert Image to RGBA");
|
|
||||||
stbi_image_free(image);
|
|
||||||
image = stbi_load(path.c_str(), &w, &h, &c, 3);
|
|
||||||
wimg.resize(w * h * 4);
|
|
||||||
__rd7i_r24r32(wimg, std::vector<unsigned char>(image, image + (w * h * 3)),
|
|
||||||
w, h);
|
|
||||||
} else {
|
|
||||||
wimg.assign(&image[0], &image[(w * h * 4) - 1]);
|
|
||||||
stbi_image_free(image);
|
|
||||||
}
|
|
||||||
// Create C2D_Image
|
|
||||||
C3D_Tex *tex = new C3D_Tex;
|
|
||||||
Tex3DS_SubTexture *subtex = new Tex3DS_SubTexture;
|
|
||||||
__rd7i_maketex__(tex, subtex, wimg, w, h);
|
|
||||||
_rd7i_logger()->Write(RenderD7::FormatString("Created Texture (%d, %d)",
|
|
||||||
tex->width, tex->height));
|
|
||||||
img = {tex, subtex};
|
|
||||||
}
|
|
||||||
|
|
||||||
void Image::From_NIMG(const nimg &image) {
|
|
||||||
// Make sure to cleanup
|
|
||||||
Delete();
|
|
||||||
ext = false;
|
|
||||||
if (image.width > 1024 || image.height > 1024) return;
|
|
||||||
C3D_Tex *tex = new C3D_Tex;
|
|
||||||
Tex3DS_SubTexture *subtex = new Tex3DS_SubTexture;
|
|
||||||
std::vector<unsigned char> mdpb = image.pixel_buffer;
|
|
||||||
__rd7i_maketex__(tex, subtex, mdpb, image.width, image.height);
|
|
||||||
img = {tex, subtex};
|
|
||||||
}
|
|
||||||
|
|
||||||
C2D_Image Image::Get() {
|
|
||||||
if (!Loadet()) {
|
|
||||||
_rd7i_logger()->Write("Image not Loadet!");
|
|
||||||
}
|
|
||||||
return img;
|
|
||||||
}
|
|
||||||
C2D_Image &Image::GetRef() {
|
|
||||||
if (!Loadet()) {
|
|
||||||
_rd7i_logger()->Write("Image not Loadet!");
|
|
||||||
}
|
|
||||||
return img;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Image::Set(const C2D_Image &i) {
|
|
||||||
Delete();
|
|
||||||
ext = true;
|
|
||||||
img = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
R7Vec2 Image::GetSize() {
|
|
||||||
if (!img.subtex) return R7Vec2(0, 0);
|
|
||||||
return R7Vec2(img.subtex->width, img.subtex->height);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Image::Delete() {
|
|
||||||
if (ext) return;
|
|
||||||
if (img.subtex != nullptr) {
|
|
||||||
delete img.subtex;
|
|
||||||
img.subtex = nullptr;
|
|
||||||
}
|
|
||||||
if (img.tex != nullptr) {
|
|
||||||
C3D_TexDelete(img.tex);
|
|
||||||
delete img.tex;
|
|
||||||
img.tex = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Image::Loadet() { return (img.subtex != nullptr && img.tex != nullptr); }
|
|
||||||
} // namespace RenderD7
|
|
@ -1,149 +0,0 @@
|
|||||||
#include <3ds.h>
|
|
||||||
|
|
||||||
#include <renderd7/Installer.hpp>
|
|
||||||
#include <renderd7/internal_db.hpp>
|
|
||||||
|
|
||||||
namespace RenderD7 {
|
|
||||||
Result DeletePrevious(u64 id, FS_MediaType mt) {
|
|
||||||
if (!rd7i_is_am_init) return -1;
|
|
||||||
u32 num_titles = 0;
|
|
||||||
Result ret = AM_GetTitleCount(mt, &num_titles);
|
|
||||||
if (R_FAILED(ret)) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
u32 read_titles = 0;
|
|
||||||
auto ids = new u64[num_titles];
|
|
||||||
ret = AM_GetTitleList(&read_titles, mt, num_titles, ids);
|
|
||||||
|
|
||||||
if (R_FAILED(ret)) {
|
|
||||||
delete[] ids;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (u32 i = 0; i < read_titles; i++) {
|
|
||||||
if (ids[i] == id) {
|
|
||||||
ret = AM_DeleteAppTitle(mt, id);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
delete[] ids;
|
|
||||||
if (R_FAILED(ret)) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
FS_MediaType GetTitleDest(u64 id) {
|
|
||||||
u16 platform = (u16)((id >> 48) & 0xFFFF);
|
|
||||||
u16 category = (u16)((id >> 32) & 0xFFFF);
|
|
||||||
u8 variation = (u8)(id & 0xFF);
|
|
||||||
|
|
||||||
/* DSiWare 3DS DSiWare, System, DLP
|
|
||||||
* Application System Title */
|
|
||||||
return platform == 0x0003 || (platform == 0x0004 &&
|
|
||||||
((category & 0x8011) != 0 ||
|
|
||||||
(category == 0x0000 && variation == 0x02)))
|
|
||||||
? MEDIATYPE_NAND
|
|
||||||
: MEDIATYPE_SD;
|
|
||||||
}
|
|
||||||
|
|
||||||
InstallerInfo rd7i_installer_info;
|
|
||||||
|
|
||||||
InstallerInfo InstallGetInfo() { return rd7i_installer_info; }
|
|
||||||
|
|
||||||
void InstallSetBuffersSize(unsigned int bytes) {
|
|
||||||
if (rd7i_installer_info.active) return;
|
|
||||||
if (bytes == 0) return;
|
|
||||||
if (bytes >= 0x200000) bytes = 0x200000;
|
|
||||||
rd7i_installer_info.mem_size = bytes;
|
|
||||||
}
|
|
||||||
|
|
||||||
Result InstallCia(const std::string& path, bool self) {
|
|
||||||
if (!rd7i_is_am_init) return -1;
|
|
||||||
if (rd7i_installer_info.active) return -1;
|
|
||||||
u32 bytes_read = 0;
|
|
||||||
u32 bytes_written = 0;
|
|
||||||
rd7i_installer_info.current = 0;
|
|
||||||
// Set 1 to avoid div0 error
|
|
||||||
rd7i_installer_info.total = 1;
|
|
||||||
u64 size = 0;
|
|
||||||
Handle cia, file;
|
|
||||||
AM_TitleEntry info;
|
|
||||||
Result ret = 0;
|
|
||||||
FS_MediaType media = MEDIATYPE_SD;
|
|
||||||
|
|
||||||
std::string pth;
|
|
||||||
if (path[0] == '/') {
|
|
||||||
pth = path;
|
|
||||||
} else if (path.substr(0, 5) == "sdmc:") {
|
|
||||||
pth = path.substr(5);
|
|
||||||
} else {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = FSUSER_OpenFileDirectly(&file, ARCHIVE_SDMC, fsMakePath(PATH_EMPTY, ""),
|
|
||||||
fsMakePath(PATH_ASCII, pth.c_str()),
|
|
||||||
FS_OPEN_READ, 0);
|
|
||||||
|
|
||||||
if (R_FAILED(ret)) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = AM_GetCiaFileInfo(media, &info, file);
|
|
||||||
|
|
||||||
if (R_FAILED(ret)) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
media = GetTitleDest(info.titleID);
|
|
||||||
|
|
||||||
if (!self) {
|
|
||||||
ret = DeletePrevious(info.titleID, media);
|
|
||||||
if (R_FAILED(ret)) return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = FSFILE_GetSize(file, &size);
|
|
||||||
|
|
||||||
if (R_FAILED(ret)) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = AM_StartCiaInstall(media, &cia);
|
|
||||||
|
|
||||||
if (R_FAILED(ret)) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<unsigned char> buf(rd7i_installer_info.mem_size);
|
|
||||||
rd7i_installer_info.total = size;
|
|
||||||
|
|
||||||
do {
|
|
||||||
FSFILE_Read(file, &bytes_read, rd7i_installer_info.current, &buf[0],
|
|
||||||
buf.size());
|
|
||||||
FSFILE_Write(cia, &bytes_written, rd7i_installer_info.current, &buf[0],
|
|
||||||
buf.size(), FS_WRITE_FLUSH);
|
|
||||||
rd7i_installer_info.current += bytes_read;
|
|
||||||
} while (rd7i_installer_info.current < rd7i_installer_info.total);
|
|
||||||
|
|
||||||
ret = AM_FinishCiaInstall(cia);
|
|
||||||
|
|
||||||
if (R_FAILED(ret)) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = FSFILE_Close(file);
|
|
||||||
|
|
||||||
if (R_FAILED(ret)) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self) {
|
|
||||||
aptSetChainloaderToSelf();
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
} // namespace RenderD7
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user