big ol refactor
This commit is contained in:
131
assets/assets.go
131
assets/assets.go
@ -8,6 +8,72 @@ import (
|
||||
rl "github.com/gen2brain/raylib-go/raylib"
|
||||
)
|
||||
|
||||
// ModelLoader handles loading and fallback for 3D models
|
||||
type ModelLoader struct {
|
||||
safeMode bool
|
||||
}
|
||||
|
||||
// NewModelLoader creates a new model loader instance
|
||||
func NewModelLoader() *ModelLoader {
|
||||
return &ModelLoader{
|
||||
safeMode: os.Getenv("GOONSCAPE_SAFE_MODE") == "1",
|
||||
}
|
||||
}
|
||||
|
||||
// IsSafeMode returns if we should avoid loading external models
|
||||
func (ml *ModelLoader) IsSafeMode() bool {
|
||||
return ml.safeMode || os.Getenv("GOONSCAPE_SAFE_MODE") == "1"
|
||||
}
|
||||
|
||||
// LoadModel attempts to load a model, returning a placeholder if it fails
|
||||
func (ml *ModelLoader) LoadModel(fileName string, fallbackShape int, fallbackColor rl.Color) (rl.Model, bool, rl.Color) {
|
||||
// Don't even try to load external models in safe mode
|
||||
if ml.IsSafeMode() {
|
||||
rl.TraceLog(rl.LogInfo, "Safe mode enabled, using primitive shape instead of %s", fileName)
|
||||
return ml.createPrimitiveShape(fallbackShape), false, fallbackColor
|
||||
}
|
||||
|
||||
defer func() {
|
||||
// Recover from any panics during model loading
|
||||
if r := recover(); r != nil {
|
||||
rl.TraceLog(rl.LogError, "Panic in LoadModel: %v", r)
|
||||
}
|
||||
}()
|
||||
|
||||
// Try to load the model
|
||||
model := rl.LoadModel(fileName)
|
||||
|
||||
// Check if the model is valid
|
||||
if model.Meshes == nil || model.Meshes.VertexCount <= 0 {
|
||||
rl.TraceLog(rl.LogWarning, "Failed to load model %s, using placeholder", fileName)
|
||||
return ml.createPrimitiveShape(fallbackShape), false, fallbackColor
|
||||
}
|
||||
|
||||
// For real models, return zero color since we don't need it
|
||||
return model, true, rl.Color{}
|
||||
}
|
||||
|
||||
// createPrimitiveShape creates a simple shape without loading external models
|
||||
func (ml *ModelLoader) createPrimitiveShape(shapeType int) rl.Model {
|
||||
var mesh rl.Mesh
|
||||
|
||||
switch shapeType {
|
||||
case 0: // Cube
|
||||
mesh = rl.GenMeshCube(1.0, 2.0, 1.0)
|
||||
case 1: // Sphere
|
||||
mesh = rl.GenMeshSphere(1.0, 8, 8)
|
||||
case 2: // Cylinder
|
||||
mesh = rl.GenMeshCylinder(0.8, 2.0, 8)
|
||||
case 3: // Cone
|
||||
mesh = rl.GenMeshCone(1.0, 2.0, 8)
|
||||
default: // Default to cube
|
||||
mesh = rl.GenMeshCube(1.0, 2.0, 1.0)
|
||||
}
|
||||
|
||||
model := rl.LoadModelFromMesh(mesh)
|
||||
return model
|
||||
}
|
||||
|
||||
// Helper function to load animations for a model
|
||||
func loadModelAnimations(animPaths map[string]string) (types.AnimationSet, error) {
|
||||
var animSet types.AnimationSet
|
||||
@ -58,51 +124,8 @@ func CompletelyAvoidExternalModels() bool {
|
||||
|
||||
// SafeLoadModel attempts to load a model, returning a placeholder if it fails
|
||||
func SafeLoadModel(fileName string, fallbackShape int, fallbackColor rl.Color) (rl.Model, bool, rl.Color) {
|
||||
// Don't even try to load external models in safe mode
|
||||
if CompletelyAvoidExternalModels() {
|
||||
rl.TraceLog(rl.LogInfo, "Safe mode enabled, using primitive shape instead of %s", fileName)
|
||||
return createPrimitiveShape(fallbackShape), false, fallbackColor
|
||||
}
|
||||
|
||||
defer func() {
|
||||
// Recover from any panics during model loading
|
||||
if r := recover(); r != nil {
|
||||
rl.TraceLog(rl.LogError, "Panic in SafeLoadModel: %v", r)
|
||||
}
|
||||
}()
|
||||
|
||||
// Try to load the model
|
||||
model := rl.LoadModel(fileName)
|
||||
|
||||
// Check if the model is valid
|
||||
if model.Meshes == nil || model.Meshes.VertexCount <= 0 {
|
||||
rl.TraceLog(rl.LogWarning, "Failed to load model %s, using placeholder", fileName)
|
||||
return createPrimitiveShape(fallbackShape), false, fallbackColor
|
||||
}
|
||||
|
||||
// For real models, return zero color since we don't need it
|
||||
return model, true, rl.Color{}
|
||||
}
|
||||
|
||||
// createPrimitiveShape creates a simple shape without loading external models
|
||||
func createPrimitiveShape(shapeType int) rl.Model {
|
||||
var mesh rl.Mesh
|
||||
|
||||
switch shapeType {
|
||||
case 0: // Cube
|
||||
mesh = rl.GenMeshCube(1.0, 2.0, 1.0)
|
||||
case 1: // Sphere
|
||||
mesh = rl.GenMeshSphere(1.0, 8, 8)
|
||||
case 2: // Cylinder
|
||||
mesh = rl.GenMeshCylinder(0.8, 2.0, 8)
|
||||
case 3: // Cone
|
||||
mesh = rl.GenMeshCone(1.0, 2.0, 8)
|
||||
default: // Default to cube
|
||||
mesh = rl.GenMeshCube(1.0, 2.0, 1.0)
|
||||
}
|
||||
|
||||
model := rl.LoadModelFromMesh(mesh)
|
||||
return model
|
||||
loader := NewModelLoader()
|
||||
return loader.LoadModel(fileName, fallbackShape, fallbackColor)
|
||||
}
|
||||
|
||||
func LoadModels() ([]types.ModelAsset, error) {
|
||||
@ -110,9 +133,7 @@ func LoadModels() ([]types.ModelAsset, error) {
|
||||
os.Setenv("GOONSCAPE_SAFE_MODE", "1")
|
||||
|
||||
models := make([]types.ModelAsset, 0, 3)
|
||||
|
||||
// Use environment variable to completely disable model loading
|
||||
safeMode := CompletelyAvoidExternalModels()
|
||||
modelLoader := NewModelLoader()
|
||||
|
||||
// Colors for the different models
|
||||
goonerColor := rl.Color{R: 255, G: 200, B: 200, A: 255} // Pinkish
|
||||
@ -120,9 +141,9 @@ func LoadModels() ([]types.ModelAsset, error) {
|
||||
shrekeColor := rl.Color{R: 180, G: 255, B: 180, A: 255} // Light green
|
||||
|
||||
// If in safe mode, create all models directly without loading
|
||||
if safeMode {
|
||||
if modelLoader.IsSafeMode() {
|
||||
// Gooner model (cube)
|
||||
cube := createPrimitiveShape(0)
|
||||
cube := modelLoader.createPrimitiveShape(0)
|
||||
models = append(models, types.ModelAsset{
|
||||
Model: cube,
|
||||
YOffset: 0.0,
|
||||
@ -130,7 +151,7 @@ func LoadModels() ([]types.ModelAsset, error) {
|
||||
})
|
||||
|
||||
// Coomer model (sphere)
|
||||
sphere := createPrimitiveShape(1)
|
||||
sphere := modelLoader.createPrimitiveShape(1)
|
||||
models = append(models, types.ModelAsset{
|
||||
Model: sphere,
|
||||
YOffset: -4.0,
|
||||
@ -138,7 +159,7 @@ func LoadModels() ([]types.ModelAsset, error) {
|
||||
})
|
||||
|
||||
// Shreke model (cylinder)
|
||||
cylinder := createPrimitiveShape(2)
|
||||
cylinder := modelLoader.createPrimitiveShape(2)
|
||||
models = append(models, types.ModelAsset{
|
||||
Model: cylinder,
|
||||
YOffset: 0.0,
|
||||
@ -154,7 +175,7 @@ func LoadModels() ([]types.ModelAsset, error) {
|
||||
var success bool
|
||||
var modelColor rl.Color
|
||||
|
||||
goonerModel, success, modelColor = SafeLoadModel("resources/models/gooner/walk_no_y_transform.glb", 0, goonerColor)
|
||||
goonerModel, success, modelColor = modelLoader.LoadModel("resources/models/gooner/walk_no_y_transform.glb", 0, goonerColor)
|
||||
|
||||
// Create animations only if model was loaded successfully
|
||||
var goonerAnims types.AnimationSet
|
||||
@ -184,7 +205,7 @@ func LoadModels() ([]types.ModelAsset, error) {
|
||||
|
||||
// Coomer model with safe loading - using a sphere shape
|
||||
var coomerModel rl.Model
|
||||
coomerModel, success, modelColor = SafeLoadModel("resources/models/coomer/idle_notransy.glb", 1, coomerColor)
|
||||
coomerModel, success, modelColor = modelLoader.LoadModel("resources/models/coomer/idle_notransy.glb", 1, coomerColor)
|
||||
|
||||
if success {
|
||||
// Only load animations if the model loaded successfully
|
||||
@ -219,7 +240,7 @@ func LoadModels() ([]types.ModelAsset, error) {
|
||||
|
||||
// Shreke model with safe loading - using a cylinder shape
|
||||
var shrekeModel rl.Model
|
||||
shrekeModel, success, modelColor = SafeLoadModel("resources/models/shreke.obj", 2, shrekeColor)
|
||||
shrekeModel, success, modelColor = modelLoader.LoadModel("resources/models/shreke.obj", 2, shrekeColor)
|
||||
|
||||
if success {
|
||||
// Only proceed with texture if model loaded
|
||||
|
Reference in New Issue
Block a user