// Copyright (c) 2011 Wistron SWPC
// All rights reserved.
// created: 2011/09/28
// filename: FileIcon.java
// author: Neo Yeoh
// purpose:
package com.wistron.WiGallery;
import java.nio.ByteBuffer;
import java.nio.FloatBuffer;
import javax.microedition.khronos.opengles.GL10;
import Utilities.CSStaticData;
import android.graphics.Bitmap;
import android.util.Log;
enum MEDIA_VIEW
{
LEFT_VIEW,
RIGHT_VIEW
}
enum ELEM_STATUS
{
NORMAL_STATUS,
SELECTED_STATUS,
DISABLE_STATUS
}
public class Element extends ElementBase
{
public long m_id = -1;
private int m_cover_left_texture_id;
private int m_cover_right_texture_id;
private boolean m_b_request = false;
private CSStaticData.MEDIA_TYPE m_type = CSStaticData.MEDIA_TYPE.NORMAL_IMAGE;
public Bitmap m_bmpL;
public Bitmap m_bmpR;
public String[] m_str_address = null;
private final Byte [] m_line_index ={0,1,3,2};
private ByteBuffer m_line_index_buff = ResourceManager.makeByteBuffer(m_line_index);
// globe
private int m_filetype_texture_id = CSStaticData.INVALID_TEXTURE_ID;
private int m_choosed_texture_id = CSStaticData.INVALID_TEXTURE_ID;
private int m_not_choosed_texture_id = CSStaticData.INVALID_TEXTURE_ID;
private FloatBuffer m_cover_buff = null;
private FloatBuffer m_indicator_buff = null;
private FloatBuffer m_tex_buff = null;
private String m_str_name = null;
private String m_str_date = null;
public double m_longitude = 0;
public double m_latitude = 0;
private boolean m_b_favorite = false;
// 判断是否加载纹理
public boolean m_is_load_texture = false;
private static final float[] m_image_vers =
{
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
-0.5f, 0.5f, 0.0f,
0.5f, 0.5f, 0.0f,
};
private static final float[] m_indicator_vers =
{
-0.125f, -0.125f, 0.0f,
0.125f, -0.125f, 0.0f,
-0.125f, 0.125f, 0.0f,
0.125f, 0.125f, 0.0f,
};
private static final float[] m_image_coords =
{
0,1, 1,1,
0,0, 1,0,
};
public Element(CSStaticData.MEDIA_TYPE fileType, int coverLeftTextureID, int coverRightTextureID, int choosedTextureID, int notChoosedTextureID, String name, String date, double latitude, double longitude)
{
m_type = fileType;
m_is_choosed = false;
m_str_name = name;
m_str_date = date;
m_longitude = longitude; //经度
m_latitude = latitude; //纬度
m_cover_left_texture_id = coverLeftTextureID;
m_cover_right_texture_id = coverRightTextureID;
switch (m_type)
{
case NORMAL_IMAGE:
case STOERE_IMAGE:
{
m_filetype_texture_id = 0;
}
break;
case STOERE_VIDEO:
case NORMAL_VIDEO:
{
m_filetype_texture_id = WiGalleryOpenGLRenderer.m_zmap_videoindicator_id;
}
break;
default:
break;
}
m_choosed_texture_id = choosedTextureID;
m_not_choosed_texture_id = notChoosedTextureID;
m_cover_buff = ResourceManager.makeFloatBuffer(m_image_vers);
m_indicator_buff = ResourceManager.makeFloatBuffer(m_indicator_vers);
m_tex_buff = ResourceManager.makeFloatBuffer(m_image_coords);
}
public void setFavorite(boolean bFavorite)
{
m_b_favorite = bFavorite;
}
public boolean bFavorite()
{
return m_b_favorite;
}
public void setTextureID(int coverLeftTextureID, int coverRightTextureID)
{
m_cover_left_texture_id = coverLeftTextureID;
m_cover_right_texture_id = coverRightTextureID;
}
public CSStaticData.MEDIA_TYPE getFileType()
{
return m_type;
}
/**
* 设置视图
* @param 0: 左视图 1:右视图
*/
public void SetViewSide(MEDIA_VIEW view)
{
m_view_side = view;
}
// 获取当前File的ID
public String getName()
{
return m_str_name;
}
public void setName(String strName){
m_str_name = strName;
}
public String getDate()
{
return m_str_date;
}
public boolean isRequest()
{
return m_b_request;
}
public void setRequest(boolean request)
{
m_b_request = request;
}
// 获取封面纹理ID
public int getRightTextureID()
{
if(m_type == CSStaticData.MEDIA_TYPE.STOERE_IMAGE)
return m_cover_right_texture_id;
else
return m_cover_left_texture_id;
}
public int getTextureID(MEDIA_VIEW view)
{
if (view == MEDIA_VIEW.LEFT_VIEW)
return getLeftTextureID();
else
{
return getRightTextureID();
}
}
public int getLeftTextureID()
{
return m_cover_left_texture_id;
}
public void calcPosition()
{
if (m_animation_type == CSStaticData.ANIMATION_TYPE.LEFT_SHIFT)
{
//左移动画
if (m_animation_index == (int)(m_animation_num * 1.5f))
{
// 最后一帧
m_x_offset = m_final_position[0];
m_y_offset = m_final_position[1];
m_z_offset = m_final_position[2];
m_xrot = m_final_angle[0];
m_yrot = m_final_angle[1];
m_zrot = m_final_angle[2];
m_animation_index = -1;
m_animation_type = CSStaticData.ANIMATION_TYPE.NONE;
}
else if (m_animation_index < m_animation_num)
{
// 移动+翻转
m_x_offset -= m_animation_step[0];
m_y_offset += m_animation_step[1];
m_z_offset += m_animation_step[2];
m_yrot -= 90.0f/m_animation_num;
}
else
{
// 翻转
m_yrot += 180.0f/m_animation_num;
}
m_animation_index++;
}
else if (m_animation_type == CSStaticData.ANIMATION_TYPE.RIGHT_SHIFT)
{
//右移动画
if (m_animation_index == (int)(m_animation_num * 1.5f) )
{
// 最后一帧
m_x_offset = m_final_position[0];
m_y_offset = m_final_position[1];
m_z_offset = m_final_position[2];
m_xrot = m_final_angle[0];
m_yrot = m_final_angle[1];
m_zrot = m_final_angle[2];
m_animation_index = -1;
m_animation_type = CSStaticData.ANIMATION_TYPE.NONE;
}
else if (m_animation_index < m_animation_num)
{
// 移动+翻转
m_x_offset += m_animation_step[0];
m_y_offset -= m_animation_step[1];
m_z_offset -= m_animation_step[2];
m_yrot += 1;
}
else
{
// 翻转
m_yrot -= 2;
}
m_animation_index++;
}
else if (m_animation_type == CSStaticData.ANIMATION_TYPE.GENTLE_SHIFT)
{
// 左右轻移动画
if (m_animation_index >= m_animation_num )
{
// 最后一帧
m_x_offset = m_final_position[0];
m_y_offset = m_final_position[1];
m_z_offset = m_final_position[2];
m_xrot = m_final_angle[0];
m_yrot = m_final_angle[1];
m_zrot = m_final_angle[2];
m_animation_index = -1;
m_animation_type = CSStaticData.ANIMATION_TYPE.NONE;
}
else if (m_animation_index < m_animation_num)
{
// 移动+翻转
m_x_offset += m_animation_step[0];
m_y_offset += m_animation_step[1];
m_z_offset += m_animation_step[2];
}
m_animation_index++;
}
else
{
//~!
}
}
public void onDraw(GL10 gl, boolean bDraw)
{
gl.glPushMatrix();
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glTranslatef(m_x_offset, m_y_offset, m_z_offset);
gl.glRotatef(m_xrot, 1, 0, 0);
gl.glRotatef(m_yrot, 0, 1, 0);
gl.glRotatef(m_zrot, 0, 0, 1);
int texID = 0;
if (bDraw)
{
// 绘制阴影
/*
if (!CSStaticData.g_is_3D_mode)
{
gl.glPushMatrix();
gl.glDisable(GL10.GL_DEPTH_TEST);
gl.glTranslatef(0.15f, 0.10f, 0.0f);
gl.glBindTexture(GL10.GL_TEXTURE_2D, WiGalleryOpenGLRenderer.m_zmap_shade);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, m_cover_buff);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, m_tex_buff);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glPopMatrix();
}
*/
// 绘制图片
if (m_view_side == MEDIA_VIEW.RIGHT_VIEW && m_type == CSStaticData.MEDIA_TYPE.STOERE_IMAGE)
{
// 立体图,并且当前显示右图
texID = m_cover_right_texture_id;
}
else
{
texID = m_cover_left_texture_id;
}
if (texID == CSStaticData.INVALID_TEXTURE_ID)
{
if (m_type == CSStaticData.MEDIA_TYPE.NORMAL_VIDEO || m_type == CSStaticData.MEDIA_TYPE.STOERE_VIDEO)
texID = WiGalleryOpenGLRenderer.m_default_video_icon;
else
texID = WiGalleryOpenGLRenderer.m_default_file_icon;
}
gl.glBindTexture(GL10.GL_TEXTURE_2D, texID);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, m_cover_buff);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, m_tex_buff);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
// 绘制文件类型
if (m_type == CSStaticData.MEDIA_TYPE.NORMAL_VIDEO || m_type == CSStaticData.MEDIA_TYPE.STOERE_VIDEO)
m_filetype_texture_id = WiGalleryOpenGLRenderer.m_zmap_videoindicator_id;
if (m_filetype_texture_id != CSStaticData.INVALID_TEXTURE_ID
&& (m_type == CSStaticData.MEDIA_TYPE.NORMAL_VIDEO || m_type == CSStaticData.MEDIA_TYPE.STOERE_VIDEO))
{
gl.glPushMatrix();
gl.glTranslatef(0, 0, 0.02f);
gl.glBindTexture(GL10.GL_TEXTURE_2D, m_filetype_texture_id);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, m_cover_buff);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, m_tex_buff);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
gl.glPopMatrix();
}
// 3D标志
if (WiGalleryOpenGLRenderer.m_indicator_3d != CSStaticData.INVALID_TEXTURE_ID
&& (m_type == CSStaticData.MEDIA_TYPE.STOERE_VIDEO || m_type == CSStaticData.MEDIA_TYPE.STOERE_IMAGE))
{
gl.glPushMatrix();
gl.glDisable(GL10.GL_DEPTH_TEST);
gl.glTranslatef(0.35f, 0.35f, 0);
gl.glBindTexture(GL10.GL_TEXTURE_2D, WiGalleryOpenGLRenderer.m_indicator_3d);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, m_indicator_buff);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, m_tex_buff);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glPopMatrix();
}
if (m_b_favorite)
{
gl.glPushMatrix();
gl.glDisable(GL10.GL_DEPTH_TEST);
gl.glTranslatef(0.35f, 0.1f, 0);
gl.glBindTexture(GL10.GL_TEXTURE_2D, WiGalleryOpenGLRenderer.m_indicator_favorite);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, m_indicator_buff);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, m_tex_buff);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glPopMatrix();
}
// 绘制选择标志
if (m_status == ELEM_STATUS.SELECTED_STATUS )
{
gl.glPushMatrix();
gl.glDisable(GL10.GL_DEPTH_TEST);
gl.glTranslatef(0.35f, -0.35f, 0);
if (m_choosed_texture_id == CSStaticData.INVALID_TEXTURE_ID)
m_choosed_texture_id = WiGalleryOpenGLRenderer.m_zmap_select_gallery_select_id;
if (m_not_choosed_texture_id == CSStaticData.INVALID_TEXTURE_ID)
m_not_choosed_texture_id = WiGalleryOpenGLRenderer.m_zmap_select_gallery_none_id;
if(m_is_choosed)
{
if (m_choosed_texture_id != CSStaticData.INVALID_TEXTURE_ID)
{
gl.glBindTexture(GL10.GL_TEXTURE_2D, m_choosed_texture_id);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, m_indicator_buff);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, m_tex_buff);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
}
}
else
{
if (m_not_choosed_texture_id != CSStaticData.INVALID_TEXTURE_ID)
{
gl.glBindTexture(GL10.GL_TEXTURE_2D, m_not_choosed_texture_id);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, m_indicator_buff);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, m_tex_buff);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
}
}
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glPopMatrix();
}
// 绘制边框
// gl.glDisable(GL10.GL_TEXTURE_2D);
// gl.glColor4f(0.5f, 0.5f, 0.5f, 0.5f);
// gl.glLineWidth(4.0f);
//
// gl.glVertexPointer(3, GL10.GL_FLOAT, 0, m_cover_buff);
// gl.glDrawElements(GL10.GL_LINE_LOOP, 4, GL10.GL_UNSIGNED_BYTE, m_line_index_buff);
gl.glEnable(GL10.GL_TEXTURE_2D);
}
gl.glPopMatrix();
}
/**
* 设置创建纹理所需的位图
* @param bmpL
* @param bmpR
*/
public void setBitmap(Bitmap bmpL, Bitmap bmpR)
{
m_bmpR = bmpR;
m_bmpL = bmpL;
}
/**
* 从主链表中删除改元素及对应的纹理,如果该元素存在于其它链表中,则需手动删除
*/
public void delete()
{
WiGalleryOpenGLRenderer.m_data_manager.AddNeedDeleteElement(this);
}
public void loadTexture(GL10 gl)
{
switch(m_type)
{
case STOERE_IMAGE:
case STOERE_VIDEO:
{
if (m_bmpL != null)
m_cover_left_texture_id = WiGalleryOpenGLRenderer.m_resource_manager.GetTextureID(m_bmpL);
else
m_cover_left_texture_id = CSStaticData.INVALID_TEXTURE_ID;
if (m_bmpR != null)
m_cover_right_texture_id = WiGalleryOpenGLRenderer.m_resource_manager.GetTextureID(m_bmpR);
else
m_cover_right_texture_id = CSStaticData.INVALID_TEXTURE_ID;
// 如果不在创建一个纹理,texR就不起作用,临时这样处理一下,在设置完后删除该纹理
int id = WiGalleryOpenGLRenderer.m_resource_manager.GetTextureID(m_bmpR);
// 纹理加载完成
m_is_load_texture = true;
WiGalleryOpenGLRenderer.m_resource_manager.DeleteTextureID(id);
if (m_bmpL != null)
{
m_bmpL.recycle();
m_bmpL = null;
}
if (m_bmpR != null)
{
m_bmpR.recycle();
m_bmpR = null;
}
}
break;
case NORMAL_IMAGE:
case NORMAL_VIDEO:
{
if (m_bmpL != null)
m_cover_left_texture_id = WiGalleryOpenGLRenderer.m_resource_manager.GetTextureID(m_bmpL);
else
m_cover_left_texture_id = CSStaticData.INVALID_TEXTURE_ID;
// 如果不在创建一个纹理,texR就不起作用,临时这样处理一下,在设置完后删除该纹理
int id = WiGalleryOpenGLRenderer.m_resource_manager.GetTextureID(m_bmpL);
// 纹理加载完成
m_is_load_texture = true;
WiGalleryOpenGLRenderer.m_resource_manager.DeleteTextureID(id);
if (m_bmpL != null)
{
m_bmpL.recycle();
m_bmpL = null;
}
}
break;
default:
break;
}
m_b_request = false;
if (CSStaticData.DEBUG)
Log.d("Element", String.format("[%s][%d][%d]", m_str_name, m_cover_left_texture_id, m_cover_right_texture_id));
}
public boolean onTouchEvent(float x, float y)
{
if(CSStaticData.isInRect(m_x_offset, m_y_offset, m_z_offset, x, y, 0.5f))
{
if (m_status == ELEM_STATUS.NORMAL_STATUS)
{
// 打开文件
if (WiGalleryInterface.m_onGlItemListener != null)
WiGalleryInterface.m_onGlItemListener.onFileClick(getName());
if (CSStaticData.DEBUG)
Log.d("Element", String.format("[OpenFile][%s]", getName()));
}
else if (m_status == ELEM_STATUS.SELECTED_STATUS)
{
// 选择模式
m_is_choosed = !m_is_choosed;
if(WiGalleryInterface.m_onGlItemListener != null){
WiGalleryInterface.m_onGlItemListener.onFileClick(m_str_name);
}
}
else
{
}
return true;
}
else
{
return false;
}
}
}