ändra från GL_LINE till GL_FILL med knapptryckning

Permalänk
Medlem

ändra från GL_LINE till GL_FILL med knapptryckning

tjenare, har precis börjat programmera (OpenGL) lite lätt och har stätt på ett litet problem när det kommer till att ändra glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); till glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); och tillbaka med ett knapptryck när programmet körs.

har en void funktion för keyboard:

void keyboard(unsigned char key, int x, int y)
{
switch(key)
{
case 27: // Esc-tangenten
exit(0); // Ett abrupt slut behövs eftersom vi använder GLUT
break;
case 'p':
shared.pause = !shared.pause;
break;
case 'g':
shared.culling=!shared.culling;
if(shared.culling)
glEnable(GL_CULL_FACE);
else
glDisable(GL_CULL_FACE);
break;
}
}

Dold text

här pausar jag med p och aktiverar/deaktiverar backface culling med g.

och mitt objekt ser ut såhär:

void drawDiamond(){

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

glColor3f(0, 1, 0);

glBegin(GL_TRIANGLE_FAN);
glVertex3f(0, 10, 0);
glVertex3f(7, 0, 7);
glVertex3f(7, 0, -7);
glVertex3f(-7, 0, -7);
glVertex3f(-7, 0, 7);
glVertex3f(7, 0, 7);
glEnd();

glBegin(GL_TRIANGLE_STRIP);
glVertex3f(-7, -5, 7);
glVertex3f(-7, 0, 7);
glVertex3f(-7, -5, -7);
glVertex3f(-7, 0, -7);
glVertex3f(7, -5, -7);
glVertex3f(7, 0, -7);
glVertex3f(7, -5, 7);
glVertex3f(7, 0, 7);
glVertex3f(-7, -5, 7);
glVertex3f(-7, 0, 7);
glEnd();

glBegin(GL_TRIANGLES);
glVertex3f(7, -5, -7);
glVertex3f(7, -5, 7);
glVertex3f(-7, -5, 7);
glEnd();

}

Dold text

Det jag ska göra är alltså att låta användaren ändra mellan att rita objektet med linjer eller fylla i trianglarna helt med ett knapptryck när programmet körs så som jag gjort med backface culling.

har givetvis en struct:

struct Shared
{
float time;
bool pause;
bool culling;
};

Dold text

antar att jag ska lägga till "bool color;" i struct och skriva en IF funktion i void keyboard som jag gjort med backface culling men jag vet inte hur denna IF funktionen ska se ut när jag vill gå in i "glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);" för att ändra GL_LINE till GL_FILL...

någon som kan hjälpa till att förklara hur detta ska gå till eller om man kan göra på ett lättare sätt? vill inte ha någonting komplicerat då jag precit börjat programmera.

tack på förhand!

Visa signatur

Corsair VX 550 80+ | Corsair XMS3 4x2 gb | samsung 830, 120 gb | XFX 6870 | FD Define R4 | MSI 870A-G54 AM3 | AMD Phenom X4 955 | Antec KÜHLER H2O 620

Permalänk
Medlem

Vet inte riktigt om jag förstår fullt ut vad du menar.
Din void keyboard funktion ska bara hantera ditt keyboard, alltså du ska försöka undvika att lägga utritnings funktionalitet där i.
Istället kan din drawDiamond hantera olika typer av utritningar och annat.

Så i din keyboard funktion ändrar du bara variabler och annat, sen hanterar du utritnings funktionalitet i drawDiamond, därför kan du lägga glEnable och glPolygonmode i drawDiamond. Så kollar du bara shared.culling och ändrar typ av utritning och annat du vill göra.

if(shared.culling)
{
glEnable(GL_CULL_FACE);
else
glDisable(GL_CULL_FACE);

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Medlem

hmm, kanske uttryckte mig otydligt.
det enda jag vill göra är att "c" på tangentbordet ändrar mellan att objektet renderas med GL_LINE till GL_FILL och tillbaka.

Visa signatur

Corsair VX 550 80+ | Corsair XMS3 4x2 gb | samsung 830, 120 gb | XFX 6870 | FD Define R4 | MSI 870A-G54 AM3 | AMD Phenom X4 955 | Antec KÜHLER H2O 620

Permalänk
Medlem
Skrivet av Billyz:

hmm, kanske uttryckte mig otydligt.
det enda jag vill göra är att "c" på tangentbordet ändrar mellan att objektet renderas med GL_LINE till GL_FILL och tillbaka.

Kanske nåt sånt här?
void keyboard(unsigned char key, int x, int y)
{
switch(key)
{
case 27: // Esc-tangenten
exit(0); // Ett abrupt slut behövs eftersom vi använder GLUT
break;

case 'p':
shared.pause = !shared.pause;
break;

case 'g':
shared.culling=!shared.culling;
break;

case 'c':
shared.color == !shared.color;
break;
}
}

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Medlem

i manualen (http://www.opengl.org/sdk/docs/man/xhtml/glPolygonMode.xml) står det att glPolygonMode tar en GLenum datatyp. Tror du kan göra en global variabel som du använder:

GLenum mySwitch = GL_LINE;

och sen vid knapptryckningen, pseudokod:

if ( knapptryck) { if ( mySwitch == GL_LINE ) mySwitch = GL_FILL; else mySwitch = GL_LINE; }

sen anropar du glPolygonMode med:

glPolygonMode( GL_FRONT_AND_BACK, mySwitch );

Kanske?

Permalänk
Medlem
Skrivet av NoPaiN^:

Kanske nåt sånt här?
void keyboard(unsigned char key, int x, int y)
{
switch(key)
{
case 27: // Esc-tangenten
exit(0); // Ett abrupt slut behövs eftersom vi använder GLUT
break;

case 'p':
shared.pause = !shared.pause;
break;

case 'g':
shared.culling=!shared.culling;
break;

case 'c':
shared.color == !shared.color;
break;
}
}

och sen kanske nåt sånt här du menar?
void drawChange()
{
if(shared.culling)
{
glEnable(GL_CULL_FACE);
}
else
{
glDisable(GL_CULL_FACE);
}

if(shared.color)
{
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
}
else
{
glPolygonMode(GL_FRONT_AND_BACK, GL_FIL);
}

}

void drawDiamond()
{

drawChange();

glColor3f(0, 1, 0);

glBegin(GL_TRIANGLE_FAN);
glVertex3f(0, 10, 0);
glVertex3f(7, 0, 7);
glVertex3f(7, 0, -7);
glVertex3f(-7, 0, -7);
glVertex3f(-7, 0, 7);
glVertex3f(7, 0, 7);
glEnd();

glBegin(GL_TRIANGLE_STRIP);
glVertex3f(-7, -5, 7);
glVertex3f(-7, 0, 7);
glVertex3f(-7, -5, -7);
glVertex3f(-7, 0, -7);
glVertex3f(7, -5, -7);
glVertex3f(7, 0, -7);
glVertex3f(7, -5, 7);
glVertex3f(7, 0, 7);
glVertex3f(-7, -5, 7);
glVertex3f(-7, 0, 7);
glEnd();

glBegin(GL_TRIANGLES);
glVertex3f(7, -5, -7);
glVertex3f(7, -5, 7);
glVertex3f(-7, -5, 7);
glEnd();

}

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Medlem
Skrivet av Mikael07:

i manualen (http://www.opengl.org/sdk/docs/man/xhtml/glPolygonMode.xml) står det att glPolygonMode tar en GLenum datatyp. Tror du kan göra en global variabel som du använder:

GLenum mySwitch = GL_LINE;

och sen vid knapptryckningen, pseudokod:

if ( knapptryck) { if ( mySwitch == GL_LINE ) mySwitch = GL_FILL; else mySwitch = GL_LINE; }

sen anropar du glPolygonMode med:

glPolygonMode( GL_FRONT_AND_BACK, mySwitch );

Kanske?

TACK! funkar perfekt!

ändrade iof lite så att det i void keyboard blev

case 'c': shared.mySwitch=!shared.mySwitch; if(shared.mySwitch) mySwitch=GL_FILL; else mySwitch=GL_LINE; break;

tack så mycket för all hjälp!

Visa signatur

Corsair VX 550 80+ | Corsair XMS3 4x2 gb | samsung 830, 120 gb | XFX 6870 | FD Define R4 | MSI 870A-G54 AM3 | AMD Phenom X4 955 | Antec KÜHLER H2O 620