ios FlowCover效果demo
demo功能:flowcover 效果,正反无限循环滚动,每个cover都有单独的倒影
demo说明:项目中flowcover classes文件夹是存放核心类。
demo接图:
demo主要代码:绘制部分
[csharp]
- (void)drawtile:(int)index atoffset:(double)off
{
flowcoverrecord *fcr = [self gettileatindex:index];
glfloat m[16];
memset(m,0,sizeof(m));
m[10] = 1;
m[15] = 1;
m[0] = 1;
m[5] = 1;
double trans = off * spreadimage;
double f = off * flankspread;
if (f < -flankspread) {
f = -flankspread;
} else if (f > flankspread) {
f = flankspread;
}
m[3] = -f;
m[0] = 1-fabs(f);
double sc = 0.45 * (1 - fabs(f));
trans += f * 1;
glpushmatrix();
glbindtexture(gl_texture_2d,fcr.texture);
gltranslatef(trans, 0, 0);
glscalef(sc,sc,1.0);
glmultmatrixf(m);
gldrawarrays(gl_triangle_strip,0,4);
// reflect
gltranslatef(0,-2,0);
glscalef(1,-1,1);
glcolor4f(0.5,0.5,0.5,0.5);
gldrawarrays(gl_triangle_strip,0,4);
glcolor4f(1,1,1,1);
glpopmatrix();
}
- (void)draw
{
/*
* get the current ect ratio and initialize the viewport
*/
double aspect = ((double)backingwidth)/backingheight;
glviewport(0,0,backingwidth,backingheight);
gldisable(gl_depth_test); // using painters algorithm
glclearcolor(0,0,0,0);
glvertexpointer(3,gl_float,0,gvertices);
glenableclientstate(gl_vertex_array);
gltexcoordpointer(2, gl_short, 0, gtextures);
glenableclientstate(gl_texture_coord_array);
glenable(gl_texture_2d);
glblendfunc(gl_src_alpha,gl_one_minus_src_alpha);
glenable(gl_blend);
/*
* setup for clear
*/
[eaglcontext setcurrentcontext:context];
glbindframebufferoes(gl_framebuffer_oes, viewframebuffer);
glclear(gl_color_buffer_bit);
/*
* set up the basic coordinate system
*/
glmatrixmode(gl_projection);
glloadidentity();
glscalef(1,aspect,1);
glmatrixmode(gl_modelview);
glloadidentity();
//modify by chenwh 2010-01-06 for round view begin
/*
* change from alesandro tagliati <alessandro.tagliati@gmail.com>:
* we don't need to draw all the tiles, just the visible ones. we guess
* there are 6 tiles visible; that can be adjusted by altering the
* constant
*/
/*
int i,len = [self numtiles];
int mid = (int)floor(offset + 0.5);
int istartpos = mid - vistiles;
if (istartpos<0) {
istartpos=0;
}
for (i = istartpos; i < mid; ++i) {
[self drawtile:i atoffset:i-offset];
}
int iendpos=mid + vistiles;
if (iendpos >= len) {
iendpos = len-1;
}
for (i = iendpos; i >= mid; --i) {
[self drawtile:i atoffset:i-offset];
}
*/
int len = [self numtiles];
int istartpos = -vistiles;
int iendpos = vistiles;
int mid = 0;
int pagecount = (int)offset;
double moveoffset;
if (offset < 0) {
moveoffset = offset - ceil(offset);
} else {
moveoffset = offset - floor(offset);
}
int index, position;
//nslog(@"offset=%.2f, pagecount=%d, moveoffset=%.2f", offset, pagecount, moveoffset);
for (position = istartpos; position < mid; ++position) {
index = (len + position + pagecount) % len;
if (index < 0) {
index = len + index;
}
//nslog(@"index=%d, position=%d", index, position);
[self drawtile:index atoffset:position - moveoffset];
}
for (position = iendpos; position >= mid; --position) {
index = (position + pagecount) % len;
if (index < 0) {
index = len + index;
}
//nslog(@"index=%d, position=%d", index, position);
[self drawtile:index atoffset:position - moveoffset];
}
//modify by chenwh 2010-01-06 for round view end
glbindrenderbufferoes(gl_renderbuffer_oes, viewrenderbuffer);
[context presentrenderbuffer:gl_renderbuffer_oes];
}
- (void)drawtile:(int)index atoffset:(double)off
{
flowcoverrecord *fcr = [self gettileatindex:index];
glfloat m[16];
memset(m,0,sizeof(m));
m[10] = 1;
m[15] = 1;
m[0] = 1;
m[5] = 1;
double trans = off * spreadimage;
double f = off * flankspread;
if (f < -flankspread) {
f = -flankspread;
} else if (f > flankspread) {
f = flankspread;
}
m[3] = -f;
m[0] = 1-fabs(f);
double sc = 0.45 * (1 - fabs(f));
trans += f * 1;
glpushmatrix();
glbindtexture(gl_texture_2d,fcr.texture);
gltranslatef(trans, 0, 0);
glscalef(sc,sc,1.0);
glmultmatrixf(m);
gldrawarrays(gl_triangle_strip,0,4);
// reflect
gltranslatef(0,-2,0);
glscalef(1,-1,1);
glcolor4f(0.5,0.5,0.5,0.5);
gldrawarrays(gl_triangle_strip,0,4);
glcolor4f(1,1,1,1);
glpopmatrix();
}
- (void)draw
{
/*
* get the current aspect ratio and initialize the viewport
*/
double aspect = ((double)backingwidth)/backingheight;
glviewport(0,0,backingwidth,backingheight);
gldisable(gl_depth_test); // using painters algorithm
glclearcolor(0,0,0,0);
glvertexpointer(3,gl_float,0,gvertices);
glenableclientstate(gl_vertex_array);
gltexcoordpointer(2, gl_short, 0, gtextures);
glenableclientstate(gl_texture_coord_array);
glenable(gl_texture_2d);
glblendfunc(gl_src_alpha,gl_one_minus_src_alpha);
glenable(gl_blend);
/*
* setup for clear
*/
[eaglcontext setcurrentcontext:context];
glbindframebufferoes(gl_framebuffer_oes, viewframebuffer);
glclear(gl_color_buffer_bit);
/*
* set up the basic coordinate system
*/
glmatrixmode(gl_projection);
glloadidentity();
glscalef(1,aspect,1);
glmatrixmode(gl_modelview);
glloadidentity();
//modify by chenwh 2010-01-06 for round view begin
/*
* change from alesandro tagliati <alessandro.tagliati@gmail.com>:
* we don't need to draw all the tiles, just the visible ones. we guess
* there are 6 tiles visible; that can be adjusted by altering the
* constant
*/
/*
int i,len = [self numtiles];
int mid = (int)floor(offset + 0.5);
int istartpos = mid - vistiles;
if (istartpos<0) {
istartpos=0;
}
for (i = istartpos; i < mid; ++i) {
[self drawtile:i atoffset:i-offset];
}
int iendpos=mid + vistiles;
if (iendpos >= len) {
iendpos = len-1;
}
for (i = iendpos; i >= mid; --i) {
[self drawtile:i atoffset:i-offset];
}
*/
int len = [self numtiles];
int istartpos = -vistiles;
int iendpos = vistiles;
int mid = 0;
int pagecount = (int)offset;
double moveoffset;
if (offset < 0) {
moveoffset = offset - ceil(offset);
} else {
moveoffset = offset - floor(offset);
}
int index, position;
//nslog(@"offset=%.2f, pagecount=%d, moveoffset=%.2f", offset, pagecount, moveoffset);
for (position = istartpos; position < mid; ++position) {
index = (len + position + pagecount) % len;
if (index < 0) {
index = len + index;
}
//nslog(@"index=%d, position=%d", index, position);
[self drawtile:index atoffset:position - moveoffset];
}
for (position = iendpos; position >= mid; --position) {
index = (position + pagecount) % len;
if (index < 0) {
index = len + index;
}
//nslog(@"index=%d, position=%d", index, position);
[self drawtile:index atoffset:position - moveoffset];
}
//modify by chenwh 2010-01-06 for round view end
glbindrenderbufferoes(gl_renderbuffer_oes, viewrenderbuffer);
[context presentrenderbuffer:gl_renderbuffer_oes];
}
上一篇: 要钱还是要命?