Пример #1
0
void gfMultiply (gfPoint r, const gfPoint p, const gfPoint q)
	/* sets r := p * q mod (x^GF_K + x^GF_T + 1) */
{
	int i, j;
	ltemp x, log_pi, log_qj;
	lunit lg[GF_K + 2]; /* this table should be cleared after use */

	assert (logt != NULL && expt != NULL);
	assert (p != NULL);
	assert (q != NULL);
	assert (r != p);
	assert (r != q);
	if (p[0] && q[0]) {
		/* precompute logt[q[j]] to reduce table lookups: */
		for (j = q[0]; j; j--) {
			lg[j] = logt[q[j]];
		}
		/* perform multiplication: */
		gfClear (r);
		for (i = p[0]; i; i--) {
			if ((log_pi = logt[p[i]]) != TOGGLE) { /* p[i] != 0 */
				for (j = q[0]; j; j--) {
					if ((log_qj = lg[j]) != TOGGLE) { /* q[j] != 0 */
					/*	r[i+j-1] ^= expt[(logt[p[i]] + logt[q[j]]) % TOGGLE]; */
						r[i+j-1] ^= expt[(x = log_pi + log_qj) >= TOGGLE ? x - TOGGLE : x];
					}
				}
			}
		}
		r[0] = p[0] + q[0] - 1;
		/* reduce r mod (x^GF_K + x^GF_T + 1): */
		gfReduce (r);
	} else {
		/* set r to the null polynomial: */
		r[0] = 0;
	}
	/* destroy potentially sensitive data: */
	x = log_pi = log_qj = 0;
	memset (lg, 0, sizeof (lg));
} /* gfMultiply */
Пример #2
0
int ecCalcY (ecPoint *p, int ybit)
	/* given the x coordinate of p, evaluate y such that y^2 + x*y = x^3 + EC_B */
{
	gfPoint a, b, t;

	b[0] = 1; b[1] = EC_B;
	if (p->x[0] == 0) {
		/* elliptic equation reduces to y^2 = EC_B: */
		gfSquareRoot (p->y, EC_B);
		return 1;
	}
	/* evaluate alpha = x^3 + b = (x^2)*x + EC_B: */
	gfSquare (t, p->x); /* keep t = x^2 for beta evaluation */
	gfMultiply (a, t, p->x);
	gfAdd (a, a, b); /* now a == alpha */
	if (a[0] == 0) {
		p->y[0] = 0;
		/* destroy potentially sensitive data: */
		gfClear (a); gfClear (t);
		return 1;
	}
	/* evaluate beta = alpha/x^2 = x + EC_B/x^2 */
	gfSmallDiv (t, EC_B);
	gfInvert (a, t);
	gfAdd (a, p->x, a); /* now a == beta */
	/* check if a solution exists: */
	if (gfTrace (a) != 0) {
		/* destroy potentially sensitive data: */
		gfClear (a); gfClear (t);
		return 0; /* no solution */
	}
	/* solve equation t^2 + t + beta = 0 so that gfYbit(t) == ybit: */
	gfQuadSolve (t, a);
	if (gfYbit (t) != ybit) {
		t[1] ^= 1;
	}
	/* compute y = x*t: */
	gfMultiply (p->y, p->x, t);
	/* destroy potentially sensitive data: */
	gfClear (a); gfClear (t);
	return 1;
} /* ecCalcY */
Пример #3
0
int gfInvert (gfPoint b, const gfPoint a)
	/* sets b := a^(-1) mod (x^GF_K + x^GF_T + 1) */
	/* warning: a and b must not overlap! */
{
	gfPoint c, f, g;
	ltemp x, j, alpha;

	assert (logt != NULL && expt != NULL);
	assert (b != NULL);
	assert (a != NULL);
	assert (b != a); /* note that this test is not complete */
	if (a[0] == 0) {
		/* a is not invertible */
		return 1;
	}

	/* initialize b := 1; c := 0; f := p; g := x^GF_K + x^GF_T + 1: */
	b[0] = 1; b[1] = 1;
	c[0] = 0;
	gfCopy (f, a);
	gfClear (g);
	g[0] = GF_K + 1; g[1] = 1; g[GF_T + 1] = 1; g[GF_K + 1] = 1;

	for (;;) {
		if (f[0] == 1) {
			assert (f[1] != 0);
			gfSmallDiv (b, f[1]);
			/* destroy potentially sensitive data: */
			gfClear (c); gfClear (f); gfClear (g); x = j = alpha = 0;
			return 0;
		}
		if (f[0] < g[0]) {
			goto SWAP_FG;
		}
SWAP_GF:
		j = f[0] - g[0];
		x = logt[f[f[0]]] - logt[g[g[0]]] + TOGGLE;
		alpha = expt[x >= TOGGLE ? x - TOGGLE : x];
		gfAddMul (f, alpha, j, g);
		gfAddMul (b, alpha, j, c);
	}

	/* basically same code with b,c,f,g swapped */
	for (;;) {
		if (g[0] == 1) {
			assert (g[1] != 0);
			gfSmallDiv (c, g[1]);
			gfCopy (b, c);
			/* destroy potentially sensitive data: */
			gfClear (c); gfClear (f); gfClear (g); x = j = alpha = 0;
			return 0;
		}
		if (g[0] < f[0]) {
			goto SWAP_GF;
		}
SWAP_FG:
		j = g[0] - f[0];
		x = logt[g[g[0]]] - logt[f[f[0]]] + TOGGLE;
		alpha = expt[x >= TOGGLE ? x - TOGGLE : x];
		gfAddMul (g, alpha, j, f);
		gfAddMul (c, alpha, j, b);
	}
} /* gfInvert */
Пример #4
0
i32 main(i32 ArgCount, char ** Args)
{
  char * path_exe = SDL_GetBasePath();
  for(u32 i = 0, size = sizeof(RESRC); i < size; i += MAX_STR)
  {
    char path_res[MAX_STR];
    SDL_memcpy(path_res, &RESRC.c[i], MAX_STR);
    SDL_snprintf(&RESRC.c[i], MAX_STR, "%s%s", path_exe, path_res);
  }
  
  SDL_Window  * sdl_window;
  SDL_GLContext sdl_glcontext;
  
  gfWindow(&sdl_window, &sdl_glcontext, 0, 0, "App", 1280, 720, 4);

  const char * bobs[] =
  {
    RESRC.monkey_bob,
    RESRC.sphere_bob,
    RESRC.teapot_bob,
  };

  bob_t meshes = gfBobCreate(countof(bobs), bobs);

  const char * bmps[] =
  {
    RESRC.texture_1,
    RESRC.texture_2,
    RESRC.texture_3,
  };

  gpu_texture_t textures = gfTextureCreateFromBmp(512, 512, 4, countof(bmps), bmps);
  
  const char * cubemap_px[] = { RESRC.cubemap_px };
  const char * cubemap_nx[] = { RESRC.cubemap_nx };
  const char * cubemap_py[] = { RESRC.cubemap_py };
  const char * cubemap_ny[] = { RESRC.cubemap_ny };
  const char * cubemap_pz[] = { RESRC.cubemap_pz };
  const char * cubemap_nz[] = { RESRC.cubemap_nz };
  
  gpu_texture_t cubemaps = gfCubemapCreateFromBmp(512, 512, 4, countof(cubemap_px),
    cubemap_px, cubemap_nx, cubemap_py, cubemap_ny, cubemap_pz, cubemap_nz
  );
  
  u32 vs_mesh = gfProgramCreateFromFile(GL_VERTEX_SHADER, RESRC.vs_mesh);
  u32 fs_mesh = gfProgramCreateFromFile(GL_FRAGMENT_SHADER, RESRC.fs_mesh);
  u32 pp_mesh = gfProgramPipelineCreate(vs_mesh, fs_mesh);
  
  u32 vs_quad = gfProgramCreateFromFile(GL_VERTEX_SHADER, RESRC.vs_quad);
  u32 fs_quad = gfProgramCreateFromFile(GL_FRAGMENT_SHADER, RESRC.fs_quad);
  u32 pp_quad = gfProgramPipelineCreate(vs_quad, fs_quad);
  
  u32 vs_cubemap = gfProgramCreateFromFile(GL_VERTEX_SHADER, RESRC.vs_cubemap);
  u32 fs_cubemap = gfProgramCreateFromFile(GL_FRAGMENT_SHADER, RESRC.fs_cubemap);
  u32 pp_cubemap = gfProgramPipelineCreate(vs_cubemap, fs_cubemap);
  
  gpu_cmd_t cmd[3] = {0};
  
  cmd[0].first = meshes.first.as_u32[0];
  cmd[1].first = meshes.first.as_u32[1];
  cmd[2].first = meshes.first.as_u32[2];
  
  cmd[0].count = meshes.count.as_u32[0];
  cmd[1].count = meshes.count.as_u32[1];
  cmd[2].count = meshes.count.as_u32[2];
  
  cmd[0].instance_first = 0;
  cmd[1].instance_first = 30;
  cmd[2].instance_first = 60;
  
  cmd[0].instance_count = 30;
  cmd[1].instance_count = 30;
  cmd[2].instance_count = 30;
  
  gpu_storage_t ins_first = gfStorageCreate(.format = x_u32, .count = countof(cmd));
  gpu_storage_t ins_pos = gfStorageCreate(.format = xyz_f32, .count = 90);
  
  for(u32 i = 0; i < ins_first.count; ++i)
  {
    ins_first.as_u32[i] = cmd[i].instance_first;
  }
  
  for(u32 i = 0, row = 10, space = 3; i < 90; ++i)
  {
    ins_pos.as_vec3[i].x = i * space - (i / row) * row * space;
    ins_pos.as_vec3[i].y = 0;
    ins_pos.as_vec3[i].z = (i / row) * space;
  }

  gpu_texture_t fbo_depth = gfTextureCreate(.w = 1280, 720, .format = depth_b32);
  gpu_texture_t fbo_color = gfTextureCreate(.w = 1280, 720, .format = srgba_b8);
  
  u32 fbo_colors[] =
  {
    [0] = fbo_color.id,
  };
  
  u32 fbo = gfFboCreate(fbo_depth.id, 0, countof(fbo_colors), fbo_colors, 0);
  
  gpu_sampler_t s_textures = gfSamplerCreate(4);
  gpu_sampler_t s_fbo = gfSamplerCreate(.min = GL_NEAREST, GL_NEAREST);
  
  u32 state_textures[16] =
  {
    [0] = meshes.mesh_id.id,
    [1] = meshes.attr_first.id,
    [2] = meshes.attr_id.id,
    [3] = meshes.pos.id,
    [4] = meshes.uv.id,
    [5] = meshes.normal.id,
    [6] = ins_first.id,
    [7] = ins_pos.id,
    [8] = textures.id,
    [9] = cubemaps.id,
   [10] = fbo_color.id,
  };
  
  u32 state_samplers[16] =
  {
    [8] = s_textures.id,
    [9] = s_textures.id,
   [10] = s_fbo.id,
  };
  
  glBindTextures(0, 16, state_textures);
  glBindSamplers(0, 16, state_samplers);
  
  vec3 cam_pos = {23.518875f, 5.673130f, 26.649000f};
  vec4 cam_rot = {-0.351835f, 0.231701f, 0.090335f, 0.902411f};
  vec4 cam_prj = {0.f};
  mat3 cam_mat = {0.f};

  Perspective(
    &cam_prj.x,
    Aspect(sdl_window),
    85.f * QFPC_TO_RAD,
    0.01f, 1000.f
  );
  
  SDL_SetRelativeMouseMode(1);
  u32 t_prev = SDL_GetTicks();

  glEnable(GL_DEPTH_TEST);
  glEnable(GL_CULL_FACE);
  glEnable(GL_BLEND);

  while(1)
  {
    u32 t_curr = SDL_GetTicks();
    f64 dt = ((t_curr - t_prev) * 60.0) / 1000.0;
    
    SDL_PumpEvents();
    i32 mouse_x_rel = 0;
    i32 mouse_y_rel = 0;
    SDL_GetRelativeMouseState(&mouse_x_rel, &mouse_y_rel);
    const u8 * key = SDL_GetKeyboardState(NULL);
    
    quatFirstPersonCamera(
      &cam_pos.x,
      &cam_rot.x,
      &cam_mat.sd_x,
      0.10f,
      0.05f * (f32)dt,
      mouse_x_rel,
      mouse_y_rel,
      key[SDL_SCANCODE_W],
      key[SDL_SCANCODE_A],
      key[SDL_SCANCODE_S],
      key[SDL_SCANCODE_D],
      key[SDL_SCANCODE_E],
      key[SDL_SCANCODE_Q]
    );
    
    static int show_pass = 0;
    if(key[SDL_SCANCODE_1]) show_pass = 0;
    if(key[SDL_SCANCODE_2]) show_pass = 1;
    if(key[SDL_SCANCODE_3]) show_pass = 2;
    if(key[SDL_SCANCODE_4]) show_pass = 3;
    if(key[SDL_SCANCODE_5]) show_pass = 4;
    
    glProgramUniform3fv(vs_mesh, 0, 1, &cam_pos.x);
    glProgramUniform4fv(vs_mesh, 1, 1, &cam_rot.x);
    glProgramUniform4fv(vs_mesh, 2, 1, &cam_prj.x);
    glProgramUniform3fv(fs_mesh, 0, 1, &cam_pos.x);
    glProgramUniform1iv(fs_mesh, 1, 1, &show_pass);
    glProgramUniform4fv(vs_cubemap, 0, 1, &cam_rot.x);
    glProgramUniform4fv(vs_cubemap, 1, 1, &cam_prj.x);
    
    for(u32 i = 0; i < 90; ++i)
      ins_pos.as_vec3[i].y = (f32)sin((t_curr * 0.0015f) + (i * 0.5f)) * 0.3f;
    
    gfFboBind(fbo);
      gfClear();
      gfDraw(pp_mesh, countof(cmd), cmd);
    gfFboBind(0);
    
    gfClear();
    
    if(!show_pass)
    {
      glDisable(GL_DEPTH_TEST);
        gfFire(pp_cubemap, 36);
      glEnable(GL_DEPTH_TEST);
    }
    
    gfFire(pp_quad, 6);

    SDL_Event event;
    while(SDL_PollEvent(&event))
    {
      if(event.type == SDL_QUIT)
        goto exit;
    }
    
    SDL_GL_SwapWindow(sdl_window);
    glFinish();
    
    t_prev = t_curr;
  }

  exit: return 0;
}
Пример #5
0
void ecClear (ecPoint *p)
	/* sets p to the point at infinity O, clearing entirely the content of p */
{
	gfClear (p->x);
	gfClear (p->y);
} /* ecClear */