Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

31

14.05.2012, 23:21

So eben habe ich die erste Beta Version meines Editor hochgeladen (v.1.0-beta). Ein paar der Kritik Punkte habe ich mir genauer angesehen und versucht, in der neuen Version zu verbessern.
Hier könnt ihr euch auch das neue in Kürze ansehen.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

32

05.03.2013, 22:58

Da ich zur Zeit mal wieder an meinem Editor arbeite, wollte ich euch hier kurz erläutern, wie ihr mit dem SpSbImportExport Plugin Szenen, die mit dem SoftPixel Sandbox Editor erstellt wurden, laden könnt.
Die Source Files im oben angegebenen Link, könnt ihr ohne jegliche Abhängigkeiten kompilieren.
(Die CMake Datei nutzt euch nur etwas zusammen mit der SoftPixel Engine)
Erstellt entweder eine Bibliothek (Statisch oder Dynamisch) oder kompiert dieses C++ Dateien einfach mit in euer Projekt.

Was dieses Plugin macht, ist die SPSB Level Dateien zu laden und die Daten strukturiert an euer Programm zu übertragen.
Ich habe vorhin kurz einen kleinen Ansatz mit der Irrlicht Engine gemacht, den Code dazu seht ihr weiter unten.

Der Vorteil hierbei ist vor Allem, dass der Loader abwärts kompatibel ist und ihr immer die gleichen Strukturen erhaltet, egal in welcher Version die Szene gespeichert wurde.
In der Datei spsFormatStructures.h findet ihr alle relevanten Daten Strukturen.
Allgemein gibt's auch eine SPSB File Format Spec, das ich in meinem Forum gepostet habe.
Doch das Format an sich, braucht ihr nicht unbedingt zu kennen.

Um die geladenen Objekt-Daten abzufangen, müsst ihr einfach die ganzen "Catch..." Funktionen in eurer abgeleiteten Loader-Klasse überladen.
Im Code-Beispiel seht ihr das an der "CatchMesh" Funktion. Die Standard Funktionen sind alle Dummies - machen also nichts, weil ja keine 3D Engine integriert ist.


Die Idee bei dem ganzen ist, dass man meinen Editor besonders leicht auch mit Ogre3D, Irrlicht oder anderen 3D Engines nutzen kann.
Zumindest um die Level zu erstellen :-D

Ich hoffe der ein oder andere probiert das mal aus. Viel Spaß ;)


BTW: Bald gibt's im Editor auch einen schicken MeshBrowser :D


Hier das Code Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
//
// ========== "SoftPixel Sandbox" Level Loader Example for "Irrlicht Engine 1.8" - (05/03/2013) ==========
//

#include <irrlicht.h>

#include "SpSbImportExport/spsImporter.h"

using namespace irr;

using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;


/* === Global members === */

IrrlichtDevice* irrDevice = 0;

IVideoDriver* irrDriver = 0;
ISceneManager* irrSmngr = 0;


/* === Global functions === */

IMeshSceneNode* LoadMesh(const std::string &Filename)
{
    IAnimatedMesh* mesh = irrSmngr->getMesh(stringc(Filename.c_str()));
    
    if (mesh)
        return irrSmngr->addMeshSceneNode(mesh);
    
    return 0;
}


/* === Classes === */

using namespace sps;

class SpSbLoader : public SpSceneImporter
{
    
    public:
        
        SpSbLoader() : SpSceneImporter()
        {
        }
        ~SpSbLoader()
        {
        }
        
    private:
        
        /* === Functions === */
        
        void SetupBaseObject(ISceneNode* Node, const SpBaseObject &ObjectDesc)
        {
            if (Node)
            {
                Node->setPosition(Convert(ObjectDesc.Position));
                Node->setRotation(Convert(ObjectDesc.Rotation).getRotationDegrees());
                Node->setScale(Convert(ObjectDesc.Scaling));
            }
        }
        
        bool CatchMesh(const SpMesh &Object)
        {
            switch (Object.Construct.BuildType)
            {
                case 1:
                {
                    if (Object.Construct.BasicMesh.BasicMeshType == 0)
                    {
                        IMeshSceneNode* Node = irrSmngr->addCubeSceneNode(1.0f);
                        SetupBaseObject(Node, Object.BaseObject);
                    }
                }
                break;
                
                case 3:
                {
                    IMeshSceneNode* Node = LoadMesh(Object.Construct.ResourceMesh.Filename);
                    
                    if (Node)
                    {
                        SetupBaseObject(Node, Object.BaseObject);
                        Node->setMaterialFlag(EMF_LIGHTING, false);
                    }
                }
                break;
            }
            return true;
        }
        
        bool CatchLight(const SpLight &Object)
        {
            irrSmngr->addLightSceneNode(
                0,
                Convert(Object.BaseObject.Position),
                SColorf(1.0f, 1.0f, 1.0f),
                Object.VolumetricRadius
            );
            return true;
        }
        
        /* === Inline functions === */
        
        inline vector3df Convert(const SpVector3 &Vec) const
        {
            return vector3df(Vec.x, Vec.y, Vec.z);
        }
        
        inline matrix4 Convert(const SpMatrix4 &Mat4x4) const
        {
            matrix4 Mat;
            
            for (unsigned int i = 0; i < 16; ++i)
                Mat[i] = Mat4x4.m[i];
            
            return Mat;
        }
        
        /* === Members === */
        
        
};


/* === Global functions === */

int main()
{
    // Create irrlicht device
    irrDevice = createDevice(
        video::EDT_OPENGL, dimension2d<u32>(800, 600), 16, false, false, false, 0
    );
    
    if (!irrDevice)
        return 1;
    
    irrDevice->setWindowCaption(L"\"SoftPixel Sandbox\" Level Loader Example for \"Irrlicht Engine 1.8\"");
    
    irrDriver = irrDevice->getVideoDriver();
    irrSmngr = irrDevice->getSceneManager();
    
    irrSmngr->addCameraSceneNode(0, vector3df(15, 5, -15), vector3df(0, 0, 0));
    
    // Load SpSb scene file.
    SpSbLoader SceneLoader;
    
    SceneLoader.ImportScene("Media/DemoScene.spsb");
    
    while (irrDevice->run())
    {
        irrDriver->beginScene(true, true, SColor(255, 200, 200, 255));
        
        irrSmngr->drawAll();
        
        irrDriver->endScene();
    }
    
    irrDevice->drop();
    
    return 0;
}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

33

06.03.2013, 06:42

IMeshSceneNode* Node = LoadMesh(Object.Construct.ResourceMesh.Filename);
?
Sind das alles direkte public Member da in SpMesh?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

34

06.03.2013, 10:58

Ja, das sind auch keine Klassen sondern ganz gewöhnliche structs. In diesem Fall halte ich Getter für unnötig. Setter gibt's eh keine, weil const ;)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

35

06.03.2013, 11:14

Ah ja. Ok.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

36

11.03.2013, 23:28

Hier mal ein paar aktuelle Screenshots vom MeshBrowser in meinem Editor, an dem ich gerade arbeite:


(Link)



(Link)

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

37

20.03.2013, 22:05

Hier mal zum Vergleich das alte und neue Storyboard. Endlich mit Anti-Aliasing (durch wxGraphicsContext von wxWidgets, was vermutlich auf die GDI+ zurückgreift) :D

Altes Storyboard:

(Link)


Neues Storyboard:

(Link)


Vor allem zittert das Bild jetzt nicht mehr dank des "wxBufferedPaintDC". wxWidgets ist einfach klasse ^^

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

38

24.03.2013, 17:19

Eben habe ich die aktuellste Version des Editors (v.1.02 beta) hochgeladen.

Etwas Feedback zu den neuen Features wäre nett :)

Release Notes:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
 * Added Mesh Browser.
   
 * Added some new functionality to the toolbar.
   
 * Increased performance.
   
 * Updated lightmap generator -> now supporting multi-threaded lightmap generation.
   
 * Updated Storyboard Designer.
   
 * Updated level file format to v.1.09.
   
 * Finally using relative path for texture-, mesh- and script filenames.


Der MeshBrowser ist noch nicht fertig, aber als MeshViewer kann man ihn schon mal verwenden.

In der Datei "media/TestScript.xml" findet ihr Beispiele für die 'Script-Templates'. Die könnt ihr auch verwenden, in dem ihr sie unter "Extras -> Scene Configuration" die "Storyboard Events" und "Storyboard Triggers" verwendet.
Dann könnt ihr im Storyboard Designer Ereignisse mit einander verknüpfen.

39

25.03.2013, 09:31

Das Storyboard sieht gut aus. :) Wie genau steht es in Verbindung mit der Engine? Dient es zum direkten Scripting von Spiellogik oder verhält es sich eher wie ein GameDesign-Tool und wie komplex sind die Zusammenhänge, die damit modelliert werden können oder sollten? Ist das Storyboard der primäre Weg, eigene Spiellogik in die SoftPixel Engine zu integrieren oder nur eine Alternative von vielen?

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

40

25.03.2013, 10:26

Vorab: Ich hatte hier erst ne richtig ausführliche Antwort, aber dann bin ich wegen Zeitüberschreitung raus geflogen und mein ganzer Text war weg :(

Zu deiner Frage: es dient vor allem als einheitliche und komfortable Alternative. Bis lang hatte ich gar nichts zur Game-Logic in meiner Engine.
Mit dem Sotryboard im Editor und passenden Klassen in der Engine soll sich das jetzt ändern.

Der Level-Designer soll damit bspw. modellieren können, was der Spieler tun muss, damit er durch das Level kommt.
Events können mit Triggern und Logik-Gattern verknüpft werden.
Wie in einem Prozessor durch Logik-Gatter IF-Anweisungen umgesetzt werden, so kann man sich diese auch hier zu nutze machen ;-)

Mit meinem Engine-unabhängigen Scene-Loader kann man den Editor, und natürlich auch das Storyboard, mit jeder beliebigen Engine nutzen :-)
Hier die Strukturen für die Storyboard-Elemente:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
struct SpScriptTemplateData
{
    SpScriptTemplateData()
    {
    }
    ~SpScriptTemplateData()
    {
    }
    
    /* Members */
    std::string TemplateName;               //!< Template name.
    std::vector<std::string> Parameters;    //!< Parameter values.
};

struct SpStoryboardItem
{
    SpStoryboardItem() :
        Id              (0),
        Type            (0),
        ViewPosX        (0),
        ViewPosY        (0),
        LogicGateType   (0)
    {
    }
    ~SpStoryboardItem()
    {
    }
    
    /* Members */
    uint32 Id;
    int8 Type;                              //!< Item type: 0 -> Logic gate, 1 -> Event, 2 -> Trigger.
    
    int32 ViewPosX;
    int32 ViewPosY;
    
    int8 LogicGateType;                     //!< Only used for logic-gates.
    SpScriptTemplateData ScriptTemplate;    //!< Only used for events and triggers.
    
    std::vector<uint32> LinkIds;
};


Im Ordner "SoftPixelSandbox/media/" könnt ihr in der Datei "TestScript.xml" einige Beispiele und Dokumentation zu den 'Script-Templates' sehen.
Ist nicht kompliziert, nur etwas XML das dem Editor vorschreibt, welche Einträge man zu welchem Script-Template machen kann.

Gruß,
Lukas

Werbeanzeige