Autor Wątek: Wariuje, android, albo ja.  (Przeczytany 3154 razy)

Offline Invincible

  • Użytkownik
    • Invincible

# Listopad 23, 2013, 11:35:22
Zacznijmy od tego że jestem zielony tak w Eclipse, jak i w Javie, jak i w programowaniu na androida.


Jakoś przebrnąłem przez GLES20, wczytałem własny format plików 3d, shadery, tekstury itd.

Chciałem sobie przeorganizować kod bo rozrost  "public class AppRenderer implements GLSurfaceView.Renderer" zagrażał tym że sam się nie połapię w kodzie, stworzyłem sobie klasę:

package com.example.projekt;

import java.nio.FloatBuffer;

import android.opengl.Matrix;



public class modelstatic
{
 static int ILE_MODEL = 10;
 Vector3f pos[]=new Vector3f[ILE_MODEL];
 Vector3f angle[]=new Vector3f[ILE_MODEL];
 int co[]=new int[ILE_MODEL];
 int ile=0;


modelstatic()
{
ile=3;
co[0]=0;
co[1]=0;
co[2]=1;
pos[0].set(0.0f,0.0f,0.0f);
pos[1].set(1.0f,0.0f,0.0f);
pos[2].set(2.0f,0.0f,0.0f);
}




}

Która w zamyśle ma przechowywać dane obiektów statycznych i nimi zarządzać (nie elegancko napisana, ale to teraz chyba nie ważne, to tylko prototyp i jak mówiłem java to dla mnie nowość więc po kolei), a w funkcji onDrawFrame chciałem po prostu narysować model opierając się na danych z obiektu w.w. klasy.





Więc gdzieś w "public class AppRenderer implements GLSurfaceView.Renderer" inicjuje sobie obiekt: modelstatic Modelstatic = new modelstatic(); i chcę odwołać się do niego w funkcji public "void onDrawFrame(GL10 unused)", na przykład w ten sposób:

for(int i=0;i<Modelstatic.ile;i++)
{
Matrix.translateM(tmpMatrix, 0, Modelstatic.pos[i].x, Modelstatic.pos[i].y, Modelstatic.pos[i].z);
Matrix.multiplyMM(tmpMatrix, 0, ViewProjMatrix, 0, tmpMatrix, 0);
GLES20.glUniformMatrix4fv(iVPMatrix, 1, false, tmpMatrix, 0);
DrawModel(ble ble ble, nie istotne);
}
Wszystko ładnie, Eclipse nie rzuca nawet ostrzeżeń, problem w tym że aplikacja wysypuje się na urządzeniu. Co więcej, jakiekolwiek odwołanie się do obiektu tej klasy powoduje wysypanie się aplikacji.

Nie mogę nawet dać "modelstatic Modelstatic = new modelstatic();" wewnątrz "public void onDrawFrame(GL10 unused)" bo aplikacja się wysypuje. Nawet jeśli się do niego nie odnoszę i Eclipse ostrzega że jest "not used"



Czy ja coś ominąłem, nie doczytałem i robię to w zły sposób? Jeśli tak to niby jak w klasie renderującej mam używać obiektów innych klas, bo chyba nie wwalę całego kodu do "public class AppRenderer implements GLSurfaceView.Renderer" :D
« Ostatnia zmiana: Listopad 23, 2013, 11:38:06 wysłana przez Invincible »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Adam7

  • Użytkownik
    • warsztat.gd

# Listopad 23, 2013, 11:51:55
Co to są za obiekty Vector3f?
« Ostatnia zmiana: Listopad 23, 2013, 11:55:52 wysłana przez Adam7 »

Offline Invincible

  • Użytkownik
    • Invincible

# Listopad 23, 2013, 11:57:25
Chyba też nic strasznego nie robią, zalążek mojej przepisywanej z c++ klasy do wektorów:

package com.example.projekt;

import android.opengl.Matrix;

public class Vector3f {
public float x,y,z;


Vector3f()
{
x=0.0f;
y=0.0f;
z=0.0f;
}

void set(float a, float b, float c)
{
x=a;
y=b;
z=c;
}


}
« Ostatnia zmiana: Listopad 23, 2013, 11:59:40 wysłana przez Invincible »

Offline Adam7

  • Użytkownik
    • warsztat.gd

# Listopad 23, 2013, 12:00:44
sprawdź LogCatem na czym dokładnie się zatrzymuje.

Offline Invincible

  • Użytkownik
    • Invincible

# Listopad 23, 2013, 12:05:14
Mam trop, po wywaleniu Vector3f z klasy: "public class modelstatic" która teraz wygląda tak:

public class modelstatic
{
 static int ILE_MODEL = 10;
 //Vector3f pos[]=new Vector3f[ILE_MODEL];
 //Vector3f angle[]=new Vector3f[ILE_MODEL];
 int co[]=new int[ILE_MODEL];
 int ile;


modelstatic()
{

}

void init()
{
ile=3;

for(int i=0;i<ILE_MODEL;i++)
{
co[i]=0;
}
}

int getIle()
{
return ile;
}


}


Działą, i nawet parametr int po inicjacji jest równy 3 i mogę z niego korzystać w onDrawFrame.  Niby dobrze, ale przydałyby mi się te Vectory3f :D

Offline Invincible

  • Użytkownik
    • Invincible

# Listopad 23, 2013, 12:12:24
Problem rozwiązany, winna okazała się nieznajomość Javy.

Tutaj:
static int ILE_MODEL = 10;
Vector3f pos[]=new Vector3f[ILE_MODEL];

Nie inicjuje 10 obiektów klasy Vector3f, tylko zdaje się alokuje dla nich pamięć, czy tam tworze wskaźnik, albo i jedno i drugie. Muszę doczytać :D Oczywiste w takim razie że będzie się sypać jeśli będę się chciał odwołać do nich jak do obiektów w c++ zanim te obiekty stworzę. Funkcja inicjująca przerobiona na:
void init()
{
ile=3;

for(int i=0;i<ILE_MODEL;i++)
{
co[i]=0;
pos[i]=new Vector3f( (float)i, 0.0f, 0.0f);
}
}

I problem przez który nie mogłem spać w nocy rozwiązany :D W sumie to Eclipse mogłoby sypnąć tutaj ostrzeżeniem.
« Ostatnia zmiana: Listopad 23, 2013, 12:22:57 wysłana przez Invincible »

Offline Avaj

  • Użytkownik

# Listopad 23, 2013, 13:07:06
No tak bo ta tablica się zapełni nullami bo to domyślna wartość dla referencji, zresztą w C++ to samo byś miał (pomijając że w C++ byś wektory miał jako value types):

Kod: (cpp) [Zaznacz]
vector** tablica_wektorow = new vector*[10];
tablica_wektorow[1]->setValue("xx") // BANG
« Ostatnia zmiana: Listopad 23, 2013, 17:39:38 wysłana przez Avaj »

Offline Xion

  • Redaktor
    • xion.log

# Listopad 23, 2013, 19:26:09
Cytuj
Nie inicjuje 10 obiektów klasy Vector3f, tylko zdaje się alokuje dla nich pamięć, czy tam tworze wskaźnik, albo i jedno i drugie.
Tworzysz tablicę, czyli obiekt typy Vector3f[].

Zasadniczo mam taką ogólną uwagę: co właściwie robi ta klasa modelstatic (*)? Ni to klasa pojedynczego modelu, bo po co miałby on 10 wektorów pozycji; ni to jakieś DOD-owe wynalazki typu struct-of-arrays, bo wtedy tablice `pos` i `angle` też by były statyczne.
Zdecyduj się, co masz na myśli. Akurat pod tym względem - statycznych vs niestatycznych składników klasy - Java nie różni się właściwie od C++.

(*) Pomijając już ogólną uwagę iż klasy nazywamy TakąKonwencją.

Offline Invincible

  • Użytkownik
    • Invincible

# Listopad 23, 2013, 21:17:52
To nic ;) Eksperymenty po prostu ;)

Offline jeruka9

  • Użytkownik

# Listopad 26, 2013, 21:36:11
jedno i drugie nie ma nic gorszego od szalonego programisty :d