I try to write the bump mapping program in C++.
Some Python codes are:
self.focus = Vec3(55,-55,20)
self.heading = 180
self.pitch = 0
#self.mousex = 0
#self.mousey = 0
self.last = 0
self.mousebtn = [0,0,0]
taskMgr.add(self.controlCamera, "camera-task")
self.accept("escape", sys.exit, [0])
self.accept("mouse1", self.setMouseBtn, [0, 1])
self.accept("mouse1-up", self.setMouseBtn, [0, 0])
self.accept("mouse2", self.setMouseBtn, [1, 1])
self.accept("mouse2-up", self.setMouseBtn, [1, 0])
self.accept("mouse3", self.setMouseBtn, [2, 1])
self.accept("mouse3-up", self.setMouseBtn, [2, 0])
self.accept("enter", self.toggleShader)
self.accept("j", self.rotateLight, [-1])
self.accept("k", self.rotateLight, [1])
self.accept("arrow_left", self.rotateCam, [-1])
self.accept("arrow_right", self.rotateCam, [1])
......
def setMouseBtn(self, btn, value):
self.mousebtn[btn] = value
def rotateLight(self, offset):
self.lightpivot.setH(self.lightpivot.getH()+offset*20)
def rotateCam(self, offset):
self.heading = self.heading - offset*10
def toggleShader(self):
self.inst5.destroy()
if (self.shaderenable):
self.inst5 = addInstructions(0.75, "Enter: Turn bump maps On")
self.shaderenable = 0
self.room.setShaderOff()
else:
self.inst5 = addInstructions(0.75, "Enter: Turn bump maps Off")
self.shaderenable = 1
self.room.setShaderAuto()
def controlCamera(self, task):
md = base.win.getPointer(0)
x = md.getX()
y = md.getY()
if base.win.movePointer(0, 100, 100):
self.heading = self.heading - (x - 100) * 0.2
self.pitch = self.pitch - (y - 100) * 0.2
if (self.pitch < -45): self.pitch = -45
if (self.pitch > 45): self.pitch = 45
base.camera.setHpr(self.heading,self.pitch,0)
dir = base.camera.getMat().getRow3(1)
elapsed = task.time - self.last
if (self.last == 0): elapsed = 0
if (self.mousebtn[0]):
self.focus = self.focus + dir * elapsed*30
if (self.mousebtn[1]) or (self.mousebtn[2]):
self.focus = self.focus - dir * elapsed*30
base.camera.setPos(self.focus - (dir*5))
if (base.camera.getX() < -59.0): base.camera.setX(-59)
if (base.camera.getX() > 59.0): base.camera.setX( 59)
if (base.camera.getY() < -59.0): base.camera.setY(-59)
if (base.camera.getY() > 59.0): base.camera.setY( 59)
if (base.camera.getZ() < 5.0): base.camera.setZ( 5)
if (base.camera.getZ() > 45.0): base.camera.setZ( 45)
self.focus = base.camera.getPos() + (dir*5)
self.last = task.time
return Task.cont
...
Some C++ Codes I write are:
//Define events
int keys[12] ={0,1,0,0,1,1,1,0,2,1,2,0};
framework.define_key("mouse1", "", setMouseBtn, &keys[0]);
framework.define_key("mouse1-up", "", setMouseBtn, &keys[2]);
framework.define_key("mouse2", "", setMouseBtn, &keys[4]);
framework.define_key("mouse2-up", "", setMouseBtn, &keys[6]);
framework.define_key("mouse3", "", setMouseBtn, &keys[8]);
framework.define_key("mouse3-up", "", setMouseBtn, &keys[10]);
framework.define_key("enter", "", toggleShader, NULL);
int offset[2] ={-1,1};
framework.define_key("j", "", rotateLight, &offset[0]);
framework.define_key("k", "", rotateLight, &offset[1]);
framework.define_key("arrow_left", "", rotateCam, &offset[0]);
framework.define_key("arrow_right", "", rotateCam, &offset[1]);
....
//Define global variable and function
LVecBase3f focus = LVecBase3f(55,-55,20);
float heading = 180;
float pitch = 0;
float last = 0;
int mousebtn[3] = {0,0,0};
bool shaderenable = false;
void setMouseBtn(const Event * event, void *data){
int * _data = (int *) data;
mousebtn[_data[0]] = _data[1];
}
void toggleShader(const Event * event, void *data){
if (shaderenable) {
instruction[4]->set_text("Enter: Turn bump maps On");
shaderenable = false;
room.set_shader_off();
}else {
instruction[4]->set_text("Enter: Turn bump maps Off");
shaderenable = true;
room.set_shader_auto();
}
}
void rotateLight(const Event * event, void *data){
int * _data = (int *) data;
lightpivot.set_h(lightpivot.get_h()+*_data*20);
}
void rotateCam(const Event * event, void *data){
int * _data = (int *) data;
heading -= *_data*10;
}
AsyncTask::DoneStatus controlCamera(GenericAsyncTask* task, void* data) {
MouseData md = window->get_graphics_window()->get_pointer(0);
int x = md.get_x();
int y = md.get_y();
if (window->get_graphics_window()->move_pointer(0, 100, 100)){
heading -= (x - 100) * 0.2;
pitch -= (y - 100) * 0.2;
}
if (pitch < -45) pitch = -45;
if (pitch > 45) pitch = 45;
camera.set_hpr(heading,pitch,0);
LVecBase3f dir = camera.get_mat().get_row3(1);
double elapsed = task->get_dt()-last;
if (last==0) elapsed = 0;
if (mousebtn[0]==1)
focus += dir * elapsed*30;
if (mousebtn[1]==1||mousebtn[2]==1)
focus -= dir * elapsed*30;
camera.set_pos(focus - (dir*5));
if (camera.get_x() < -59.0) camera.set_x(-59);
if (camera.get_x() > 59.0) camera.set_x( 59);
if (camera.get_y() < -59.0) camera.set_y(-59);
if (camera.get_y() > 59.0) camera.set_y( 59);
if (camera.get_z() < 5.0) camera.set_z( 5);
if (camera.get_z() > 45.0) camera.set_z( 45);
focus = camera.get_pos() + (dir*5);
last = task->get_dt();
return AsyncTask::DS_cont;
}
However, I can not control the mouse, how to do?