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

1

03.07.2010, 13:13

Kleine Schönheiten

Ihr kennt das sicher: Ihr löst gerade ein kleines Teilproblem, das euch über den Weg lief, und habt eine so wunderschöne, ästhetische, elegenate Lösung gefunden, dass sie euch direkt erheitert. Manchmal ist das eine besonders gewitzte oder geschmeidige Syntax, manchmal ein kleiner Algorithmus oder eine Datenstruktur - aber immer handelte es sich nur um eine Nebensächlichkeit. Schreibt mal, was euch so widerfahren ist.

Ich fange mal an: Ich manchen Spielen muss man mit den vier "reinen" Himmelsrichtungen N,O,S,W und deren Mischformen NO,NW,SO,SW operieren, ohne gleich zu Vektoren zu greifen, und ordnet diesen 8 Richtungen irgendwelche Konstanten zu, z.B. mittels "enum" oder "const". Wenn man dann aber vor dem Problem steht, dass man zu einer bel. Richtung X die "entgegengesetzte" Richtung sucht oder wie man aus zwei reinen Himmelsrichtungen die zugehörige Mischrichtung bekommen soll, so kommt man meist nicht ohne eine Extra-Funktion mit switch/case-Anweisungen aus. Ich habe ein bisschen gepuzzelt und diese Konstantenwerte gewählt:
N = 1, NO = 4, O = 3, SO = 2, S = -1, SW = -4, W = -3, NW = -2, K = 0 ("keine Richtung")
Damit sind die genannten Probleme aufwandslos lösbar:
(A) Die zu X entgegengesetzte Richtung ist -X, z.B. S = -N bzw.
(A') Die Addition zweier entgegengesetzter Richtungen ist K (K = 0 "keine Richtung"), z.B. N + S = K = 0
(B) Aus den reinen, nicht entgegengesetzten Richtungen X und Y entsteht die Mischrichtung XY einfach mittels X+Y, z.B. NO = N+O

So und nun erzählt mal, was für kleine Wundern ihr in eure Quelltexten gewebt habt.
Projekt: Welteditor2D

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

2

03.07.2010, 20:19

Zum dem Nachbarproblem faellt mir gerade ein, wie geht man alle 4 Nachbarn durch?

C-/C++-Quelltext

1
2
3
4
5
6
int Offset[]={1,-1,0,0};
for( int i= 0; i < 4; ++i )
{
    int iX= iCenterX + iOffset[ i ];
    int iY= iCenterY - iOffset[ 3 - i ];
}

the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

3

04.07.2010, 03:52

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
// TODO: Koordinaten der Vertices eines Würfels mit den Abmessungen fWidth * fHeight * fDepth berechnen.

const float fDeltaX = fWidth  / 2;
const float fDeltaY = fHeight / 2;
const float fDeltaZ = fDepth  / 2;

std::vector<Vector3f> positions;
positions.reserve( 8 );

for( unsigned int n  = 0;  n < 8; n++ )
{
            positions[ n ].x = ( ( n & 0b100 ) ? +fDeltaX : -fDeltaX );
            positions[ n ].y = ( ( n & 0b010 ) ? +fDeltaY : -fDeltaY );
            positions[ n ].z = ( ( n & 0b001 ) ? +fDeltaZ : -fDeltaZ );
}

// TODO: Die Vertices im Buffer 'positions' per Index referenzieren

/*
           3------------/7
          / |          / | 
         2------------6  |
         |  |         |  |
         |  1---------|--5
         | /          | /
         |/           |/
         0------------4

y^ /z
 |/
 o---->
    x

  Bitcode-Interpretation als Koordinate:

         xyz
         |||
   0 = 0b000
   1 = 0b001
   2 = 0b010
   3 = 0b011
   4 = 0b100
   5 = 0b101
   6 = 0b110
   7 = 0b111

 */
<< an dieser Stelle ist eine Signatur verstorben >>

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »the[V]oid« (04.07.2010, 05:28)


David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

04.07.2010, 09:03

Sowas hat ich auch mal (m_pts[2][3] sind die Extrema):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
inline void AABB::BoxCorners(Vec3 (&pts)[8]) const
{
    //! 0-3 - bottom vertices
    //! 4-7 - top vertices
    for (uint32 i = 0; i < 8; ++i)
    {
        pts[i][0] = m_pts[(i >> 1) & 1][0];
        pts[i][1] = m_pts[(i >> 2) & 1][1];
        pts[i][2] = m_pts[((i >> 1) ^ i) & 1][2];
    }
}


Oder die FPU "missbrauchen" zur Berechnung von Logarithmus Dualis für Integer.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static inline int Log2(uint32 val) 
{
    static const uint32 bias = -127;

    float tmp;
    _asm 
    {
        fild    [val]
        fstp    [tmp]
        xor     eax, eax
        mov     eax, [tmp]
        and     eax, 0x7F800000
        shr     eax, 23
        add     eax, bias
    }
}
@D13_Dreinig

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »David_pb« (04.07.2010, 13:18)


BlazeX

Alter Hase

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

5

04.07.2010, 18:51

Ist zwar kein Würfel, aber ein Fullscreenrechteck per VertexShader:

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
/*
Input:
- No VertexBuffer
- No InputLayout
- 1 IndexBuffer (later)
- PT: Triangle List
- DrawIndexed 6 Indices

IndexBuffer:
0, 2, 1,
2, 3, 1

Generating Positions:
   X     Y    Z     W
-1.0, -1.0, 0.0, 1.0
 1.0, -1.0, 0.0, 1.0
-1.0,  1.0, 0.0, 1.0
 1.0,  1.0, 0.0, 1.0
*/

//VertexShader
float4 FullscreenQuadVS(uint VertexID : SV_VertexID) : SV_POSITION
{
    float4 vPosition= float4(-1, -1, 0, 1);

    if(In.VertexID & 1)     vPosition.x= 1;
    if(In.VertexID & 2)     vPosition.y= 1; 

    return(vPosition);
}

Werbeanzeige