This commit is contained in:
torsten 2026-02-21 11:02:49 +01:00
parent 08eb83a0a5
commit 34d27386d5
19 changed files with 9136 additions and 10496 deletions

File diff suppressed because it is too large Load diff

View file

@ -1,7 +1,7 @@
{
"id": "calc-craft",
"name": "CalcCraft",
"version": "2.2.7",
"version": "2.3.7",
"minAppVersion": "0.15.0",
"description": "have formulas like in excel a1+a2, or sum()",
"author": "klaudyu",

View file

@ -120,23 +120,25 @@ td.label-cell.row {
/* Hide original text when showing computed value */
.cm-table-widget .table-cell-wrapper.calc-overlay-cell:not(:focus-within) {
position: relative;
color: transparent;
font-size: 0; /* Collapse the text so it doesn't affect layout */
line-height: 0;
}
/* Base overlay - inherits color from parent cell */
.cm-table-widget .table-cell-wrapper.calc-overlay-cell:not(:focus-within)::after {
content: attr(data-calc-display);
position: absolute;
inset: 0;
display: flex;
align-items: center;
white-space: pre;
color: inherit; /* ← Changed from var(--text-normal) to inherit */
pointer-events: none;
padding: 0 4px;
content: attr(data-calc-display);
position: relative; /* Changed from absolute */
display: inline-block; /* Changed to allow sizing */
white-space: pre;
color: inherit;
font-size: 1rem; /* Restore normal font size */
line-height: normal; /* Restore normal line height */
padding: 0 4px;
vertical-align: middle;
}
/* Formula cell overlays - inherit formula colors */
.cm-table-widget .formula-cell-colorenabled .table-cell-wrapper.calc-overlay-cell:not(:focus-within)::after {
color: var(--CalcCraft_formula_font_color_light);
@ -181,3 +183,54 @@ td.label-cell.row {
.theme-dark .cm-table-widget .cell-children-highlight .table-cell-wrapper.calc-overlay-cell:not(:focus-within)::after {
color: var(--CalcCraft_formula_font_children_dark);
}
/* Make table cells position relative for absolute positioning of labels */
table th,
table td {
position: relative;
}
/* Add padding to table to make room for labels */
table {
margin-left: 25px;
margin-top: 20px;
}
/* Column labels - display above th/td elements */
th[data-col-letter]::before,
td[data-col-letter]::before {
content: attr(data-col-letter);
position: absolute;
top: -18px;
left: 50%;
transform: translateX(-50%);
font-size: 0.75em;
color: var(--text-muted);
font-weight: normal;
pointer-events: none;
white-space: nowrap;
z-index: 1;
}
/* Row labels - display to the left of first cell in each row */
tr th:first-child[data-row-number]::after,
tr td:first-child[data-row-number]::after {
content: attr(data-row-number);
position: absolute;
left: -25px;
top: 50%;
#transform: translateY(-50%);
font-size: 0.75em;
color: var(--text-muted);
font-weight: normal;
pointer-events: none;
white-space: nowrap;
}
/* Escaped text cells - look like normal text, not formulas */
.cm-table-widget .escaped-text-cell .table-cell-wrapper.calc-overlay-cell:not(:focus-within)::after {
color: var(--text-normal); /* Normal text color, not formula color */
}

View file

@ -10,27 +10,53 @@ class GdscriptSyntaxPlugin extends obsidian.Plugin {
// onload, so continue to try and define the language until it is.
const setupInterval = setInterval(() => {
if (CodeMirror && CodeMirror.defineSimpleMode) {
const KEYWORDS = new Set([
'and','as','assert','await','break','breakpoint','const','continue','elif','else','enum',
'for','if','in','master','mastersync','match','not','null','or','pass','preload',
'puppet','puppetsync','remote','remotesync','return','self','setget','static','tool',
'var','while','yield'
]);
const mode = {
start: [
{ regex: /\b0x[0-9a-f]+\b/i, token: "number" },
{ regex: /\b-?\d+\b/, token: "number" },
{ regex: /\b0x[0-9a-f]+\b/i, token: 'number' },
{ regex: /\b-?\d+\b/, token: 'number' },
{ regex: /#.+/, token: 'comment' },
{ regex: /\s*(@onready|@export)\b/, token: 'keyword' },
{ regex: /\b(?:and|as|assert|await|break|breakpoint|const|continue|elif|else|enum|for|if|in|is|master|mastersync|match|not|null|or|pass|preload|puppet|puppetsync|remote|remotesync|return|self|setget|static|tool|var|while|yield)\b/, token: 'keyword' },
{ regex: /[()\[\]{},]/, token: "meta" },
{ regex: /[()\[\]{},]/, token: 'meta' },
// The words following func, class_name and class should be highlighted as attributes,
// so push onto the definition stack
{ regex: /\b(func|class_name|class|extends|signal)\b/, token: "keyword", push: "definition" },
{ regex: /\b(func|class_name|class|extends|signal|is)\b/, token: 'keyword', push: 'definition' },
{ regex: /@?(?:("|')(?:(?!\1)[^\n\\]|\\[\s\S])*\1(?!"|')|"""(?:[^\\]|\\[\s\S])*?""")/, token: "string" },
{ regex: /@?(?:("|')(?:(?!\1)[^\n\\]|\\[\s\S])*\1(?!"|')|"""(?:[^\\]|\\[\s\S])*?""")/, token: 'string' },
{ regex: /\$[\w\/]+\b/, token: 'variable' },
{ regex: /\:[\s]*$/, token: 'operator' },
{ regex: /\:[ ]*/, token: 'meta', push: 'var_type' },
{ regex: /\->[ ]*/, token: 'operator', push: 'definition' },
{ regex: /\+|\*|-|\/|:=|>|<|\^|&|\||%|~|=/, token: "operator" },
{ regex: /\+|\*|-|\/|:=|>|<|\^|&|\||%|~|=/, token: 'operator' },
{ regex: /\b(?:false|true)\b/, token: 'number' },
{ regex: /\b[A-Z][A-Z_\d]*\b/, token: 'operator' },
// Function calls on objects: object.doSomething()
{
regex: /(\.)([A-Za-z_]\w*)(?=\s*\()/,
token: ['operator', 'variable'],
},
// Normal function calls: doSomething()
{
regex: /[A-Za-z_]\w*(?=\s*\()/,
token: 'variable',
},
{
regex: /[A-Za-z_]\w*/,
token: (match) => {
const word = Array.isArray(match) ? match[0] : match;
return KEYWORDS.has(word) ? 'keyword' : null;
}
},
],
var_type: [
{ regex: /(\w+)/, token: 'attribute', pop: true },

View file

@ -6,5 +6,5 @@
"isDesktopOnly": false,
"minAppVersion": "1.5.12",
"name": "GDScript Syntax Highlighting",
"version": "1.0.3"
"version": "1.1.0"
}

View file

@ -1,4 +1,6 @@
{
"copyLinkToElemenetAnchorTo100": false,
"copyFrameLinkByName": false,
"disableDoubleClickTextEditing": false,
"folder": "",
"cropFolder": "",
@ -39,6 +41,9 @@
"overrideObsidianFontSize": false,
"dynamicStyling": "colorful",
"isLeftHanded": false,
"desktopUIMode": "tray",
"tabletUIMode": "compact",
"phoneUIMode": "mobile",
"iframeMatchExcalidrawTheme": true,
"matchTheme": false,
"matchThemeAlways": false,
@ -72,6 +77,7 @@
"focusOnFileTab": true,
"openInMainWorkspace": true,
"showLinkBrackets": true,
"syncElementLinkWithText": false,
"allowCtrlClick": true,
"forceWrap": false,
"pageTransclusionCharLimit": 200,
@ -119,9 +125,7 @@
"mdBorderColor": "Black",
"mdCSS": "",
"scriptEngineSettings": {},
"defaultTrayMode": true,
"compactModeOnTablets": true,
"previousRelease": "2.16.1",
"previousRelease": "2.20.5",
"showReleaseNotes": true,
"compareManifestToPluginVersion": true,
"showNewVersionNotification": true,
@ -130,6 +134,7 @@
"taskboneEnabled": false,
"taskboneAPIkey": "",
"pinnedScripts": [],
"sidepanelTabs": [],
"customPens": [
{
"type": "default",
@ -484,6 +489,7 @@
"aiEnabled": true,
"openAIAPIToken": "",
"openAIDefaultTextModel": "gpt-3.5-turbo-1106",
"openAIDefaultTextModelMaxTokens": 4096,
"openAIDefaultVisionModel": "gpt-4o",
"openAIDefaultImageGenerationModel": "dall-e-3",
"openAIURL": "https://api.openai.com/v1/chat/completions",
@ -811,6 +817,9 @@
"alignment": "center",
"margin": "normal"
},
"disableContextMenu": false,
"defaultTrayMode": true,
"compactModeOnTablets": true,
"autosaveInterval": 15000,
"mathjaxSourceURL": "https://cdn.jsdelivr.net/npm/mathjax@3.2.1/es5/tex-svg.js"
}

File diff suppressed because one or more lines are too long

View file

@ -1,9 +1,9 @@
{
"id": "obsidian-excalidraw-plugin",
"name": "Excalidraw",
"version": "2.16.1",
"version": "2.20.5",
"minAppVersion": "1.5.7",
"description": "An Obsidian plugin to edit and view Excalidraw drawings",
"description": "Sketch Your Mind. An Obsidian plugin to edit and view Excalidraw drawings. Enter the world of 4D Visual PKM.",
"author": "Zsolt Viczian",
"authorUrl": "https://excalidraw-obsidian.online",
"fundingUrl": "https://ko-fi.com/zsolt",

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,126 @@
Hier ist dein **"Asset-Zoll"** – eine kompakte Checkliste, die du als `README.md` direkt in deinen Projektordner legen kannst. Sie dient als deine **Pillar**, damit du nach drei Monaten Pause nicht erst googeln musst, warum die Texturen in Godot plötzlich lila sind oder das Haus so groß wie ein Planet ist.
---
## 🛂 Die Asset-Zoll Checkliste (Blender 5 ➔ Godot 4.6)
Bevor ein (gekauftes) Asset in die Spielwelt darf, muss es diese Stationen durchlaufen:
### 1. Die Blender-Inspektion (Vorbereitung)
- [ ] **Scale & Rotation:** `Strg + A` -> _All Transforms_. (Scale muss auf 1.0 stehen, sonst spielt die Physik in Godot verrückt).
- [ ] **Ausrichtung:** Die Nase des Modells zeigt in Blender nach **-Z** (Forward), der Kopf nach **+Y** (Up).
- [ ] **Mesh-Check:** `M` -> _Merge by Distance_ (entfernt doppelte Vertices, die oft in Kauf-Assets stecken).
- [ ] **Material-Namen:** Gib Materialien sprechende Namen (z.B. `M_Stone_Dark`). Vermeide "Material.001".
### 2. Die Godot-Automatisierung (Suffixe)
Nutze Godots Import-Hints direkt in Blender, um dir Klickarbeit zu sparen. Benenne die Objekte im Outliner um:
- [ ] **Kollision:** Anhängsel `-col` am Objektnamen (erzeugt automatisch ein _StaticBody_ + _CollisionShape_).
- [ ] **Navigation:** Anhängsel `-navmesh` (für KI-Laufwege).
- [ ] **Details:** `-noimp` (falls du Hilfsobjekte hast, die nicht exportiert werden sollen).
### 3. Der Export (GLTF 2.0)
- [ ] **Format:** `.glb` (ist meist kompakter und performanter für Godot).
- [ ] **Include:** _Selected Objects_ (verhindert, dass die Blender-Kamera mit im Spiel landet).
- [ ] **Data:** _UVs_, _Normals_ und _Vertex Colors_ müssen angehakt sein.
### 4. Die Godot-Ankunft (Import-Tab)
- [ ] **Import As:** Wähle zwischen `Static Body` (für Häuser/Deko) oder `Scene` (für Interaktives).
- [ ] **Material Storage:** Stelle auf `Files (.tres)` um, wenn du die Materialien in Godot finetunen willst, ohne dass Blender sie beim nächsten Re-Import überschreibt.
---
### Dein nächster "Playground" Schritt:
Suche dir ein gekauftes Asset aus, das dir gefällt (z.B. eine Kiste oder eine Säule). Versuche, es **nur mit dieser Checkliste** innerhalb von 5 Minuten fehlerfrei nach Godot zu bringen, inklusive funktionierender Kollision.
Um ein NWN-ähnliches Spiel mit Assets aus verschiedenen Quellen stimmig wirken zu lassen, ist ein **Master-Material** (in Godot: _Global Shader_ oder ein _Base Material Override_) deine wichtigste **Pillar**.
Gekaufte Assets kommen oft mit völlig unterschiedlichen Glanzwerten oder Sättigungen. Wenn du sie einfach so zusammenwürfelst, sieht es aus wie ein bunter Flickenteppich.
Hier ist die Strategie, wie du ein einheitliches "Look & Feel" erzwingst:
---
### 1. Die Pillar: Das "Standard3DMaterial" Preset
Anstatt jedes Asset einzeln anzupassen, erstellst du ein **Basis-Template**, das die Assets "bändigt".
**Schritt-für-Schritt in Godot 4.6:**
1. Erstelle im Dateisystem einen neuen Ordner `Resources/Materials`.
2. Rechtsklick -> **New Resource** -> **StandardMaterial3D**. Nenne es `M_Global_Base.tres`.
3. Aktiviere unter **Proximity Fade** (für weiche Übergänge am Boden) oder **Distance Fade**, falls du Objekte sanft ausblenden willst.
4. **Wichtig für den NWN-Look:** Gehe zu **Sampling** und setze den _Filter_ auf `Nearest` (für einen leicht pixeligen Retro-Look) oder `Linear` (für modernen Look).
5. **Shading:** Setze _Diffuse Mode_ auf `Burley` und _Specular Mode_ auf `SchlickGGX`.
### 2. Der "Bändiger"-Trick (Material Override)
Wenn du ein gekauftes Haus-Asset in deine Szene ziehst, hat es oft schon 10 Materialien dabei. Anstatt alle 10 zu ändern:
- Klicke das Mesh im Inspektor an.
- Suche das Feld **Geometry** -> **Material Override**.
- Ziehe dein `M_Global_Base.tres` dort hinein.
- **Das Problem:** Jetzt ist alles einfarbig.
- **Die Lösung:** Nutze **Material Variations**. Rechtsklick auf dein `M_Global_Base.tres` -> **New Inherited Resource**. So behältst du die Grundeinstellungen (wie Schatten-Logik oder Glanz), kannst aber die Textur für das spezifische Haus austauschen.
### 3. Der Playground: Die "Atmosphären-Box"
Hier kommt der Spieltrieb ins Spiel. Erschaffe eine kleine Test-Umgebung, um den Look zu kalibrieren.
- **Experiment:** Erstelle eine `WorldEnvironment` Node.
- **Spiel mit den "Götter-Reglern":**
- **Tonemap:** Stelle sie auf `Filmic` oder `ACES`. Das lässt billige Assets sofort hochwertiger wirken.
- **SSAO (Ambient Occlusion):** Schalte es ein! Das erzeugt dunkle Schatten in den Ecken, wo Objekte den Boden berühren. Das "erdet" gekaufte Assets in deiner Welt.
- **Fog (Nebel):** Nutze _Volumetric Fog_. Ein leichter bläulicher Nebel lässt die Distanz Tiefe gewinnen (sehr wichtig für die NWN-Perspektive von oben).
---
### Dein Tracking-Tipp für das Lab-Journal:
Schreibe dir eine **"Look-Referenz"** auf:
> _"Meine Welt nutzt immer Tonemap: ACES, Exposure: 1.2 und SSAO Intensity: 1.5. Wenn ich in 3 Monaten zurückkomme und alles flach aussieht – check die WorldEnvironment!"_
---
### Nächster Schritt für dich:
Da NWN ein **Top-Down/Isometrisches** Spiel ist, ist die Kamera-Perspektive entscheidend für den Look der Assets.
**Soll ich dir ein kleines Godot-Script schreiben, mit dem du eine "NWN-Style" Kamera erstellst, die dem Spieler folgt und sich per Mausrad drehen/zoomen lässt?** (Das wäre ein super Playground-Projekt für den nächsten Einstieg!)

View file

@ -0,0 +1,3 @@
`sudo apt update`
`sudo apt install git-lfs`
`git lfs install`

View file

@ -0,0 +1 @@
Anwendung der Pillar & Playground Strategie ( Fundament & Freiraum )

View file

@ -0,0 +1,26 @@
1_add_repo.sh
```bash
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
```
2_install_docker.sh
```bash
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```
3_install_forgejo.sh
```bash
docker pull codeberg.org/forgejo/forgejo:11.0.1
```

View file

@ -1,2 +0,0 @@
DAZ Studio -> Rendering
Con: Zum Preis jeden Asset Einkaufs kommt noch die Interactive License mit 50€ pro pop dazu. TEUER !!!

View file

@ -1,46 +0,0 @@
==___Question:___==
**If i decide on using blender for rigging and animation, so i only need 3d models, is there a more efficient way to obtain models ?**
==___Answer:___==
**If you only need 3D models (without pre-rigged or pre-animated assets) and plan to handle rigging and animation yourself in Blender, you can pursue more cost-effective and efficient options focused purely on high-quality base meshes or character models. This approach can save costs since rigged and animated assets generally command premium prices.**
## More Efficient Ways to Obtain Models for Blender Rigging/Animation
1. **Buy Base Human Models / Character Meshes Only**
- Many asset stores offer detailed, high-poly or game-ready base human models without rigging and animations.
- These are usually priced lower than fully rigged/animated characters.
- Examples: CGTrader, TurboSquid, Sketchfab, and specialized artists on ArtStation.
- You can filter searches specifically for “non-rigged” or “base mesh” to save money.
2. **Use Free High-Quality 3D Human Base Meshes**
- Some communities and projects offer free or affordable high-quality base meshes suitable for rigging.
- Examples include MakeHuman (free customizable human models), ManuelBastioniLAB (Blender add-on for characters), or open-source character base meshes.
- These can be imported directly into Blender for rigging and animation.
3. **Purchase Modular Character Parts or Assets**
- Instead of full characters, consider modular parts (head, torso, limbs, clothes) that you assemble and customize in Blender.
- This can increase variety and cost efficiency by reusing parts across multiple characters.
4. **Use Subscription or Asset Libraries**
- Subscriptions to services like CG Cookie, Quixel Megascans, or Sketchfab Pro might provide access to large libraries of human models you can use for Blender rigging.
- This is economical if you require many models over time.
5. **Commission Bulk Models from Artists**
- Hiring freelance 3D artists for bulk base models might be more cost-effective depending on scale and quality needs.
- Platforms like Fiverr, Upwork, or ArtStation commissions can help here.
## Advantages of This Approach
- Significant cost savings compared to buying fully rigged/animated characters.
- Full control over rigging and animation quality and style in Blender.
- Flexibility in customization and equipment integration.
## Summary
If you plan to do your own rigging and animation in Blender, the most efficient way is to acquire base human 3D models only, either via lower-cost purchases, free high-quality base meshes, or modular asset packs. This cuts costs drastically compared to bundled rigged/animated assets like Reallusion’s and gives you the highest workflow control and customization power in Blender.[my3dmodels+2](https://my3dmodels.com/blogs/3d-world/the-ultimate-guide-to-free-and-paid-3d-human-models-for-your-next-project)​
1. [https://my3dmodels.com/blogs/3d-world/the-ultimate-guide-to-free-and-paid-3d-human-models-for-your-next-project](https://my3dmodels.com/blogs/3d-world/the-ultimate-guide-to-free-and-paid-3d-human-models-for-your-next-project)
2. [https://discussions.reallusion.com/t/godot-import-recommendations/14175](https://discussions.reallusion.com/t/godot-import-recommendations/14175)
3. [https://www.reddit.com/r/godot/comments/1icyqbl/character_creation_software_options_for_godot/](https://www.reddit.com/r/godot/comments/1icyqbl/character_creation_software_options_for_godot/)

View file

@ -1,11 +0,0 @@
Minimalistic
Client & Server in einem
2D mit gerenderter Grafik
Designanspruch: Minimalistisch, maximal erweiterbar, mit simpler Struktur
Eingekaufte Grafik, Rendering in Blender
Avatars:
Part 1: 1 Avatar, HumanGenerator, AutoRigPro, Mixamo Geh, Kampf, Sterbe-Animation
Part 2: Reallusion Investment