better stuff!

This commit is contained in:
grant squires 2023-05-10 21:11:18 +00:00
parent 756e865d6f
commit 7fcc46d145
3 changed files with 400 additions and 171 deletions

View File

@ -13,52 +13,59 @@ typedef struct {
double z;
int vertex;
} cord;
int point_on_line(double x,double y,double lx1,double ly1, double lx2,double ly2){
double crossproduct = (y-ly1)*(lx2-lx1) - (x-lx1)*(ly2-ly1);
if(fabs(crossproduct)>FL_DIS)
return 0;
double dotproduct = (x-lx1)*(lx2-lx1) + (y-ly1)*(ly2-ly1);
if(dotproduct < 0)
return 0;
double squaredlength = (lx2-lx1)*(lx2-lx1) + (ly2-ly1)*(ly2-ly1);
if(dotproduct > squaredlength)
return 0;
return 1;
}
cord poi_d(double x1,double y1,double x2, double y2,int len,GLfloat* pixels,int shortest,int ign){
double m1 = (y2-y1)/(x2-x1);
double b1 = y1 - m1 * x1;
if(x2-x1==0){
m1=0;
b1=0;
}
cord aa;
aa.x = 0;
aa.y = 0;
aa.z = -1;
for(int yyu = 0; yyu!=len-1; yyu++){
//if(yyu==ign||yyu-1==ign||yyu+1==ign)continue;
//if(yyu==ign)continue;
double x3 = pixels[yyu*2];
double x4 = pixels[(yyu+1)*2];
double y3 = pixels[yyu*2+1];
double y4 = pixels[(yyu+1)*2+1];
double m2 = (y4-y3)/(x4-x3);
double b2 = y3 - m2 * x3;
//formulas from https://en.wikipedia.org/wiki/Intersection_(geometry)
double t = ((y3-y1)*(x2-x1)-(y2-y1)*x3+(y2-y1)*x1)/
((y2-y1)*(x4-x3)-(y4-y3)*(x2-x1));
double s = (x3-x1+t*(x4-x3))/(x2-x1);
double nsx = x1 + s*(x2-x1);
double nsy = y1 + s*(y2-y1);
double nsx = (b2-b1)/(m1-m2);
double nsy = m1*nsx+b1;
if (x4-x3==0){
nsx=x3;
nsy=m1*nsx+b1;
double nsx2 = x3 + t*(x4-x3);
double nsy2 = y3 + t*(y4-y3);
if(isnan(nsx)||isnan(nsy)||!(0<=s&&1>=s&&0<=t&&1>=t))
continue;
//printf("%f %f, %f %f | (%f,%f),(%f,%f)\n",nsx,nsy,nsx2,nsy2,x1,y1,x2,y2);
if(!(nsx>=lesser(x1,x2)&&nsx<=greater(x2,x1)&&nsy>=lesser(y1,y2)&&nsy<=greater(y2,y1))||(diff(nsx,x1)<FL_DIS&&diff(nsy,y1)<FL_DIS))
continue;
//printf("aaa\n");
if(aa.z==-1||pow(nsx-x1,2)+pow(nsy-y1,2)<pow(aa.x-x1,2)+pow(aa.y-y1,2)){
aa.x = nsx;
aa.y = nsy;
}
if(!(nsx >= greater(lesser(x1, x2), lesser(x3, x4)) && nsx <= lesser(greater(x1, x2), greater(x3, x4)))
||!(nsy >= greater(lesser(y1, y2), lesser(y3, y4)) && nsy <= lesser(greater(y1, y2), greater(y3, y4))))
continue;
if((diff(nsx,x2)<FL_DIS&&diff(nsy,y2)<FL_DIS)
||(diff(nsx,x1)<FL_DIS&&diff(nsy,y1)<FL_DIS))
continue;
if(aa.z==-1||pow(x1-nsx,2)+pow(y1-nsy,2)<pow(x1-aa.x,2)+pow(y1-aa.y,2)){
aa.x = nsx;
aa.y = nsy;
}
aa.z++;
if(!shortest)
break;
}
aa.z++;
if(!shortest)
break;
}
return aa;
}
@ -107,9 +114,9 @@ static const char* fshader_src =
"#version 330\n"
"in vec3 ncolor;\n"
"in float ntrans;\n"
"out vec3 color;\n"
"out vec4 color;\n"
"void main(){\n"
"gl_FragColor = vec4(ncolor[0],ncolor[1],ncolor[2],0.2);\n"
"gl_FragColor = vec4(1.0,0.0,1.0,1.0);\n"
"};";
point_arr* basier2d(double*xx,double*yy,int n,float rr, float gg, float bb){
@ -165,13 +172,18 @@ typedef struct {
GLfloat* col;
GLfloat* trans;
int len;
GLfloat* tri;
int tlen;
} glfl_ar;
void render_p(glfl_ar* bba){
//glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC1_ALPHA);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
GLuint verta;
glGenVertexArrays(1,&verta);
glBindVertexArray(verta);
/*
GLuint vetb;
glGenBuffers(1,&vetb);
glBindBuffer(GL_ARRAY_BUFFER,vetb);
@ -180,8 +192,17 @@ void render_p(glfl_ar* bba){
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER,vetb);
glVertexAttribPointer(0,2,GL_FLOAT,GL_FALSE,0,(void*)0);
*/
GLuint vetb;
glGenBuffers(1,&vetb);
glBindBuffer(GL_ARRAY_BUFFER,vetb);
glBufferData(GL_ARRAY_BUFFER,sizeof(*bba->tri)*(bba->tlen*12),bba->tri,GL_STATIC_DRAW);
GLuint colb;
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER,vetb);
glVertexAttribPointer(0,2,GL_FLOAT,GL_FALSE,0,(void*)0);
GLuint colb;
glGenBuffers(1,&colb);
glBindBuffer(GL_ARRAY_BUFFER,colb);
glBufferData(GL_ARRAY_BUFFER,sizeof(*bba->col)*(bba->len*4),bba->col,GL_STATIC_DRAW);
@ -199,7 +220,7 @@ void render_p(glfl_ar* bba){
glBindBuffer(GL_ARRAY_BUFFER,trab);
glVertexAttribPointer(2,1,GL_FLOAT,GL_FALSE,0,(void*)0);
glDrawArrays(GL_POINTS,0,bba->len);
glDrawArrays(GL_TRIANGLES,0,bba->tlen*6);
glDeleteBuffers(1,&trab);
glDeleteBuffers(1,&vetb);
glDeleteBuffers(1,&colb);
@ -208,7 +229,7 @@ glfl_ar* perspective_proj(GLFWwindow* b,point_arr* c,double ctx,double cty,doubl
GLfloat* pixels = malloc(sizeof(*pixels)*((1+c->len)*3));
GLfloat* colors = malloc(sizeof(*colors)*((1+c->len)*4));
GLfloat* trans = malloc(sizeof(*trans)*((1+c->len)*2));
GLfloat* trans = malloc(sizeof(*trans)*((1+c->len)*2));
if(pixels==NULL||colors==NULL||trans==NULL)
err("failed to allocate perspective array:(",pexit);
@ -241,7 +262,7 @@ glfl_ar* perspective_proj(GLFWwindow* b,point_arr* c,double ctx,double cty,doubl
double bx = ez/dz*dx+dx;
double by = ez/dz*dy+dy;
if(dz>-1){
if(dz>=0){
ab_to_vp(xa,ya,get_w(),get_h(),bx,by);
pixels[c_len*2] = xa+1;
pixels[c_len*2+1] = ya;
@ -252,11 +273,14 @@ glfl_ar* perspective_proj(GLFWwindow* b,point_arr* c,double ctx,double cty,doubl
c_len++;
}
}
double fc_len = c_len;
for(int i = 0; i<=fc_len-1; i++){
if(isinf(pixels[i*2]))
printf("---\n");
int fc_len = c_len;
/*
for(int i = 0; 0&&i<=fc_len-1; i++){
//printf("%f %f | %f %f\n",pixels[i*2],pixels[i*2+1],pixels[(i+1)*2],pixels[(i+1)*2+1]);
if(isinf(pixels[i*2])||isinf(pixels[i*2+1])||
isinf(pixels[(i+1)*2])||isinf(pixels[(i+1)*2+1]))
continue;
double x22[3] = {pixels[i*2],pixels[(i+1)*2]};
double y22[3] = {pixels[i*2+1],pixels[(i+1)*2+1]};
@ -284,40 +308,45 @@ glfl_ar* perspective_proj(GLFWwindow* b,point_arr* c,double ctx,double cty,doubl
free(bas->vert);
free(bas);
}
double dclen = c_len;
*/
//double dclen = c_len;
int vvi = 0;
//printf("---\n");
glfl_m* trline = malloc(sizeof(*trline)*get_w()*30);
glfl_m* trline = malloc(sizeof(*trline)*get_w()*60);
trline->len = 0;
trline->at = malloc(sizeof(*trline->at)*get_w()*40);
trline->at = malloc(sizeof(*trline->at)*get_w()*80);
if(trline==NULL||trline->at==NULL)
pexit(54);
for(int i = 0; i<=fc_len; i++){
for(int i = 0; i<=fc_len-1; i++){
if(c->c[i].at.vertex==1||1){
if(pixels==NULL||colors==NULL)
pexit(55);
if(isinf(pixels[i*2]))
continue;
//printf("%f %f\n",pixels[i*2],pixels[i*2+1]);
vvi++;
trline->at[trline->len].at = malloc(sizeof(*trline->at[trline->len].at)*(c_len+get_w()*2)*30);
//printf(" // %f %f\n",pixels[i*2],pixels[i*2+1]);
int le = 2222;
int lentt = fc_len;
cord aaa = poi_d(pixels[i*2],pixels[i*2+1],le,pixels[i*2+1],lentt,pixels,1,i);
cord aab = poi_d(pixels[i*2],pixels[i*2+1],-le,pixels[i*2+1],lentt,pixels,1,i);
cord aac = poi_d(pixels[i*2],pixels[i*2+1],pixels[i*2],-le,lentt,pixels,1,i);
cord aad = poi_d(pixels[i*2],pixels[i*2+1],pixels[i*2],le,lentt,pixels,1,i);
trline->at[trline->len].at = malloc(sizeof(*trline->at[trline->len].at)*((1+c_len+get_w())*20)*60);
trline->at[trline->len].len = 0;
//printf("%f\n",dclen);
int le = 2222;
cord aaa = poi_d(pixels[i*2],pixels[i*2+1],le,pixels[i*2+1],c->len*2,pixels,1,i);
cord aab = poi_d(pixels[i*2],pixels[i*2+1],-le,pixels[i*2+1],c->len*2,pixels,1,i);
cord aac = poi_d(pixels[i*2],pixels[i*2+1],pixels[i*2],-le,c->len*2,pixels,1,i);
cord aad = poi_d(pixels[i*2],pixels[i*2+1],pixels[i*2],le,c->len*2,pixels,1,i);
if(trline->at[trline->len].at==NULL)
abort();
/*if(aac.z||aad.z==-1){
free(trline->at[trline->len].at);
continue;
}*/
//printf("%f %f %f %f\n",aaa.z,aab.z,aac.z,aad.z);
}*/
//printf("%.1f %.1f %.1f %.1f | %f %f, %f %f\n",aaa.z,aab.z,aac.z,aad.z,aaa.x,aaa.y,aab.x,aab.y);
if(fmod(aaa.z,2)==1||fmod(aab.z,2)==1||
fmod(aac.z,2)==1||fmod(aad.z,2)==1){
//printf("%f %f %f %f\n",aaa.z,aab.z,aac.z,aad.z);
free(trline->at[trline->len].at);
continue;
}
@ -330,24 +359,27 @@ glfl_ar* perspective_proj(GLFWwindow* b,point_arr* c,double ctx,double cty,doubl
for(int cci = 0; cci<=frl->len; cci++){
trline->at[trline->len].at[trline->at[trline->len].len*2] = frl->c[cci].at.x;
trline->at[trline->len].at[trline->at[trline->len].len*2+1] = frl->c[cci].at.y;
//printf("aab %f %f\n",frl->c[cci].at.x,frl->c[cci].at.y);
pixels = realloc(pixels,sizeof *pixels *((c_len+1)*3));
colors = realloc(colors,sizeof *colors *((c_len+1)*4));
trans = realloc(trans,sizeof *trans *((c_len+1)*2));
if(trans==NULL||pixels==NULL||colors==NULL)
pexit(55);
trans[c_len] = 0.5;
trans[c_len] = 0.0;
pixels[c_len*2] = frl->c[cci].at.x;
pixels[c_len*2+1] = frl->c[cci].at.y;
colors[c_len*3] = 1.0f;
colors[c_len*3+1] = 0.3f;
colors[c_len*3+2] = 1.0f;
c_len++;
//trline->len++;
trline->at[trline->len].len++;
}
free(frl->c);
free(frl->vert);
free(frl);}
free(frl);
}
if(aaa.z!=-1)
{double aax[] = {pixels[i*2],aaa.x};
double aay[] = {pixels[i*2+1],aaa.y};
@ -358,28 +390,54 @@ glfl_ar* perspective_proj(GLFWwindow* b,point_arr* c,double ctx,double cty,doubl
for(int cci = 0; cci<=frl->len; cci++){
trline->at[trline->len].at[trline->at[trline->len].len*2] = frl->c[cci].at.x;
trline->at[trline->len].at[trline->at[trline->len].len*2+1] = frl->c[cci].at.y;
//printf("aab %f %f\n",frl->c[cci].at.x,frl->c[cci].at.y);
pixels = realloc(pixels,sizeof *pixels *((c_len+1)*3));
colors = realloc(colors,sizeof *colors *((c_len+1)*4));
trans = realloc(trans,sizeof *trans *((c_len+1)*2));
trans[c_len] = 0.5;
trans[c_len] = 0.0;
pixels[c_len*2] = frl->c[cci].at.x;
pixels[c_len*2+1] = frl->c[cci].at.y;
colors[c_len*3] = 1.0f;
colors[c_len*3+1] = 0.3f;
colors[c_len*3+2] = 1.0f;
c_len++;
trline->at[trline->len].len++;
}
free(frl->c);
free(frl->vert);
free(frl);}
free(frl);
}
if(aaa.z==-1&&aab.z==-1){
double fx = pixels[i*2];
double fy = pixels[i*2+1];
trline->at[trline->len].at[trline->at[trline->len].len*2] = fx;
trline->at[trline->len].at[trline->at[trline->len].len*2+1] = fy;
//printf("aa\n");
pixels = realloc(pixels,sizeof *pixels *((c_len+1)*3));
colors = realloc(colors,sizeof *colors *((c_len+1)*4));
trans = realloc(trans,sizeof *trans *((c_len+1)*2));
if(trans==NULL||pixels==NULL||colors==NULL)
pexit(55);
trans[c_len] = 0.0;
pixels[c_len*2] = fx;
pixels[c_len*2+1] = fy;
colors[c_len*3] = 1.0f;
colors[c_len*3+1] = 0.3f;
colors[c_len*3+2] = 1.0f;
c_len++;
trline->at[trline->len].len++;
}
trline->len++;
}
}
if(trline->len>1){
for(int ii = 0; ii!=trline->len-1; ii++){
if(trline->at[ii].at[3]<trline->at[ii+1].at[3]){
for(int ii = 0; ii<trline->len-1; ii++){
if(trline->at[ii].at[1]<trline->at[ii+1].at[1]){
glfl_a temp = trline->at[ii];
trline->at[ii] = trline->at[ii+1];
trline->at[ii+1] = temp;
@ -387,18 +445,25 @@ glfl_ar* perspective_proj(GLFWwindow* b,point_arr* c,double ctx,double cty,doubl
}
}}
double ffclen = c_len;
double lmax_t = -2.0;
double lmin_t = 2.0;
double lmax2_t = -2.0;
double lmin2_t = 2.0;
for(int zzi = 0; zzi!=trline->len; zzi++){
double max_t = -2.0;
double min_t = 2.0;
double max2_t = -2.0;
double min2_t = 2.0;
for(int zzi2 = 0; zzi2!=trline->at[zzi].len;zzi2++){
/*for(int ii = 0; ii<trline->len-1; ii++){
printf("%i : %f %f\n",ii,trline->at[ii].at[0],trline->at[ii].at[1]);
}*/
//printf("%i\n",trline->len);
GLfloat* tria = malloc(sizeof(*tria)*fc_len*2*6);
int tric = 0;
//double ffclen = c_len;
double lmax_t = -2222.0;
double lmin_t = 2222.0;
double lmax2_t = -2222.0;
double lmin2_t = 2222.0;
for(int zzi = 0; zzi<trline->len; zzi++){
double max_t = -2222.0;
double min_t = 2222.0;
double max2_t = -2222.0;
double min2_t = 2222.0;
for(int zzi2 = 0; zzi2<trline->at[zzi].len;zzi2++){
if(max_t<trline->at[zzi].at[zzi2*2]){
max_t = trline->at[zzi].at[zzi2*2];
max2_t = trline->at[zzi].at[zzi2*2+1];
@ -410,78 +475,85 @@ glfl_ar* perspective_proj(GLFWwindow* b,point_arr* c,double ctx,double cty,doubl
}
free(trline->at[zzi].at);
if (trline->at[zzi].len == 0)
continue;
if(lmax2_t!=max2_t&&lmin_t!=2.0&&lmax_t!=-2.0){
if(lmax2_t!=max2_t&&lmin_t!=2222.0&&lmax_t!=-2222.0){
float color = (float)zzi/trline->len;
float color2 = 1.0f-((float)zzi/trline->len);
double di = pow(lmin_t-max_t,2)+pow(lmin2_t-max2_t,2);//sqrt should be used here
double di2 = pow(lmax_t-min_t,2)+pow(lmax2_t-min2_t,2);
double ux1, uy1, ux2, uy2;
double ux1, uy1, ux2, uy2, ix1, iy1, ix2, iy2;
int ma_to_mi = 0;
if (di > di2) {
if (di >= di2) {
ux1 = max_t;
uy1 = max2_t;
ux2 = lmin_t;
uy2 = lmin2_t;
ix1 = min_t;
iy1 = min2_t;
ix2 = lmax_t;
iy2 = lmax2_t;
ma_to_mi=1;
} else {
ux1 = min_t;
uy1 = min2_t;
ux2 = lmax_t;
uy2 = lmax2_t;
}
ix1 = max_t;
iy1 = max2_t;
ix2 = lmin_t;
iy2 = lmin2_t;
}
//printf("%i %f,%f %f,%f\n",trline->at[zzi].len,ux1,uy1,ux2,uy2);
color2 = 1.0f;
double x1 = ma_to_mi?max_t:min_t;
double x2 = ma_to_mi?lmin_t:lmax_t;
double ite = ((float)get_w()/4);
double ite1 = fabs(max_t/ite);
double ite2 = fabs(lmax_t/ite);
double x1 = ux1;//ma_to_mi?max_t:min_t;
double x2 = ux2;//ma_to_mi?lmin_t:lmax_t;
//double itx = get_w();
//double ity = get_w();
double y1 = uy1;
double y2 = uy2;
for(;(ma_to_mi?x1>=x2:x1<=x2);(ma_to_mi?(x1-=ite1):(x1+=ite2))){
cord aaaa = poi_d(x1,y1,x2,y2,fc_len,pixels,0,-1);
if(aaaa.z!=-1){
/*pixels = realloc(pixels,sizeof *pixels *((c_len+1)*3));
colors = realloc(colors,sizeof *colors *((c_len+1)*4));
//printf("%f %f\n",aaa.x,aaa.y);
pixels[c_len*2] = x1;
pixels[c_len*2+1] = y1;
colors[c_len*3] = 1.0f;
colors[c_len*3+1] = 0.3f;
colors[c_len*3+2] = 1.0f;
c_len++;
double y2 = uy2;
//double chx = (x2-x1)/itx;
//double chy = (y2-y1)/ity;
int it = 0;
//printf("%f->%f by %f\n%f->%f by %f\n",x1,x2,chx,y1,y2,chy);
double xx1[] = {x1,x2};
double yy1[] = {y1,y2};
point_arr* aacc = basier2d(xx1,yy1,2,0.0,0.1,0.1);
for(int paaa = 0; paaa<=aacc->len; paaa++){
cord aaaa;
aaaa = poi_d(x1,y1,aacc->c[paaa].at.x,aacc->c[paaa].at.y,fc_len,pixels,0,-1);
//x1+=chx;
//y1+=chy;
pixels = realloc(pixels,sizeof *pixels *((c_len+1)*3));
colors = realloc(colors,sizeof *colors *((c_len+1)*4));
//printf("%f %f\n",aaa.x,aaa.y);
pixels[c_len*2] = aaaa.x;
pixels[c_len*2+1] = aaaa.y;
colors[c_len*3] = 1.0f;
colors[c_len*3+1] = 0.0f;
colors[c_len*3+2] = 0.0f;
c_len++;*/
//printf("%f %f\n",aaaa.x,aaaa.y);
continue;
}
double bb[] = {x1,x2};
double bb2[] = {y1, y2};
point_arr* asd = basier2d(bb,bb2,2,0.1,0.1,0.1);
//printf("aa\n");
for(int lli = 0; lli!=asd->len; lli++){
if(trline->at[zzi].len<it)
break;
it++;
//printf("%i\n",it);
if(aaaa.z!=-1){
continue;
}
/*
double bb[] = {x2,aacc->c[paaa].at.x};
double bb2[] = {y2, aacc->c[paaa].at.y};
//printf("%f,%f -> %f,%f\n",bb[0],bb2[0],bb[1],bb2[1]);
point_arr* asd = basier2d(bb,bb2,2,0.1,0.1,0.1);
//printf("aa\n");
for(int lli = 0; lli!=asd->len; lli++){
pixels = realloc(pixels,sizeof *pixels *((c_len+1)*4));
colors = realloc(colors,sizeof *colors *((c_len+1)*5));
trans = realloc(trans,sizeof *trans *((c_len+1)*2));
trans[c_len] = 0.5;
trans[c_len] = 1.0;
double dd = 10;
pixels[c_len*2] = asd->c[lli].at.x;
@ -494,8 +566,113 @@ glfl_ar* perspective_proj(GLFWwindow* b,point_arr* c,double ctx,double cty,doubl
free(asd->c);
free(asd->vert);
free(asd);
*/
tria[tric*6] = x2;
tria[tric*6+1] = y2;
tria[tric*6+2] = aacc->c[paaa].at.x;
tria[tric*6+3] = aacc->c[paaa].at.y;
tria[tric*6+4] = ix2;
tria[tric*6+5] = iy2;
tric++;
//printf("%f %f, %f %f, %f %f, %f %f\n",x1,y1,x2,y2,ix1,iy1,ix2,iy2);
tria[tric*6] = x2;
tria[tric*6+1] = y2;
tria[tric*6+2] = aacc->c[paaa].at.x;
tria[tric*6+3] = aacc->c[paaa].at.y;
tria[tric*6+4] = ix1;
tria[tric*6+5] = iy1;
tric++;
break;
}
free(aacc->c);
free(aacc->vert);
free(aacc);
/*
double ite = ((float)get_w());
double ite1 = fabs(ix1/ite);
double ite2 = fabs(ix2/ite);
//printf("%f %f\n",x1,x2);
for(;(ma_to_mi?x1>=x2:x1<=x2);(ma_to_mi?(x1-=ite1):(x1+=ite2))){
cord aaaa = poi_d(x1,y1,x2,y2,fc_len,pixels,0,-1);
//printf("%f %f\n",ite1,ite2);
it++;
if(it>=trline->at[zzi].len)
break;
printf(" ** %i %i | %i\n",it,trline->at[zzi].len,zzi);
if(aaaa.z!=-1){
pixels = realloc(pixels,sizeof *pixels *((c_len+1)*3));
colors = realloc(colors,sizeof *colors *((c_len+1)*4));
//printf("%f %f\n",aaa.x,aaa.y);
pixels[c_len*2] = x1;
pixels[c_len*2+1] = y1;
colors[c_len*3] = 1.0f;
colors[c_len*3+1] = 1.0f;
colors[c_len*3+2] = 1.0f;
c_len++;
pixels = realloc(pixels,sizeof *pixels *((c_len+1)*3));
colors = realloc(colors,sizeof *colors *((c_len+1)*4));
//printf("%f %f\n",aaa.x,aaa.y);
pixels[c_len*2] = aaaa.x;
pixels[c_len*2+1] = aaaa.y;
colors[c_len*3] = 1.0f;
colors[c_len*3+1] = 1.0f;
colors[c_len*3+2] = 1.0f;
c_len++;
//printf("fail\n");
//printf("%f %f\n",aaaa.x,aaaa.y);
if(ma_to_mi&&ite1==0||!ma_to_mi&&ite2==0)
break;
continue;
}
double bb[] = {x1,x2};
double bb2[] = {y1, y2};
point_arr* asd = basier2d(bb,bb2,2,0.1,0.1,0.1);
//printf("aa\n");
for(int lli = 0; lli!=asd->len; lli++){
pixels = realloc(pixels,sizeof *pixels *((c_len+1)*4));
colors = realloc(colors,sizeof *colors *((c_len+1)*5));
trans = realloc(trans,sizeof *trans *((c_len+1)*2));
trans[c_len] = 1.0;
double dd = 10;
pixels[c_len*2] = asd->c[lli].at.x;
pixels[c_len*2+1] = asd->c[lli].at.y;
colors[c_len*3] = color2;
colors[c_len*3+1] = color;//vvi==3?0.1f:vvi==4?0.5f:1.0f;
colors[c_len*3+2] = 0.0f;
c_len++;
}
free(asd->c);
free(asd->vert);
free(asd);
tria[tric*6] = x1;
tria[tric*6+1] = y1;
tria[tric*6+2] = x2;
tria[tric*6+3] = y2;
tria[tric*6+4] = ix2;
tria[tric*6+5] = iy2;
tric++;
//printf("%f %f, %f %f, %f %f, %f %f\n",x1,y1,x2,y2,ix1,iy1,ix2,iy2);
tria[tric*6] = x1;
tria[tric*6+1] = y1;
tria[tric*6+2] = x2;
tria[tric*6+3] = y2;
tria[tric*6+4] = ix1;
tria[tric*6+5] = iy1;
tric++;
break;
}/*
}
*//*
pixels = realloc(pixels,sizeof *pixels *((c_len+1)*3));
colors = realloc(colors,sizeof *colors *((c_len+1)*4));
//printf("%f %f\n",aaa.x,aaa.y);
@ -523,8 +700,13 @@ glfl_ar* perspective_proj(GLFWwindow* b,point_arr* c,double ctx,double cty,doubl
free(trline->at);
free(trline);
glPointSize(4.0f);
glfl_ar* rea = malloc(sizeof(*rea));
rea->tlen = tric;
rea->tri = tria;
printf(" %i\n",tric);
for(int i = 0; i!=tric; i++){
printf("%f %f %f | %f %f %f\n",tria[i*6],tria[i*6+1],tria[i*6+2],tria[i*6+3],tria[i*6+4],tria[i*6+5]);
}
rea->col = colors;
rea->pix = pixels;
rea->len = c_len;
@ -597,12 +779,14 @@ void join_cords(point_arr* a, point_arr* b){
}
void join_glfl_a(glfl_ar* a, glfl_ar* b){
int a_len = a->len;
a->pix = realloc(a->pix,sizeof(*a->pix)*(a->len+b->len+1)*20);
int a_tlen = a->tlen;
a->pix = realloc(a->pix,sizeof(*a->pix)*(a->len+b->len+1)*20);
a->col = realloc(a->col,sizeof(*a->col)*(a->len+b->len+1)*20);
a->trans = realloc(a->trans,sizeof(*a->trans)*(a->len+b->len+1)*20);
a->tri = realloc(a->tri,sizeof(*a->tri)*(a->tlen+b->tlen+1)*20);
a->len+=b->len;
if(a->pix==NULL||a->col==NULL||a->trans==NULL)
a->tlen+=b->tlen;
if(a->tri==NULL||a->pix==NULL||a->col==NULL||a->trans==NULL)
err("failed to reallocate float array",pexit);
for(int i = 0; i<=b->len*2; i++){
a->pix[a_len*2+i] = b->pix[i];
@ -612,6 +796,9 @@ void join_glfl_a(glfl_ar* a, glfl_ar* b){
}
for(int i = 0; i<=b->len; i++){
a->trans[a_len+i] = b->trans[i];
}
for(int i = 0; i<=b->tlen; i++){
a->tri[a_len*6+i] = b->tri[i];
}
}
point_arr* polygon3d(double* vx, double*vy, double* vz, int n){
@ -826,17 +1013,17 @@ point_m* rect3d_gen(double* tl, double* tr, double* bl, double*br,
}
return mm;
}
int main(int argc,char*argv[]){
int main(int argc,char*argv[]){
flag_handle(argc,argv);
atexit(sig_handle);
GLFWwindow* w = glfw_init();
GLFWwindow* w = glfw_init();
refresh_size(w);
GLenum err = glewInit();
if (err != GLEW_OK)
pexit(1);
if (!GLEW_VERSION_2_1)
pexit(1);
GLuint vid = vshader_comp(vshader_src);
GLuint fid = fshader_comp(fshader_src);
prog = build_shader(vid,fid);
@ -844,7 +1031,7 @@ int main(int argc,char*argv[]){
logm("built shaders");
/*
double tl[3] = {5.0,200.0,200.0};
double tr[3] = {200.0,200.0,200.0};
double bl[3] = {5.0,5.0,200.0};
@ -858,7 +1045,13 @@ int main(int argc,char*argv[]){
float gg = 0.0;
float bb = 1.0;
point_m* aaaa = rect3d_gen(tl,tr,bl,br,tl2,tr2,bl2,br2,rr,gg,bb);
*/
double xxx[4] = {2.0,100.0,50.0,2.0};
double yyy[4] = {2.0,2.0,100.0,2.0};
double zzz[4] = {2.0,2.0,2.0,2.0};
point_m* aaaa = malloc(sizeof(*aaaa)*5);
aaaa->len = 0;
aaaa[0].at = polygon3d(xxx,yyy,zzz,5);
int max_r = 630;
double half_max_r = (double)max_r/2/2;
double pl_x = 0;
@ -870,7 +1063,7 @@ int main(int argc,char*argv[]){
double frames = 0;
t = clock();
double frame_limit = 60;
double single_frame = (float)1/frame_limit*1E+6;
double single_frame = ((float)1/frame_limit)*1E+6;
char sf_time_msg[60];
sprintf(sf_time_msg,"%.3fµs per frame ≈ %.3ffps",single_frame,frame_limit);
info(sf_time_msg);
@ -881,28 +1074,17 @@ int main(int argc,char*argv[]){
info("entering main loop");
for(;;){
clock_gettime(CLOCK_REALTIME,&tem_t);
double p1 = plr_x*0.01;
glfw_clear(w);
double p1 = plr_x*0.01;
double p2 = plr_y*0.01;
double p3 = 0;
double p4 = pl_y;
double p5 = -pl_y+pl_z;
double p6 = pl_x;
/*
glfl_ar* bba = perspective_proj(w,e,p1,p2,p3,p4,p5,p6);
glfl_ar* bbb = perspective_proj(w,b,p1,p2,p3,p4,p5,p6);
glfl_ar* bbc = perspective_proj(w,c,p1,p2,p3,p4,p5,p6);
glfl_ar* bbd = perspective_proj(w,d,p1,p2,p3,p4,p5,p6);
glfl_ar* bbe = perspective_proj(w,e,p1,p2,p3,p4,p5,p6);
glfl_ar* bbf = perspective_proj(w,f,p1,p2,p3,p4,p5,p6);
join_glfl_a(bba,bbb);
join_glfl_a(bba,bbc);
join_glfl_a(bba,bbd);
join_glfl_a(bba,bbe);
join_glfl_a(bba,bbf);
*/
double p6 = pl_x;
if(aaaa->len>=0||1){
if(aaaa->len>=0){
glfl_ar* bba = perspective_proj(w,aaaa[0].at,p1,p2,p3,p4,p5,p6);
/*if(aaaa->len>0){
for(int i = 1; i<=aaaa->len-1; i++){
glfl_ar* bbb = perspective_proj(w,aaaa[i].at,p1,p2,p3,p4,p5,p6);
@ -912,22 +1094,21 @@ int main(int argc,char*argv[]){
free(bbb->col);
free(bbb->pix);
free(bbb->trans);
free(bbb->tri);
free(bbb);
}
}
*/
render_p(bba);
free(bba->tri);
free(bba->trans);
free(bba->col);
free(bba->pix);
free(bba);
}
glfw_load(w);
int mod_move=2;
double run_mul=2;
glfwPollEvents();
@ -1000,7 +1181,7 @@ int main(int argc,char*argv[]){
pl_y+=sinf((half_max_r+plr_y)*0.01)*mul;
}
if(glfwWindowShouldClose(w)||(glfwGetKey(w,GLFW_KEY_Q)))break;
glfw_clear(w);
if(1){
if(single_frame>0){
clock_gettime(CLOCK_REALTIME,&tem_t2);
@ -1028,7 +1209,7 @@ int main(int argc,char*argv[]){
free(a->vert);
free(a);
*/
for(int i = 0; i!=aaaa->len; i++){
for(int i = 0; i<=aaaa->len; i++){
free(aaaa[i].at->c);
free(aaaa[i].at->vert);
free(aaaa[i].at);

View File

@ -3,8 +3,16 @@
#include "util.h"
#include <math.h>
#include "strings.h"
double allocs = 0;
ulong allocs = 0;
int forced_length = 15;
typedef struct {
void* addr;
char* file;
char* function;
int line;
ulong size;
} alloc;
alloc* allocations = NULL;
double binomial(int n, int k){
if(n==k)
return 1.0;
@ -14,10 +22,29 @@ double binomial(int n, int k){
}
return v;
}
void mmalloc(){
allocs++;
void* mmalloc(ulong X,char*file,int line,char*func){
if(allocations==NULL){
allocations=(malloc)(sizeof(*allocations)*2);
}
allocations=(realloc)(allocations,sizeof(*allocations)*(allocs+1));
void* mal = (malloc)(X);
allocations[allocs].addr = mal;
allocations[allocs].function = func;
allocations[allocs].file = file;
allocations[allocs].line = line;
allocations[allocs].size = X;
allocs++;
return mal;
}
void ffree(){
void ffree(void* X,char*file,int line,char*func){
for(ulong i = 0; i<=allocs; i++){
if(allocations[i].addr==X){
allocations[i].addr = NULL;
break;
}
}
(free)(X);
allocs--;
}
int log_level = 0;
@ -27,15 +54,36 @@ void pexit(int s){
exit(s);
}
void sig_handle(void){
#ifdef stfu
if(log_level<=-1){
#ifndef skip_memory_trace
(free)(allocations);
#endif
return;
}
#ifdef stfu
#ifndef skip_memory_trace
(free)(allocations);
#endif
return;
#endif
if(log_level<=-1) return;
#ifndef skip_memory_trace
if(allocs>0){
char ssa[45];
sprintf(ssa,"%s | (found %i)","uneven allocations, memory leak(s)",(int)nearbyint(allocs));
warn(ssa);
for(ulong i = 0; i<=allocs; i++){
if(allocations[i].addr!=NULL){
char ad[50];
sprintf(ad,"%p",allocations[i].addr);
ad[0]='\20';
ad[1]='\20';
printf(" | - <\x1b[90m0x\x1b[0m%s> %s:%s:%i, %lu bytes initially allocated\n",ad,allocations[i].file,allocations[i].function,allocations[i].line,allocations[i].size);
}
}
(free)(allocations);
}
if(allocs==0)
info("even allocations, no internal leaks");

View File

@ -12,8 +12,8 @@ static const double NaN = 0.0f/0.0f;
#define diff(a,b) ((a)>(b)?(a)-(b):(b)-(a))
#ifndef skip_memory_trace
#define malloc(X) malloc(X); mmalloc();
#define free(X) free(X); ffree();
#define malloc(X) mmalloc(X,(char*)__FILE__,(int)__LINE__,(char*)__FUNCTION__);
#define free(X) ffree(X,(char*)__FILE__,(int)__LINE__,(char*)__FUNCTION__);
#endif
#ifndef stfu
@ -30,8 +30,8 @@ static const double NaN = 0.0f/0.0f;
#endif
double binomial(int n, int k);
void mmalloc();
void ffree();
void* mmalloc(ulong,char*,int,char*);
void ffree(void*,char*,int,char*);
void err_m(char*,void (*)(int),char*,int);
void warn_m(char*,char*,int ,...);
void info_m(char*,char*,int ,...);