00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00036 class PG_API pgPrim : public pgDraw
00037 {
00038 friend class pgRend;
00039
00040 public:
00041 struct PG_API PrimData
00042 {
00043 pgVec pos;
00044 pgCol col;
00045 r32 u, v;
00046
00047 PrimData();
00048 };
00049
00050 enum PrimMode
00051 {
00052 MODE_POINTS,
00053 MODE_LINES,
00054 MODE_LINE_LOOP,
00055 MODE_LINE_STRIP,
00056 MODE_TRIANGLES,
00057 MODE_TRIANGLE_STRIP,
00058 MODE_TRIANGLE_FAN
00059 };
00060
00061 pgPrim();
00062 virtual ~pgPrim();
00063
00064 void init(PrimMode prim_mode, u16 max_data_num, pgID scr_id);
00065 void init(PrimMode prim_mode, u16 max_data_num, pgDraw* parent);
00066
00067 void init(PrimMode prim_mode, PrimData* prim_data, u16 max_data_num, pgID scr_id);
00068 void init(PrimMode prim_mode, PrimData* prim_data, u16 max_data_num, pgDraw* parent);
00069
00070 PrimMode getPrimMode() const;
00071 void setPrimMode(PrimMode prim_mode);
00072
00073 bool isShareData() const;
00074
00075 u16 getCurDataNum() const;
00076 void setCurDataNum(u16 cur_data_num);
00077 u16 getMaxDataNum() const;
00078 void reallocData(u16 max_data_num);
00079 void copyData(u16 dest_index, const pgPrim* src_prim, u16 src_index);
00080
00081 pgVec& dataPos(u16 index);
00082 pgCol& dataCol(u16 index);
00083 r32& dataU(u16 index);
00084 r32& dataV(u16 index);
00085 void setDataUV(u16 index, r32 u, r32 v);
00086 void setDataRect(u16 index, const pgVec& center, r32 width, r32 height, pgCol col, r32 u1, r32 v1, r32 u2, r32 v2);
00087
00088 private:
00089 void init2(PrimMode prim_mode, bool is_share_data, PrimData* prim_data, u16 max_data_num, pgID scr_id, pgDraw* parent);
00090
00091 virtual void render(const pgMat& view);
00092 void render_soft(const pgMat& view);
00093 void render_shader(const pgMat& view);
00094
00095 pgType<u8, PrimMode> m_prim_mode;
00096 pgType<u8, bool> m_is_share_data;
00097 PrimData* m_prim_data;
00098 u16 m_cur_data_num;
00099 u16 m_max_data_num;
00100 pgRend* m_rend;
00101 };