Exemplo n.º 1
0
int ge_clouds_thread(int args, void* argp){
	ge_Scene* scene = (ge_Scene*)argp;
	nClouds = scene->cloudsGenerator->n_clouds[0] + scene->cloudsGenerator->n_clouds[1] + scene->cloudsGenerator->n_clouds[2];
	float map_size_x = scene->cloudsGenerator->map_size_x;

	while(1){
		if(!ge_current_camera){
			geSleep(1000);
			continue;
		}

		int c=0;
		for(c=0; c<nClouds; c++){
			if(!ge_current_camera)break;
			int type = scene->cloudsGenerator->types[c];
			ge_Cloud* cloud = &scene->cloudsGenerator->clouds[c];

			float scale = 1.5;
			if(type == GE_CLOUD_TYPE_HIGH_LEVEL){
				scale = 5.0;
			}else
			if(type == GE_CLOUD_TYPE_MID_LEVEL){
				scale = 10.0;
			}else{
				scale = 20.0;
			}

		//	if(cloud->x > map_size_x/2.0){
			if(cloud->z <= 0.0 && cloud->x > 0.0){
				srand(0);
				int first_rand = rand()*geGetTick();
				srand(first_rand);
				GenerateCloud(scene, cloud, c);
			//	cloud->x = -map_size_x/2.0;
				float D = -4 * (-1.0/scene->cloudsGenerator->map_size_x) * (scene->cloudsGenerator->map_size_x / 2.0);
				cloud->x = sqrt(D) / (-2.0 / scene->cloudsGenerator->map_size_x);
			}

			cloud->alpha = 1.0;
			if(abs(cloud->x) > map_size_x/2.0*0.6){
			//	cloud->alpha = 1.0 - (abs(cloud->x) - map_size_x/2.0*0.6) / (map_size_x/2.0*0.4);
			}


			float dx = (ge_current_camera->x - cloud->x);
			float dy = (ge_current_camera->y - cloud->y);
			float dz = (ge_current_camera->z - cloud->z);
			float rotX = atanf(dx/dz);
			float rotY = atanf(dy/dz);
		//	float rotZ = atanf(dx/-dy);

			ge_LoadIdentity(cloud->matrix);
			ge_Scale(cloud->matrix, scale, scale, scale);
			ge_Rotate(cloud->matrix, -rotY, rotX, 0.0);
		}
		geSleep(100);
	}

	return 0;
}
Exemplo n.º 2
0
void ge_Translate(float* m, float x, float y, float z){
	float t[16];
	ge_LoadIdentity(t);
	t[12] = x;
	t[13] = y;
	t[14] = z;
	geMatrix44Mult(m, m, t);
}
Exemplo n.º 3
0
void geRotate(float x, float y, float z){
	float tx[16], ty[16], tz[16], tb[16];

	if(x != 0.0f){
		ge_LoadIdentity(tx);
		float cx = cosf(x);
		float sx = sinf(x);
		tx[1*4+1] = cx;
		tx[1*4+2] = sx;
		tx[2*4+1] = -sx;
		tx[2*4+2] = cx;

		memcpy(tb, ge_current_matrix, sizeof(float)*16);
		geMatrix44Mult(ge_current_matrix, tb, tx);
	}
	
	if(y != 0.0f){
		ge_LoadIdentity(ty);
		float cy = cosf(y);
		float sy = sinf(y);
		ty[0*4+0] = cy;
		ty[0*4+2] = -sy;
		ty[2*4+0] = sy;
		ty[2*4+2] = cy;

		float tb[16];
		memcpy(tb, ge_current_matrix, sizeof(float)*16);
		geMatrix44Mult(ge_current_matrix, tb, ty);
	}
	
	if(z != 0.0f){
		ge_LoadIdentity(tz);
		float cz = cosf(z);
		float sz = sinf(z);
		tz[0*4+0] = cz;
		tz[0*4+1] = sz;
		tz[1*4+0] = -sz;
		tz[1*4+1] = cz;

		float tb[16];
		memcpy(tb, ge_current_matrix, sizeof(float)*16);
		geMatrix44Mult(ge_current_matrix, tb, tz);
	}

	ge_current_matrix_update = true;
}
Exemplo n.º 4
0
void ge_Scale(float* m, float x, float y, float z){
	float t[16];
	ge_LoadIdentity(t);
	t[0] = x;
	t[5] = y;
	t[10] = z;

	geMatrix44Mult(m, m, t);
}
Exemplo n.º 5
0
void geTranslate(float x, float y, float z){
	float t[16];
	ge_LoadIdentity(t);
	t[12] = x;
	t[13] = y;
	t[14] = z;

	geMatrix44Mult(ge_current_matrix, ge_current_matrix, t);
	ge_current_matrix_update = true;
}
Exemplo n.º 6
0
void geScale(float x, float y, float z){
	float t[16];
	ge_LoadIdentity(t);
	t[0] = x;
	t[5] = y;
	t[10] = z;

	geMatrix44Mult(ge_current_matrix, ge_current_matrix, t);
	ge_current_matrix_update = true;
}
Exemplo n.º 7
0
void geRK4UpdateTargets(ge_RK4State* state){
	ge_RK4Target* curr = state->targets;
	float matrix[16];
	ge_LoadIdentity(matrix);
	ge_Translate(matrix, state->position.x, state->position.y, state->position.z);
	while(curr){
		if(state->target_cb){
			state->target_cb(state, curr, state->target_cbdata);
		}else if(curr->obj){
			memcpy(curr->obj->matrix, matrix, sizeof(float) * 16);
			curr->obj->matrix_used = true;
		}
		curr = curr->next;
	}
}
Exemplo n.º 8
0
void geOrthogonal(float left, float right, float bottom, float top, float zNear, float zFar){
	ge_LoadIdentity(ge_current_matrix);

	float tx = - (right + left) / (right - left);
	float ty = - (top + bottom) / (top - bottom);
	float tz = - (zFar + zNear) / (zFar - zNear);

	ge_current_matrix[0] = 2.0 / (right - left);
	ge_current_matrix[5] = 2.0 / (top - bottom);
	ge_current_matrix[10] = -2.0 / (zFar - zNear);

	ge_current_matrix[12] = tx;
	ge_current_matrix[13] = ty;
	ge_current_matrix[14] = tz;

	if(ge_current_mode == GE_MATRIX_PROJECTION){
	//	memcpy(libge_context->projection_matrix, ge_current_matrix, sizeof(float)*16);
	}
	ge_current_matrix_update = true;
}
Exemplo n.º 9
0
void geObjectMatrixIdentity(ge_Object* obj){
	obj->matrix_used = false;
	ge_LoadIdentity(obj->matrix);
}
Exemplo n.º 10
0
void LoadRenderer(const char* path, ge_File* fp, ge_Scene* scene, ge_Renderer* render){
	gePrintDebug(0x100, "LoadRenderer(\"%s\", 0x%16llX, 0x%16llX, 0x%16llX)\n", path, (t_ptr)fp, (t_ptr)scene, (t_ptr)render);
	char buffer[2048] = "";
	char tmp[2048] = "";
	char fl[2048] = "";
//	ge_Object* tmp_obj = NULL;
	gePrintDebug(0x100, "LoadRenderer 1\n");

	render->shader = geCreateShader();
	render->depth_enabled = true;
	render->depth_mask = true;
	render->blend_enabled = false;
	render->enabled = true;
	render->matrix_used = false;
	render->draw_mode = GE_TRIANGLES;
	render->memory_mode = GE_STATIC_DRAW;
	gePrintDebug(0x100, "LoadRenderer 2\n");

	while(geFileGets(fp, buffer, 2048)){
		PASS_COMMENTS;
		if(strstr(buffer, "END_RENDERER"))break;
		geGetParamInt(buffer, "enabled", &render->enabled);
		geGetParamInt(buffer, "depth_enabled", &render->depth_enabled);
		geGetParamInt(buffer, "blend_enabled", &render->blend_enabled);
		geGetParamInt(buffer, "depth_mask", &render->depth_mask);
		if(geGetParamString(buffer, "extension", tmp, 2048)){
			float f = 0.0;
			if(geGetParamFloat(buffer, "WATER", &f)){
				geWaterInit(render, f);
			}
		}
		
		if(strstr(buffer, "view")){
			float params[3];
			if(geGetParamFloatMulti(buffer, "view", params, 3)){
				render->matrix_used = true;
				ge_LoadIdentity(render->projection_matrix);
				ge_Perspective(render->projection_matrix, params[0], (float)geGetContext()->width/(float)geGetContext()->height, params[1], params[2]);
			}
		}

		if(geGetParamString(buffer, "objects", tmp, 2048)){
			gePrintDebug(0x100, " LoadRenderer B\n");
			sprintf(fl, "%s%s", path, tmp);
			char** obj_list = (char**)geMalloc(sizeof(char*)*256);
			int a = 0;
			for(a=0; a<256; a++){
				obj_list[a] = (char*)geMalloc(sizeof(char)*128);
			}
			int cnt = geGetStringList(buffer, (char**)obj_list, 128, 256);

			if(cnt > 1){
				memset(obj_list[0],0x0,128); // Pas the "xxxxx.xxx"
				render->nObjs = geObjectsCountInFileSubs(fl, (const char**)obj_list, cnt);
			}else if(cnt == 1){
				render->nObjs = geObjectsCountInFile(fl);
				cnt = 0;
			}
			gePrintDebug(0x100, " LoadRenderer C\n");
			render->objs = (ge_Object**)geMalloc(sizeof(ge_Object*)*render->nObjs);
			for(a=0; a<render->nObjs; a++){
				render->objs[a] = (ge_Object*)geMalloc(sizeof(ge_Object));
			}
			if(ObjGetType(fl) == GE_TYPE_DAE){
				render->animator = (ge_Animator*)geMalloc(sizeof(ge_Animator));
			}
			gePrintDebug(0x100, " LoadRenderer D\n");
			geLoadObjectsList(fl, (const char**)obj_list, cnt, render->objs, render->animator);
			gePrintDebug(0x100, " LoadRenderer E\n");

			for(a=0; a<render->nObjs; a++){
				render->nVerts += render->objs[a]->nVerts;
			}
			gePrintDebug(0x100, " LoadRenderer F\n");
			render->verts = (ge_Vertex*)geMalloc(sizeof(ge_Vertex)*render->nVerts);
			gePrintDebug(0x100, " LoadRenderer G\n");
			int v = 0;
			for(a=0; a<render->nObjs; a++){
				memcpy(&render->verts[v], render->objs[a]->verts, sizeof(ge_Vertex)*render->objs[a]->nVerts);
				geFree(render->objs[a]->verts);
				render->objs[a]->verts = &render->verts[v];
				render->objs[a]->vert_start = v;
				v += render->objs[a]->nVerts;
			}
			gePrintDebug(0x100, " LoadRenderer H\n");
		}
		if(geGetParamString(buffer, "vertex_shader", tmp, 2048)){
			gePrintDebug(0x100, " LoadRenderer F\n");
			if(!strncmp(tmp, "generic", 7)){
				sprintf(fl, "%s/%s.vert", libge_context->default_shaders_path, tmp);
			}else{
				sprintf(fl, "%s%s", path, tmp);
			}
			gePrintDebug(0x100, "file: \"%s\"\n", fl);
			geShaderLoadVertexSource(render->shader, fl);
		}
		if(geGetParamString(buffer, "tesselation_control_shader", tmp, 2048)){
			gePrintDebug(0x100, " LoadRenderer D\n");
			if(!strncmp(tmp, "generic", 7)){
				sprintf(fl, "%s/%s.tess", libge_context->default_shaders_path, tmp);
			}else{
				sprintf(fl, "%s%s", path, tmp);
			}
			gePrintDebug(0x100, "file: \"%s\"\n", fl);
			geShaderLoadTessControlSource(render->shader, fl);
			render->tesselated = true;
		}
		if(geGetParamString(buffer, "tesselation_evaluation_shader", tmp, 2048)){
			gePrintDebug(0x100, " LoadRenderer E\n");
			if(!strncmp(tmp, "generic", 7)){
				sprintf(fl, "%s/%s.tess", libge_context->default_shaders_path, tmp);
			}else{
				sprintf(fl, "%s%s", path, tmp);
			}
			gePrintDebug(0x100, "file: \"%s\"\n", fl);
			geShaderLoadTessEvaluationSource(render->shader, fl);
			render->tesselated = true;
		}
		if(geGetParamString(buffer, "geometry_shader", tmp, 2048)){
			gePrintDebug(0x100, " LoadRenderer C\n");
			if(!strncmp(tmp, "generic", 7)){
				sprintf(fl, "%s/%s.geom", libge_context->default_shaders_path, tmp);
			}else{
				sprintf(fl, "%s%s", path, tmp);
			}
			gePrintDebug(0x100, "file: \"%s\"\n", fl);
			geShaderLoadGeometrySource(render->shader, fl);
		}
		if(geGetParamString(buffer, "fragment_shader", tmp, 2048)){
			gePrintDebug(0x100, " LoadRenderer G\n");
			if(!strncmp(tmp, "generic", 7)){
				sprintf(fl, "%s/%s.frag", libge_context->default_shaders_path, tmp);
			}else{
				sprintf(fl, "%s%s", path, tmp);
			}
			gePrintDebug(0x100, "file: \"%s\"\n", fl);
			geShaderLoadFragmentSource(render->shader, fl);
		}
		if(geGetParamString(buffer, "vertex_shadow", tmp, 2048)){
			gePrintDebug(0x100, " LoadRenderer H\n");
			if(!strncmp(tmp, "generic", 7)){
				sprintf(fl, "%s/%s.vert", libge_context->default_shaders_path, tmp);
			}else{
				sprintf(fl, "%s%s", path, tmp);
			}
			gePrintDebug(0x100, "file: \"%s\"\n", fl);
			if(!render->shadow_shader){
				render->shadow_shader = geCreateShader();
			}
			geShaderLoadVertexSource(render->shadow_shader, fl);
		}
		if(geGetParamString(buffer, "fragment_shadow", tmp, 2048)){
			gePrintDebug(0x100, " LoadRenderer I\n");
			if(!strncmp(tmp, "generic", 7)){
				sprintf(fl, "%s/%s.frag", libge_context->default_shaders_path, tmp);
			}else{
				sprintf(fl, "%s%s", path, tmp);
			}
			gePrintDebug(0x100, "file: \"%s\"\n", fl);
			if(!render->shadow_shader){
				render->shadow_shader = geCreateShader();
			}
			geShaderLoadFragmentSource(render->shadow_shader, fl);
		}
	}

#ifndef PLATFORM_mac
	if(render->tesselated){
		render->draw_mode = GE_PATCHES;
	}
#endif
	gePrintDebug(0x100, "LoadRenderer 3\n");
	geRendererCreateContext(scene, render);
	gePrintDebug(0x100, "LoadRenderer 4\n");
}