/* * PROJECT: NyARMqoView * -------------------------------------------------------------------------------- * これはMetaseqファイル(.MQO)ファイルをjavaに読み込み&描画するクラスです。 * Copyright (C)2008 kei * * * オリジナルファイルの著作権はkeiさんにあります。 * オリジナルのファイルは以下のURLから入手できます。 * http://www.sainet.or.jp/~kkoni/OpenGL/reader.html * * このファイルは、http://www.sainet.or.jp/~kkoni/OpenGL/20080408.zipにあるファイルを * ベースに、NyARMqoView用にカスタマイズしたものです。 * * For further information please contact. * A虎@nyatla.jp * http://nyatla.jp/nyatoolkit/ * <airmail(at)ebony.plala.or.jp> * */ package jp.nyatla.kGLModel; /** * float型の頂点関連情報を保持、計算する為のクラス<br> * @author kei * */ class KGLPoint { /** * データ保持配列 */ private float[] data = null ; /** * カラデータ作成 * @param in_num データ数 */ public KGLPoint(int in_num) { data = new float[in_num] ; } /** * 指定データ配列と同じ内容のデータで作成 * @param source 指定データ */ public KGLPoint(KGLPoint source) { data = new float[source.getData().length] ; set(source.getData()) ; } /** * 指定データ配列と同じ内容のデータで作成 * @param in_data 指定データ * @return 作成クラス */ static public KGLPoint create(KGLPoint in_data) { KGLPoint ret ; ret = new KGLPoint(in_data.data.length) ; ret.set(in_data.getData()) ; return ret ; } /** * 指定データ配列と同じ内容のデータで作成 * @param in_data 指定データ * @return 作成クラス */ static public KGLPoint create(float[] in_data) { KGLPoint ret ; ret = new KGLPoint(in_data.length) ; ret.set(in_data) ; return ret ; } /** * 指定UVデータでこのクラスを作成 * @param U * @param V * @return 作成クラス */ static public KGLPoint createUV(float U,float V) { KGLPoint ret = new KGLPoint(2) ; ret.set_UV(U,V) ; return ret ; } /** * 指定頂点データでこのクラスを作成 * @param X * @param Y * @param Z * @return 作成クラス */ static public KGLPoint createXYZ(float X,float Y,float Z) { KGLPoint ret = new KGLPoint(3) ; ret.set_XYZ(X,Y,Z) ; return ret ; } /** * 指定カラーデータでこのクラスを作成 * @param R * @param G * @param B * @return 作成クラス */ static public KGLPoint createCOLOR(float R,float G,float B) { KGLPoint ret = new KGLPoint(3) ; ret.set_COLOR(R,G,B) ; return ret ; } /** * 指定カラーデータでこのクラスを作成 * @param R * @param G * @param B * @param A * @return 作成クラス */ static public KGLPoint createCOLOR(float R,float G,float B,float A) { KGLPoint ret = new KGLPoint(4) ; ret.set_COLOR(R,G,B,A) ; return ret ; } // 正規化(長さを求めて、ソレで割って0~1の値にする!) /** * 正規化をする<br> * 原点からの距離をもとめて、全要素を距離で割って0~1の値にする<br> * @return 自分自身 */ public KGLPoint normalize() { double add ; double len ; add = 0 ; for( int i = 0 ; i < data.length ; i++ ) { add += data[i]*data[i] ; } len = Math.sqrt(add) ; if( len == 0 ) return this ; for( int i = 0 ; i < data.length ; i++ ) { data[i] /= len ; } return this ; } /** * from地点~to地点を原点からの点にする<br> * 0   from--->to<br> * 原点<br> * ↓<br> * 0--->returan値<br> * @param from * @param to * @return 自分自身 */ static public KGLPoint vector(KGLPoint from,KGLPoint to) { KGLPoint ret = null ; float[] d_from ; float[] d_to ; float[] d_ret ; d_from = from.getData() ; d_to = to.getData() ; if( d_from.length != d_to.length ) return null ; d_ret = new float[d_from.length] ; for( int i= 0 ; i < d_ret.length ; i++ ) { d_ret[i] = d_to[i] - d_from[i] ; } ret = new KGLPoint(d_ret.length) ; ret.set(d_ret) ; return ret ; } /** * 内部データの取り出し * @return 内部データ */ protected float[] getData() { return data ; } /** * データをこのクラスに設定する * @param src データ * @return 自分自身 */ public KGLPoint set(KGLPoint src ) { System.arraycopy(src.data,0,data,0,(data.length<src.data.length)?data.length:src.data.length) ; return this ; } /** * データをこのクラスに設定する * @param src データ * @return 自分自身 */ public KGLPoint set(float[] src ) { System.arraycopy(src,0,data,0,(data.length<src.length)?data.length:src.length) ; return this ; } /** * 3次元データをこのクラスに設定する * @param x * @param y * @param z * @return 自分自身 */ public KGLPoint set_XYZ(float x,float y,float z) { data[0] = x ; data[1] = y ; data[2] = z ; return this ; } /** * 2次元データをこのクラスに設定する * @param u * @param v * @return 自分自身 */ public KGLPoint set_UV(float u,float v) { data[0] = u ; data[1] = v ; return this ; } /** * カラーデータをこのクラスに設定する * @param r * @param g * @param b * @return 自分自身 */ public KGLPoint set_COLOR(float r,float g,float b) { data[0] = r ; data[1] = g ; data[2] = b ; return this ; } /** * カラーデータをこのクラスに設定する * @param r * @param g * @param b * @param a * @return 自分自身 */ public KGLPoint set_COLOR(float r,float g,float b,float a) { data[0] = r ; data[1] = g ; data[2] = b ; data[3] = a ; return this ; } /** * このクラスの要素に追加データを足し込む * @param in 追加データ * @return 自分自身 */ public KGLPoint add(KGLPoint in ) { for( int i = 0 ; i < in.data.length || i < data.length ; i++ ) { data[i] += in.data[i] ; } return this ; } /** * このクラスの要素に追加データを足し込む * @param in 追加データ * @return 自分自身 */ public KGLPoint add(float[] in ) { for( int i = 0 ; i < in.length || i < data.length ; i++ ) { data[i] += in[i] ; } return this ; } /** * このクラスの要素を指定倍する * @param in 倍率 * @return 自分自身 */ public KGLPoint scale(float in) { for( int i = 0 ; i < data.length ; i++ ) { data[i] *= in ; } return this ; } /** * 要素xを取り出す * @return 指定データ */ public float X() { return data[0] ; } /** * 要素Yを取り出す * @return 指定データ */ public float Y() { return data[1] ; } /** * 要素Zを取り出す * @return 指定データ */ public float Z() { return data[2] ; } /** * 要素Uを取り出す * @return 指定データ */ public float U() { return data[0] ; } /** * 要素Vを取り出す * @return 指定データ */ public float V() { return data[1] ; } /** * 要素Rを取り出す * @return 指定データ */ public float R() { return data[0] ; } /** * 要素Gを取り出す * @return 指定データ */ public float G() { return data[1] ; } /** * 要素Bを取り出す * @return 指定データ */ public float B() { return data[2] ; } /** * 要素Aを取り出す * @return 指定データ */ public float A() { return data[3] ; } /** * 内部データを文字列にする */ public String toString() { String ret = "[" ; for( int i = 0 ; i < data.length ; i++ ) { ret += Float.toString(data[i]) ; if( (i+1)<data.length) ret += ", " ; } ret += "]"; return ret ; } }