/** * etsi objekti nimen perusteella, aseta sen index selectObj muuttujaan */ public void selectObject(string name) { selectedObj = -1; // käy kaikki tasot läpi for (int l = 0; l < layers.Count; l++) { // etsi objekteista name nimistä for (int q = 0; q < ((Layer)layers[l]).objs.Count; q++) { baseObject tmp = (baseObject)((Layer)layers[l]).objs[q]; if (tmp.Name == name) { selectedObj = q; selectedLayer = l; break; } } } }
/** * asettaa ohjelman alkutilaan, eli voi aloittaa * piirtämisen puhtaalta pöydältä */ public void clearAll() { selectedObj = -1; selectedLayer = -1; fill = true; // jos true, objektit myös täytetään, muuten vaan ääriviivat closed = true; // jos true, suljetaan polygoni tmpObj = null; layers.Clear(); Gl.glClearColor(1, 1, 1, 1); Gl.glClear(Gl.GL_COLOR_BUFFER_BIT); Layer.layers = 0; // luo yksi taso newLayer(); Tools.updateList(); updateAll(); }
/** * jos suoritettu undo tai poistettu objekti, tyhjennetään * ruutu ja piirretään kaikki uudelleen (paitsi poistettu) */ public void updateAll() { Gl.glLoadIdentity(); Gl.glClearColor(1, 1, 1, 1); Gl.glClear(Gl.GL_COLOR_BUFFER_BIT); // renderoi kaikilta tasoilta for (int l = 0; l < layers.Count; l++) { for (int i = 0; i < ((Layer)layers[l]).objs.Count; i++) { Gl.glTranslatef(((Layer)layers[l]).sx, ((Layer)layers[l]).sy, 0); baseObject o = (baseObject)((Layer)layers[l]).objs[i]; if (o != null) { o.render(true); } Gl.glLoadIdentity(); } } }
/** * renderoi grafiikat */ private void display() { if (!running) { return; } Gl.glLoadIdentity(); // valittu objekti välkkymään if (selectedObj != -1) { // jos tasoa liikutettu, liikuta Gl.glTranslatef(((Layer)layers[selectedLayer]).sx, ((Layer)layers[selectedLayer]).sy, 0); baseObject o = (baseObject)((Layer)layers[selectedLayer]).objs[selectedObj]; sin += 0.1f; Gl.glColor3f((float)Math.Sin((float)sin), 0, 0); o.render(false); Gl.glLoadIdentity(); } if (tmpObj != null) { Gl.glTranslatef(((Layer)layers[selectedLayer]).sx, ((Layer)layers[selectedLayer]).sy, 0); if (!invert) { tmpObj.render(true); invert = !invert; } Gl.glLoadIdentity(); } Gl.glFlush(); Glut.glutSwapBuffers(); }
/** * kutsutaan jos hiiren nappia painetaan */ private void mouseButton(int button, int state, int x, int y) { if (mode == 0) { return; } if (selectedObj != -1) { selectedObj = -1; updateAll(); } if (mode != 4) { Gl.glTranslatef(((Layer)layers[selectedLayer]).sx, ((Layer)layers[selectedLayer]).sy, 0); x -= (int)((Layer)layers[selectedLayer]).sx; y -= (int)((Layer)layers[selectedLayer]).sy; } switch (button) { // jos painetaan hiiren vasenta nappia case Glut.GLUT_LEFT_BUTTON: // kun painetaan pohjaan if (state == Glut.GLUT_DOWN) { if (mode != 4) { invert = false; Gl.glEnable(Gl.GL_COLOR_LOGIC_OP); Gl.glLogicOp(Gl.GL_INVERT); } switch (mode) { case 1: tmpObj = new Line(); break; case 2: tmpObj = new Rect(); break; case 3: tmpObj = new Circle(); break; case 4: mx = x; my = y; // layerin liikutus return; } tmpObj.setColor(color, fillColor, true); tmpObj.add((float)x, (float)y); } else // irrotetaan napista { if (tmpObj == null) { return; } tmpObj.add((float)x, (float)y); if (mode == 1) // jos kynä { if (fill || closed) // jos täyttö tai suljettu { // vika vertex ekaks vertexiks, sulkee polyn ((Line)tmpObj).close(); } if (fill) // alue pitää täyttää { ((Line)tmpObj).tesselate(closed); } } if (layers.Count == 0) { selectedLayer = -1; newLayer(); } Gl.glDisable(Gl.GL_COLOR_LOGIC_OP); tmpObj.render(true); ((Layer)layers[selectedLayer]).objs.Add(tmpObj); tmpObj = null; Tools.updateList(); } break; case Glut.GLUT_MIDDLE_BUTTON: case Glut.GLUT_RIGHT_BUTTON: break; default: break; } }