Ir para o conteúdo
ricardoneves93

Usar CheckBox para ligar/desligar fonte de luz

Mensagens Recomendadas

ricardoneves93

Boa tarde, estou a fazer um projecto em c++ e openGL, tenho que usar checkbox's para fazer ligar/desligar várias fontes de luz, eu já sei como identificar a checkBox que foi modificada porém não sei como invocar o método enable() ou disable() da respectiva fonte de luz.

Classe onde estão inicializadas as luzes:

#include "LightingScene.h"
#include "CGFaxis.h"
#include "CGFapplication.h"
#include "myTable.h"
#include "Plane.h"
#include "myCylinder.h"
#include "myUnitCube.h"
#include "myLamp.h"
#include "myClock.h"
#include "MyClockHand.h"
#include "MyRobot.h"
#include <math.h>
#include <iostream>
using namespace std;
float pi = acos(-1.0);
float deg2rad=pi/180.0;
#define BOARD_HEIGHT 6.0
#define BOARD_WIDTH 6.4
// Positions for two lights
float light0_pos[4] = {7.55, 8, 7.5, 1.0};
float light1_pos[4] = {-1.0, 5.0, 8.0, 1.0};
float light2_pos[4] = {10.5, 6.0, 5.0, 1.0};
float light3_pos[4] = {4, 6.0, 5.0, 1.0};
// Global ambient light (do not confuse with ambient component of individual lights)
float globalAmbientLight[4]= {0,0,0,1.0}; // colocar tudo a zero menos o ultimo
// number of divisions
#define BOARD_A_DIVISIONS 30
#define BOARD_B_DIVISIONS 100
// Coefficients for material A
float ambA[3] = {0.2, 0.2, 0.2};
float difA[3] = {0.6, 0.6, 0.6};
float specA[3] = {0, 0.8, 0.8};
float shininessA = 120.f;
// Coefficients for material B
float ambB[3] = {0.2, 0.2, 0.2};
float difB[3] = {0.6, 0.6, 0.6};
float specB[3] = {0.8, 0.8, 0.8};
float shininessB = 120.f;

// Coefficients for material wall
float ambP[3] = {1.0, 1.0, 1.0};
float difP[3] = {1.0, 1.0, 1.0};
float specP[3] = {1.0, 1.0, 1.0};
float shininessP = 10.f;
// Coefficients for material floor
float ambF[3] = {128.0/255.0, 120.0/255.0, 115.0/255.0};
float difF[3] = {128.0/255.0, 120.0/255.0, 115.0/255.0};
float specF[3] = {128.0/255.0, 120.0/255.0, 115.0/255.0};
float shininessF = 30.f;
// Coefficients for slideAppearance
float ambS[3] = {128.0/255.0, 128.0/255.0, 128.0/255.0};
float difS[3] = {200.0/255.0, 200.0/255.0, 200.0/255.0};
float specS[3] = {50.0/255.0, 50.0/255.0, 50.0/255.0};
float shininessS = 10.f;
// Coefficients for boardAppearance
float ambBa[3] = {128.0/255.0, 128.0/255.0, 128.0/255.0};
float difBa[3] = {100.0/255.0, 100.0/255.0, 100.0/255.0};
float specBa[3] = {128.0/255.0, 128.0/255.0, 128.0/255.0};
float shininessBa = 120.f;

//Coefficients for windowAppearance
float ambWi[3] = {128.0/255.0, 128.0/255.0, 128.0/255.0};
float difWi[3] = {200.0/255.0, 200.0/255.0, 200.0/255.0};
float specWi[3] = {50.0/255.0, 50.0/255.0, 50.0/255.0};
float shininessWi = 10.f;
float ambientNull[4]={0,0,0,1};
float yellow[4]={1,1,0,1};
void LightingScene::init()
{
sceneVar = 0;
// Enables lighting computations
glEnable(GL_LIGHTING);
// Sets up some lighting parameters
// Computes lighting only using the front face normals and materials
glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);

// Define ambient light (do not confuse with ambient component of individual lights)
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, globalAmbientLight);

// Declares and enables two lights, with null ambient component
light0 = new CGFlight(GL_LIGHT0, light0_pos);

//light0->setAmbient(ambientNull);
//light0->setSpecular(yellow);
//light0->setKq(1);
light0->disable();
light0->enable();
light1 = new CGFlight(GL_LIGHT1, light1_pos);
//light1->setAmbient(ambientNull);
//light1->setDiffuse(yellow);

light1->disable();
light1->enable();

light2 = new CGFlight(GL_LIGHT2, light2_pos);
light2->setAmbient(ambientNull);
light2->setKc(0);
light2->setKl(1);
light2->setKq(0);

light2->disable();
light2->enable();
light3 = new CGFlight(GL_LIGHT3, light3_pos);
light3->setAmbient(ambientNull);
light3->setSpecular(yellow);
light3->setKc(0);
light3->setKl(0);
light3->setKq(1);
light3->disable();
light3->enable();

// Uncomment below to enable normalization of lighting normal vectors
glEnable(GL_NORMALIZE);
//Declares scene elements
table = new myTable();
chair = new myChair();
wall = new Plane();
boardA = new Plane(BOARD_A_DIVISIONS);
boardB = new Plane(BOARD_B_DIVISIONS);
cil = new myCylinder(50, 10, true);
cil2 = new myCylinder(50, 10, false);
clock = new myClock(12, 1, true);
Robocop = new myRobot(7.5, 7.5, 210);
Hours = new MyClockHand(0.6,0.05,90);
Minutes = new MyClockHand(0.9,0.03,180);
Seconds = new MyClockHand(1,0.025,270);
//Declares materials
materialA = new CGFappearance(ambA,difA,specA,shininessA);
materialB = new CGFappearance(ambB,difB,specB,shininessB);
materialWall = new CGFappearance(ambP,difP,specP,shininessP);
materialFloor = new CGFappearance(ambF,difF,specF,shininessF);
slidesAppearance = new CGFappearance(ambS,difS,specS,shininessS);
slidesAppearance->setTexture("slides.png");
boardAppearance = new CGFappearance(ambBa,difBa,specBa,shininessBa);
boardAppearance->setTexture("board.png");
windowAppearance = new CGFappearance(ambP,difP,specP,shininessP);
windowAppearance->setTexture("window.png");
windowAppearance->setTextureWrap(GL_CLAMP,GL_CLAMP);
floorAppearance = new CGFappearance(ambWi,difWi,specWi,shininessWi);
floorAppearance->setTexture("floor.png");

//Declares flat shading;
//glShadeModel(GL_FLAT);

}

Classe onde estão declaradas as checkBox's:

#include "TPinterface.h"
#include "LightingScene.h"
#include "MyRobot.h"
#include <GL/glui.h>

TPinterface::TPinterface()
{
testVar=0;
Light1=1;
Light2=2;
Light3=3;
Light4=4;
Light5=5;
}

void TPinterface::processKeyboard(unsigned char key, int x, int y)
{
// Uncomment below if you would like to process the default keys (e.g. 's' for snapshot, 'Esc' for exiting, ...)
// CGFinterface::processKeyboard(key, x, y);
switch(key)
{
 case 'a':
 {
  // This is an example of accessing the associated scene
  // To test, create the function toggleSomething in your scene to activate/deactivate something
  ((LightingScene *) scene)->toggleSomething();
  break;
 }
 case 'i':
 {
  ((LightingScene *) scene)->Robocop->forward();
  break;
 }
 case 'k':
 {
  ((LightingScene *) scene)->Robocop->back();
  break;
 }
 case 'j':
 {
  ((LightingScene *) scene)->Robocop->left();
  break;
 }
 case 'l':
 {
  ((LightingScene *) scene)->Robocop->right();
  break;
 }
}
}
void TPinterface::initGUI()
{

// Check CGFinterface.h and GLUI documentation for the types of controls available
GLUI_Panel *varPanel= addPanel("Luzes");
addCheckboxToPanel(varPanel,"Luz 1", &Light1, 1);
addCheckboxToPanel(varPanel,"Luz 2", &Light2, 2);
addCheckboxToPanel(varPanel,"Luz 3", &Light3, 3);
addCheckboxToPanel(varPanel,"Luz 4", &Light4, 4);
addCheckboxToPanel(varPanel,"Luz 5", &Light5, 5);
addButtonToPanel(varPanel, "Clock Animation", 6);
//addSpinnerToPanel(varPanel, "Val 1(interface)", 2, &testVar, 1);

// You could also pass a reference to a variable from the scene class, if public
//addSpinnerToPanel(varPanel, "Val 2(scene)", 2, &(((LightingScene*) scene)->sceneVar), 2);
}
void TPinterface::processGUI(GLUI_Control *ctrl)
{
printf ("GUI control id: %d\n  ",ctrl->user_id);
switch (ctrl->user_id)
{
 case 1:
 {
  printf ("New Val 1(interface): %d\n",testVar);
  break;
 };
 case 2:
 {
  printf ("New Val 2(scene): %d\n",((LightingScene*) scene)->sceneVar);
  break;
 };
};
}

Editado por ricardoneves93

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

com esse código é impossível saber o que pretendes ...

o OOP foi completamente atirado pela janela fora ... variáveis globais ??

  • Voto 1

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pikax

existe uma checkbox por objecto?


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pikax

Tens varias opcoes, apesar de como tens fica um pouco dificil.

Uma solucao, que era mais a bater pedra, seria teres um array ou um map, para te dar o objecto da luz que queres


Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.