JOGL Projekt

Checkpoint

JOGL Projekt
« kdy: 12. 04. 2014, 00:56:51 »
Zdravím,
potřeboval bych pomoci se školním projektem. Jedná se o semestrální práci z oblasti OpenGL, konkrétně úlohy nad 2D obrazem, má být psaný v Javě. Potřeboval bych tedy pomoci vůbec se začátkem - představoval jsem si to tak, že do JOGLu dostanu vedle sebe dvakrát ten stejný obrázek, na jeden potom aplikuji kompresi a budu sledovat změny a tak... Začínám ale zjišťovat, že mi pořádně ani nejde nahrát obrázek do JOGLU, vždycky to dopadne tak nějak... podivně. Je tu tedy prosím někdo, kdo by mi dokázal říct, jak do toho JOGLU aspoň dostat validně ten obrázek, aby se s ním pak dalo dál pracovat - tedy aplikovat nějakou tu kompresi? Nebo jestli myslíte, že pro to JOGL není absolutně vhodný a mám to psát v něčem jiném? Předem díky za každou radu, moc si toho cením.


Re:JOGL Projekt
« Odpověď #1 kdy: 12. 04. 2014, 01:55:18 »
Co tohle? http://www.java-gaming.org/index.php?topic=20449.0

Napiš co to dělá divného.
Bible Kralická, přísloví 26

3 Bič na koně, uzda na osla, a kyj na hřbet blázna.
7 Jakož nejednostejní jsou hnátové kulhavého, tak řeč v ústech bláznů.
14 Dvéře se obracejí na stežejích svých, a lenoch na lůži svém.
27 Kdo jámu kopá, do ní upadá, a kdo valí kámen, na něj se obrací.

Krleš!

Checkpoint

Re:JOGL Projekt
« Odpověď #2 kdy: 12. 04. 2014, 02:45:02 »
Díky za odpověď, to vypadá slibně. Jenom, jak tak na to koukám, co přesně se dosadí místo imgID, v té druhé části kódu?

Re:JOGL Projekt
« Odpověď #3 kdy: 12. 04. 2014, 12:10:30 »
Díky za odpověď, to vypadá slibně. Jenom, jak tak na to koukám, co přesně se dosadí místo imgID, v té druhé části kódu?

Ej, to je ID obrázku se kterým pracuješ. Je to vlastně pozice v těchto polích:
Kód: [Vybrat]
   public static ByteBuffer _32BITImages[] = new ByteBuffer[32];
   public static int       _Width[]= new int[32];
   public static int       _Height[]= new int[32];

ID obrázků se určuje v téhle funkci:
Kód: [Vybrat]
Load32BitImg(String name,int id,java.awt.GraphicsDevice GD,boolean trans)
Btw, ty tři pole by bylo elegantnější nahradit jednou třídou a tu pak cpát do nějakého kontejneru, když už to děláš v té javě, tak to po tabě asi stějně budou chtít. Pak by jsi mohl nahradit i tu proměnnou ID static int, která by se při nahrání každého nového obrázku inkrementovala, tak bude míň prostoru pro chybu. Taky se jim asi nebude líbit použití statické třídy, zkus použít singleton.

Jinak nechci tě strašit, jestli to ale s javou, a programováním vůbec, myslíš vážně, tak to ID je věc, na kterou by jsi měl přinít sám  ;)
Bible Kralická, přísloví 26

3 Bič na koně, uzda na osla, a kyj na hřbet blázna.
7 Jakož nejednostejní jsou hnátové kulhavého, tak řeč v ústech bláznů.
14 Dvéře se obracejí na stežejích svých, a lenoch na lůži svém.
27 Kdo jámu kopá, do ní upadá, a kdo valí kámen, na něj se obrací.

Krleš!

Checkpoint

Re:JOGL Projekt
« Odpověď #4 kdy: 12. 04. 2014, 17:35:39 »
Vím že mi java moc nejde, ten předmět ale udělat musím :/ Vím že na to moc nemám hlavu, ale jak přesně tedy zjistím to ID? Tu hodnotu těch polí co bych tam měl dosadit? Ta metoda nic nevrací a pouze na nějaké ID nastaví ty hodnoty, přijde mi ale, že nikde není definované, na jaké ID. Asi Ti teď připadám vcelku jako tupec, ale vážně mi z celé javy jde hlava kolem :)


Re:JOGL Projekt
« Odpověď #5 kdy: 12. 04. 2014, 19:18:25 »
Vím že mi java moc nejde, ten předmět ale udělat musím :/ Vím že na to moc nemám hlavu, ale jak přesně tedy zjistím to ID? Tu hodnotu těch polí co bych tam měl dosadit? Ta metoda nic nevrací a pouze na nějaké ID nastaví ty hodnoty, přijde mi ale, že nikde není definované, na jaké ID. Asi Ti teď připadám vcelku jako tupec, ale vážně mi z celé javy jde hlava kolem :)

No dobře, v tom jejich programu si to ID zvolíš sám jako argument té funkce load32bitImg, bude to číslo od nuly do jednatřiceti, dvaatřicet je velikost těch polí. Nemá to nic společného s tím, že to pracuje s 32bit obrázkama. Ten obrázek je z pixelů, kde každý pixel je ze čtyř osmibitových  barev, red, green, blue a alpha, alpha je průsvitnost. A 8*4=32.
Kdyby jsi třeba potřeboval pracovat s více obrázkama, než je těch třicet dva, tak můžeš vytvořit třeba i větší pole, například
Kód: [Vybrat]
public static int pole[]=new int[123]; ID by jsi si pak vybíral z intervalu 0-122.
Jak už jsem ale psal, tohle řešení s polema mi připadá trochu divné. Vyrobil bych si v projektu další třídu, třeba s názvem Img32 která by šířku a výšku měla jako atributy:
Kód: [Vybrat]
class Img32
{
private int sirka,vyska;
private ByteBuffer data_b;

public Img32(int sirka,int vyska,ByteBuffer data_b)
{
this.sirka=sirka;
this.vyska=vyska;
this.data_b=data_b;
}

public void clear()
{
data_b.clear();
}

public int getW(){return sirka;}
public int getH(){return vyska;}
public ByteBuffer getData{return data_b;}
}

Upravil bych tu loadovací funkci :

Kód: [Vybrat]
   public static Img32 Load32BitImg(String name,java.awt.GraphicsDevice GD,boolean trans){
Img32 obrazek=null;
      try{

      Image imgTemp;
      imgTemp = (Image)ImageIO.read(new File(name));
      ByteBuffer buf;
      //System.out.println("Found File");
     
      BufferedImage Bimg = GD.getDefaultConfiguration().createCompatibleImage(imgTemp.getWidth(null),imgTemp.getHeight(null),Color.BITMASK);
      Bimg.getGraphics().drawImage(imgTemp,0,0,null);
     
      if (trans)
      setBTrans(Bimg,Bimg.getRGB(0,Bimg.getHeight()-1));
     
      buf = ByteBuffer.allocateDirect((Bimg.getWidth()*Bimg.getHeight())*4);
     
      for (int y = 0; y< Bimg.getHeight();y++){
         for (int x = 0; x< Bimg.getWidth();x++)
      buf.putInt(fixRGB(Bimg.getRGB(x, Bimg.getHeight()-y-1)));
      }//END FOR LOOP
         
      //System.out.println("BUFFER MADE");
     
      obrazek=new Img32(Bimg.getWidth(),Bimg.getHeight(),buf);
     
      }catch(IOException ie){
      System.out.println("Error Reading Image");
      }//END TRY AND CATCH STATEMENT
      return obrazek;
      }//END METHOD
}//END CLASS

s obrázkem, co ti ta funkce vyplivne, by se pak pracovalo takhle:
Kód: [Vybrat]
       tempGL.glEnable(GL.GL_BLEND);
       obrazek.clear();
     
   tempGL.glRasterPos2i(X Position,Y Position);
   tempGL.glDrawPixels(obrazek.getW(),
                     obrazek.getH(),
                     GL.GL_RGBA,
                     GL.GL_UNSIGNED_INT_8_8_8_8_REV,
                     obrazek.getData());
        tempGL.glDisable(GL.GL_BLEND);
Snad se už chytáš. Dneska je snad mezinárodní den trpělivosti, nebo co  ;D
Je mi teda záhdou, jak jsi se dostal až k openGL bez znalosti programování. Naučit se programovat není zase tak těžký, jak se možná na první, zděšený, pohled může zdát, člověk na to nemusí být zrovna Ajnštajn, je to jenom o tom že do toho investuješ čas a hlavně se to musíš učit od jednoduššího po složitější, začínat rovnou s openGL není zrovna moc šťastný nápad. Zkus se třeba kouknout na pár tutoriálů od tohodletoho chlapa: http://www.youtube.com/watch?v=Hl-zzrqQoSE&list=PLFE2CE09D83EE3E28
Bible Kralická, přísloví 26

3 Bič na koně, uzda na osla, a kyj na hřbet blázna.
7 Jakož nejednostejní jsou hnátové kulhavého, tak řeč v ústech bláznů.
14 Dvéře se obracejí na stežejích svých, a lenoch na lůži svém.
27 Kdo jámu kopá, do ní upadá, a kdo valí kámen, na něj se obrací.

Krleš!

Checkpoint

Re:JOGL Projekt
« Odpověď #6 kdy: 12. 04. 2014, 19:56:25 »
Vau, děkuju za tvou trpělivost, vážně! Chápu tedy dobře, že tu poslední část kódu můžu zavolat z OGLRendereru v display metodě?

Re:JOGL Projekt
« Odpověď #7 kdy: 13. 04. 2014, 13:07:15 »
Vau, děkuju za tvou trpělivost, vážně! Chápu tedy dobře, že tu poslední část kódu můžu zavolat z OGLRendereru v display metodě?
Nevím jak to tam máš ve svém projektu pojmenované, tady jsem ale našel jeden základní tutoriál na kreslení trojúhelníku, https://sites.google.com/site/justinscsstuff/jogl-tutorial-3, jejich zdrojový kód je tady:
Kód: [Vybrat]
package windows;

import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.media.opengl.*;
import javax.media.opengl.awt.GLCanvas;
import com.jogamp.opengl.util.*;

public class SimpleScene implements GLEventListener {

    private double theta = 0;
    private double s = 0;
    private double c = 0;

    public static void main(String[] args) {
        GLProfile glp = GLProfile.getDefault();
        GLCapabilities caps = new GLCapabilities(glp);
        GLCanvas canvas = new GLCanvas(caps);

        Frame frame = new Frame("AWT Window Test");
        frame.setSize(300, 300);
        frame.add(canvas);
        frame.setVisible(true);

        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        canvas.addGLEventListener(new SimpleScene());

        Animator animator = new FPSAnimator(canvas, 60);
        animator.add(canvas);
        animator.start();
    }

    @Override
    public void display(GLAutoDrawable drawable) {
        update();
        render(drawable);
    }

    @Override
    public void dispose(GLAutoDrawable drawable) {
    }

    @Override
    public void init(GLAutoDrawable drawable) {
    }

    @Override
    public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {
    }

    private void update() {
        theta += 0.01;
        s = Math.sin(theta);
        c = Math.cos(theta);
    }

    private void render(GLAutoDrawable drawable) {
        GL2 gl = drawable.getGL().getGL2();

        gl.glClear(GL.GL_COLOR_BUFFER_BIT);

        // draw a triangle filling the window
        gl.glBegin(GL.GL_TRIANGLES);
        gl.glColor3f(1, 0, 0);
        gl.glVertex2d(-c, -c);
        gl.glColor3f(0, 1, 0);
        gl.glVertex2d(0, c);
        gl.glColor3f(0, 0, 1);
        gl.glVertex2d(s, -s);
        gl.glEnd();
    }
}

Tady jsem to přepsal, aby to pracovalo s těma našema obrázkama:
Kód: [Vybrat]

import java.awt.Frame;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.media.opengl.*;
import javax.media.opengl.awt.GLCanvas;
import com.jogamp.opengl.util.*;

public class SimpleScene implements GLEventListener {


private Img32 obrazekNalevo,obrazekNapravo;
private Img32Loader loader;
private FPSAnimator animator;

    public static void main(String[] args) {
        GLProfile glp = GLProfile.getDefault();
        GLCapabilities caps = new GLCapabilities(glp);
        GLCanvas canvas = new GLCanvas(caps);
        SimpleScene scena=new SimpleScene();
       
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice gd=ge.getDefaultScreenDevice();
       
        scena.loader=new Img32Loader();
        scena.obrazekNalevo=scena.loader.Load32BitImg("obr1.jpg", gd, false);
        scena.obrazekNapravo=scena.loader.Load32BitImg("obr2.jpg", gd, false);
       
        Frame frame = new Frame("AWT Window Test");
        frame.setSize(scena.obrazekNalevo.getW()*2,scena.obrazekNalevo.getH());
        frame.add(canvas);
        frame.setVisible(true);
       

        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        scena.animator = new FPSAnimator(canvas, 60);
        scena.animator.add(canvas);
        scena.animator.start();
        canvas.addGLEventListener(scena);
       
    }

    @Override
    public void display(GLAutoDrawable drawable) {
        update();
        render(drawable);
    }

    @Override
    public void dispose(GLAutoDrawable drawable) {
    animator.stop();
    }

    @Override
    public void init(GLAutoDrawable drawable) {
    }

    @Override
    public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {
    }

    private void update() {

    }

    private void render(GLAutoDrawable drawable) {
   

   
       GL2 gl = drawable.getGL().getGL2();
        gl.glClear(GL.GL_COLOR_BUFFER_BIT);
       gl.glEnable(GL.GL_BLEND);
       obrazekNalevo.clear();
       obrazekNapravo.clear();
     
       gl.glRasterPos2d(-1.0,-1.0);
       gl.glDrawPixels(obrazekNalevo.getW(),
                         obrazekNalevo.getH(),
                         GL2.GL_RGBA,
                         GL2.GL_UNSIGNED_INT_8_8_8_8_REV,
                         obrazekNalevo.getData());
           
       gl.glRasterPos2d(0.0,-1.0);
       gl.glDrawPixels(obrazekNapravo.getW(),
                         obrazekNapravo.getH(),
                         GL2.GL_RGBA,
                         GL2.GL_UNSIGNED_INT_8_8_8_8_REV,
                         obrazekNapravo.getData());
           gl.glDisable(GL.GL_BLEND);
    }
}
Testoval jsem to a v pohodě to frčí. Když už to pišu za tebe, tak si alespoň najdi čas ten zdroják prozkoumat  ;D
Bible Kralická, přísloví 26

3 Bič na koně, uzda na osla, a kyj na hřbet blázna.
7 Jakož nejednostejní jsou hnátové kulhavého, tak řeč v ústech bláznů.
14 Dvéře se obracejí na stežejích svých, a lenoch na lůži svém.
27 Kdo jámu kopá, do ní upadá, a kdo valí kámen, na něj se obrací.

Krleš!

Checkpoint

Re:JOGL Projekt
« Odpověď #8 kdy: 13. 04. 2014, 14:25:35 »
Funguje to neuvěřitelně skvěle, moc ti děkuji za vše! Slibuju že si ho celý prostuduju, okomentuju atp. :D A v javě se zlepším, značně -_-

Re:JOGL Projekt
« Odpověď #9 kdy: 13. 04. 2014, 19:48:01 »
Funguje to neuvěřitelně skvěle, moc ti děkuji za vše! Slibuju že si ho celý prostuduju, okomentuju atp. :D A v javě se zlepším, značně -_-
To jsem rád. Zlom vaz!
Bible Kralická, přísloví 26

3 Bič na koně, uzda na osla, a kyj na hřbet blázna.
7 Jakož nejednostejní jsou hnátové kulhavého, tak řeč v ústech bláznů.
14 Dvéře se obracejí na stežejích svých, a lenoch na lůži svém.
27 Kdo jámu kopá, do ní upadá, a kdo valí kámen, na něj se obrací.

Krleš!

Hefatel

Re:JOGL Projekt
« Odpověď #10 kdy: 28. 04. 2014, 21:50:59 »
Ahoj, tvůj kód mi také hodně pomohl, ale nemůžu přijít na to, jak mám implementovat třídu Img32Loader. Možná jsem to tu někde přehlédl, ale nemůžu to najít.
Importovat mi ta třída nejde, takže z toho usuzuji, že si ji nejspíš musel sám vytvořit. Nejspíš v ní budou asi uloženy metody Load32Img atd. nebo se pletu? Mohl by ses o ní podělit?

Re:JOGL Projekt
« Odpověď #11 kdy: 29. 04. 2014, 11:43:09 »
Ahoj, tvůj kód mi také hodně pomohl, ale nemůžu přijít na to, jak mám implementovat třídu Img32Loader. Možná jsem to tu někde přehlédl, ale nemůžu to najít.
Importovat mi ta třída nejde, takže z toho usuzuji, že si ji nejspíš musel sám vytvořit. Nejspíš v ní budou asi uloženy metody Load32Img atd. nebo se pletu? Mohl by ses o ní podělit?

Jo, promiň. To je třída do které jsem dal metody ze třídy StaticImages v původním tutoriálu.
Tady je zdroják:
Kód: [Vybrat]
import java.awt.Color;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;

import javax.imageio.ImageIO;


public class Img32Loader {


   public void setBTrans(BufferedImage name,int temp){
      for (int _yi = 0; _yi<name.getHeight();_yi++){
      for (int _xi = 0; _xi<name.getWidth();_xi++){
      if (name.getRGB(_xi,_yi)==temp)
      name.setRGB(_xi,_yi,0);
      }//END X FOR STATEMENT
      }//END Y FOR STATEMENT
     
      }//END METHOD
   
   private int fixRGB(int num){
      int Alpha = 0xFF000000;
      int Red   = 0x00FF0000;
      int Green = 0x0000FF00;
      int Blue  = 0x000000FF;
      int finalR = 0;
     
      Red   =   num & Red;
      Red   =   Red << 8;
     
      Green   =   num & Green;
      Green   =   Green << 8;
     
      Blue   =   num & Blue;
      Blue   =   Blue << 8;
     
      Alpha  =   num & Alpha;
      Alpha  =   Alpha >>> 24;
     
     
      finalR = Red | Green | Blue | Alpha;
     
      return finalR;
   }//END METHOD
   
   
   
   

   public Img32 Load32BitImg(String name,java.awt.GraphicsDevice GD,boolean trans){
   Img32 obrazek=null;
         try{

         Image imgTemp;
         imgTemp = (Image)ImageIO.read(new File(name));
         ByteBuffer buf;
         //System.out.println("Found File");
         
         BufferedImage Bimg = GD.getDefaultConfiguration().createCompatibleImage(imgTemp.getWidth(null),imgTemp.getHeight(null),Color.BITMASK);
         Bimg.getGraphics().drawImage(imgTemp,0,0,null);
         
         if (trans)
         setBTrans(Bimg,Bimg.getRGB(0,Bimg.getHeight()-1));
         
         buf = ByteBuffer.allocateDirect((Bimg.getWidth()*Bimg.getHeight())*4);
         
         for (int y = 0; y< Bimg.getHeight();y++){
            for (int x = 0; x< Bimg.getWidth();x++)
         buf.putInt(fixRGB(Bimg.getRGB(x, Bimg.getHeight()-y-1)));
         }//END FOR LOOP
           
         //System.out.println("BUFFER MADE");
         
         obrazek=new Img32(Bimg.getWidth(),Bimg.getHeight(),buf);
         
         }catch(IOException ie){
         System.out.println("Error Reading Image");
         }//END TRY AND CATCH STATEMENT
         return obrazek;
         }//END METHOD
   
   
   
   
}//END CLASS


Všechny tři třídy jsem sem taky pro jistotu nahrál v zipu:
Bible Kralická, přísloví 26

3 Bič na koně, uzda na osla, a kyj na hřbet blázna.
7 Jakož nejednostejní jsou hnátové kulhavého, tak řeč v ústech bláznů.
14 Dvéře se obracejí na stežejích svých, a lenoch na lůži svém.
27 Kdo jámu kopá, do ní upadá, a kdo valí kámen, na něj se obrací.

Krleš!

Hefatel

Re:JOGL Projekt
« Odpověď #12 kdy: 29. 04. 2014, 15:18:06 »
Dík moc, myslel jsem si to tak, jak si to měl ty.