Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  structi tegemine float arrayks lihtsal viisil? märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
asjameez
Kreisi kasutaja
asjameez

liitunud: 10.12.2006




sõnum 27.07.2010 19:13:35 structi tegemine float arrayks lihtsal viisil? vasta tsitaadiga

Tere.

Küsimus selline, et kas vec4 structi, mis koosneb floatidest, saab lihtsamal viisil ka teha float massiiviks? Praegune lahendus tundub mulle küll vähe pikk ja lombakas.

GLvoid Lighting::AddLight(vec4 Position, vec4 Ambient, vec4 Diffuse, vec4 Specular) {
   GLfloat PositionV[4] = { Position.x, Position.y, Position.z, Position.w };
   GLfloat AmbientV[4] = { Ambient.x, Ambient.y, Ambient.z, Ambient.w };
   GLfloat DiffuseV[4] = { Diffuse.x, Diffuse.y, Diffuse.z, Diffuse.w };
   GLfloat SpecularV[4] = { Specular.x, Specular.y, Specular.z, Specular.w };
   if(LightList.size() < GL_MAX_LIGHTS) {
      Light = GL_LIGHT0 + LightList.size();
      glLightfv(Light, GL_POSITION, PositionV);
      glLightfv(Light, GL_AMBIENT, AmbientV);
      glLightfv(Light, GL_DIFFUSE, DiffuseV);
      glLightfv(Light, GL_SPECULAR, SpecularV);
      glEnable(Light);
   }
}


Miks üldse vaja teha structi float arrayks on see, et glLightfv ei söö vec4 structi.
Kommentaarid: 63 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 61
tagasi üles
vaata kasutaja infot saada privaatsõnum
troglodyte
Kreisi kasutaja
troglodyte

liitunud: 09.08.2002




sõnum 27.07.2010 20:54:46 vasta tsitaadiga

Milline on vec4 struktuuri definitsioon?

Põhimõtteliselt võiksid teha lihtsustava makro:

c:
  1. #define VEC4_TO_ARRAY(v) { (v).x, (v).y, (v).z, (v).w }
  2. GLfloat PositionV[4] = VEC4_TO_ARRAY(Position);


Või veel lihtsamaks:

c:
  1. #define VEC4_TO_GLFLOAT(n, v)   GLFloat n [4] = VEC4_TO_ARRAY((v))
  2. VEC4_TO_GLFLOAT(PositionV, Position);

_________________
ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn
Kommentaarid: 34 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 34
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
asjameez
Kreisi kasutaja
asjameez

liitunud: 10.12.2006




sõnum 27.07.2010 22:16:45 vasta tsitaadiga

troglodyte kirjutas:
Milline on vec4 struktuuri definitsioon?

struct vec4 {
   float x, y, z, w;
   vec4();
   vec4(float, float, float, float);
};
Kommentaarid: 63 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 61
tagasi üles
vaata kasutaja infot saada privaatsõnum
troglodyte
Kreisi kasutaja
troglodyte

liitunud: 09.08.2002




sõnum 27.07.2010 23:07:53 vasta tsitaadiga

Sellisel juhul peaks
(float *)&Position
toimima.
_________________
ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn
Kommentaarid: 34 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 34
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
asjameez
Kreisi kasutaja
asjameez

liitunud: 10.12.2006




sõnum 27.07.2010 23:37:23 vasta tsitaadiga

troglodyte kirjutas:
Sellisel juhul peaks
(float *)&Position
toimima.

Midagi sellist ma lootsingi icon_razz.gif Suured tänud jällegi.
Kommentaarid: 63 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 61
tagasi üles
vaata kasutaja infot saada privaatsõnum
troglodyte
Kreisi kasutaja
troglodyte

liitunud: 09.08.2002




sõnum 27.07.2010 23:44:27 vasta tsitaadiga

float asemel loomulikult GLfloat siis.

Kindlasti uuri järgi miks ja kuidas see castimine toimib (tavaliselt, kindlasti leidub c++ kompilaatoreid kus see ei toimi).

_________________
ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn
Kommentaarid: 34 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 34
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Ho Ho
HV Guru
Ho Ho

liitunud: 16.02.2002




sõnum 05.08.2010 10:19:01 vasta tsitaadiga

On ka selline variant:
struct v4 {
    union {
        float v[4];
        struct {
            float x, y, z, w;
        };
    };
};
Mälu võtab täpselt 4 float'i jagu ning vastavalt vajadusele võid pöörduda selle poole, kui float'i massiiv (v4.v[i]) või üksikud elemendid (v4.x). Näiteks midagi sellist:
v4 col;
glcolor4f(col.x, col.y, col.z, col.w);
glcolor4fv(col.v);
Kui tahad võid sinna lisada ka rgba:
struct v4 {
    union {
        float v[4];
        struct {
            float x, y, z, w;
        };
        struct {
            float r, g, b, a;
        };
    };
};

_________________
Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity"
Kommentaarid: 106 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 86
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  structi tegemine float arrayks lihtsal viisil?
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.