void stage4_corridor_draw(Vector pos) { glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, get_tex("stage4/planks")->gltex); glMatrixMode(GL_TEXTURE); glScalef(1,2,1); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glTranslatef(pos[0], pos[1], pos[2]); glPushMatrix(); glRotatef(180, 1,0,0); glScalef(300,2000,1); draw_quad(); glPopMatrix(); glBindTexture(GL_TEXTURE_2D, get_tex("stage4/wall")->gltex); glMatrixMode(GL_TEXTURE); glLoadIdentity(); glRotatef(90,0,0,1); glScalef(1,10,1); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glTranslatef(100,5,75); glRotatef(90, 0,1,0); glScalef(150,2000,1); draw_quad(); glPopMatrix(); glPushMatrix(); glTranslatef(-100,5,75); glRotatef(180,1,0,0); glRotatef(-90, 0,1,0); glScalef(150,2000,1); draw_quad(); glPopMatrix(); glMatrixMode(GL_TEXTURE); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glDisable(GL_TEXTURE_2D); glColor3f(0.01,0.01,0.01); glPushMatrix(); glTranslatef(0,0,150); glScalef(500,2000,1); draw_quad(); glPopMatrix(); glPopMatrix(); glColor3f(1,1,1); }
void draw_stage_menu(MenuData *m) { draw_options_menu_bg(m); draw_text(AL_Right, (stringwidth(m->title, _fonts.mainmenu) + 10) * (1-m->fade), 30, m->title, _fonts.mainmenu); glPushMatrix(); glTranslatef(100, 100 + (((m->ecount * 20 + 290) > SCREEN_W)? min(0, SCREEN_H * 0.7 - 100 - m->drawdata[2]) : 0), 0); /* glPushMatrix(); glTranslatef(SCREEN_W/2 - 100, m->drawdata[2], 0); glScalef(SCREEN_W - 200, 20, 1); glColor4f(0,0,0,0.5); draw_quad(); glPopMatrix(); */ Texture *bg = get_tex("part/smoke"); glPushMatrix(); glTranslatef(m->drawdata[0], m->drawdata[2], 0); glScalef(m->drawdata[1]/100.0, 0.2, 1); glRotatef(m->frames*2,0,0,1); glColor4f(0,0,0,0.5); draw_texture_p(0,0,bg); glPopMatrix(); MenuEntry *s = &(m->entries[m->cursor]); m->drawdata[0] += ((s->draw? SCREEN_W/2 - 100 : (stringwidth(s->name, _fonts.mainmenu)/2 - s->drawdata*1.5)) - m->drawdata[0])/10.0; m->drawdata[1] += ((s->draw? (SCREEN_W - 200)*0.85 : stringwidth(s->name, _fonts.mainmenu)) - m->drawdata[1])/10.0; m->drawdata[2] += (20*m->cursor - m->drawdata[2])/10.0; int i; for(i = 0; i < m->ecount; i++) { MenuEntry *e = &(m->entries[i]); e->drawdata += 0.2 * (10*(i == m->cursor) - e->drawdata); float a = e->drawdata * 0.1; if(e->action == NULL) glColor4f(0.5, 0.5, 0.5, 0.5); else { //glColor4f(0.7 + 0.3 * (1-a), 1, 1, 0.7 + 0.3 * a); float ia = 1-a; glColor4f(0.9 + ia * 0.1, 0.6 + ia * 0.4, 0.2 + ia * 0.8, 0.7 + 0.3 * a); } if(e->draw) e->draw(e, i, m->ecount); else if(e->name) draw_text(AL_Left, 20 - e->drawdata, 20*i, e->name, _fonts.standard); } glPopMatrix(); fade_out(m->fade); }
void stage4_lake_draw(Vector pos) { glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, get_tex("stage4/lake")->gltex); glPushMatrix(); glTranslatef(pos[0], pos[1]+140, pos[2]); glScalef(15,15,15); draw_model("lake"); glPopMatrix(); glPushMatrix(); glTranslatef(pos[0], pos[1]+944, pos[2]+50); glScalef(30,30,30); glBindTexture(GL_TEXTURE_2D, get_tex("stage4/mansion")->gltex); draw_model("mansion"); glPopMatrix(); glDisable(GL_TEXTURE_2D); }
void stage4_fountain_draw(Vector pos) { glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, get_tex("stage2/border")->gltex); glPushMatrix(); glTranslatef(pos[0], pos[1], pos[2]); glRotatef(-90, 1,0,0); glScalef(1000,3010,1); draw_quad(); glPopMatrix(); glDisable(GL_TEXTURE_2D); }
Texture *prefix_get_tex(char *name, char *prefix) { char *src; if((src = strrchr(name, '/'))) src++; else src = name; char *buf = malloc(strlen(src) + strlen(prefix) + 1); strcpy(buf, prefix); strcat(buf, src); Texture *tex = get_tex(buf); free(buf); return tex; }
void draw_laser_curve(Laser *laser) { glEnable(GL_TEXTURE_2D); Texture *tex = get_tex("part/lasercurve"); complex last; glBindTexture(GL_TEXTURE_2D, tex->gltex); glColor4fv((float *)laser->color); glBlendFunc(GL_SRC_ALPHA, GL_ONE); float t = (global.frames - laser->birthtime)*laser->speed - laser->timespan + laser->timeshift; if(t < 0) t = 0; last = laser->prule(laser, t); for(t += 0.5; t < (global.frames - laser->birthtime)*laser->speed + laser->timeshift && t <= laser->deathtime + laser->timeshift; t += 1.5) { complex pos = laser->prule(laser,t); glPushMatrix(); float t1 = t - ((global.frames - laser->birthtime)*laser->speed - laser->timespan/2 + laser->timeshift); float tail = laser->timespan/1.9; float s = -0.75/pow(tail,2)*(t1-tail)*(t1+tail); glTranslatef(creal(pos), cimag(pos), 0); glRotatef(180/M_PI*carg(last-pos), 0, 0, 1); float wq = ((float)tex->w)/tex->truew; float hq = ((float)tex->h)/tex->trueh; glScalef(tex->w*wq*0.5*cabs(last-pos),s*laser->width*hq,s); draw_quad(); last = pos; glPopMatrix(); } glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4f(1,1,1,1); glDisable(GL_TEXTURE_2D); }
void draw_laser_curve_instanced(Laser *l) { float t; int c; Texture *tex = get_tex("part/lasercurve"); float wq = ((float)tex->w)/tex->truew; float hq = ((float)tex->h)/tex->trueh; c = l->timespan; t = (global.frames - l->birthtime)*l->speed - l->timespan + l->timeshift; if(t + l->timespan > l->deathtime + l->timeshift) c += l->deathtime + l->timeshift - (t + l->timespan); if(t < 0) { c += t; t = 0; } glBindTexture(GL_TEXTURE_2D, tex->gltex); glBlendFunc(GL_SRC_ALPHA, GL_ONE); glUseProgram(l->shader->prog); glUniform4fv(uniloc(l->shader, "clr"), 1, (float *)l->color); glUniform2f(uniloc(l->shader, "pos"), creal(l->pos), cimag(l->pos)); glUniform2f(uniloc(l->shader, "a0"), creal(l->args[0]), cimag(l->args[0])); glUniform2f(uniloc(l->shader, "a1"), creal(l->args[1]), cimag(l->args[1])); glUniform2f(uniloc(l->shader, "a2"), creal(l->args[2]), cimag(l->args[2])); glUniform2f(uniloc(l->shader, "a3"), creal(l->args[3]), cimag(l->args[3])); glUniform1f(uniloc(l->shader, "timeshift"), t); glUniform1f(uniloc(l->shader, "wq"), wq*l->width); glUniform1f(uniloc(l->shader, "hq"), hq*l->width); glUniform1i(uniloc(l->shader, "span"), c*2); glDrawArraysInstanced(GL_QUADS, 0, 4, c*2); glUseProgram(0); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); }
int main(int ac, char **argv) { t_env env; if (ac < 2) return (0); if ((env.ptr = mlx_init()) == NULL) return (0); if ((env.win = mlx_new_window(env.ptr, SCREENWIDTH, SCREENHEIGHT , "Raycaster")) == NULL) return (0); create_img(&env); get_tex(&env); init(&env); get_map(&env.worldmap, argv[1]); mlx(&env); return (0); }
/*! * The texture name to use comes from the mesh, unless it's * the null string, then it comes from the view. If the * texture name is GTexture::static_name() then return the * Patch's "current texture." Otherwise return a texture * matching the given texture name. * */ GTexture* Patch::cur_tex(CVIEWptr& v) { // What name are we going for? string tex_name = _mesh->render_style().empty() ? v->rendering() : _mesh->render_style(); if (tex_name == GTexture::static_name()) { GTexture* tex = cur_tex(); if (tex) return tex; // If there is no current texture, go w/ flat shading as a // default: tex_name = RFLAT_SHADE; } return get_tex(tex_name); }
void fill_screen(float xoff, float yoff, float ratio, char *name) { fill_screen_p(xoff, yoff, ratio, get_tex(name)); }
void draw_texture(float x, float y, char *name) { draw_texture_p(x, y, get_tex(name)); }
void draw_options_menu(MenuData *menu) { draw_options_menu_bg(menu); draw_text(AL_Right, 140*(1-menu->fade), 30, "Options", _fonts.mainmenu); glPushMatrix(); glTranslatef(100, 100, 0); /* glPushMatrix(); glTranslatef(SCREEN_W/2 - 100, menu->drawdata[2], 0); glScalef(SCREEN_W - 200, 20, 1); glColor4f(0,0,0,0.5); draw_quad(); glPopMatrix(); */ Texture *bg = get_tex("part/smoke"); glPushMatrix(); glTranslatef(menu->drawdata[0], menu->drawdata[2], 0); glScalef(menu->drawdata[1]/100.0, 0.2, 1); glRotatef(menu->frames*2,0,0,1); glColor4f(0,0,0,0.5); draw_texture_p(0,0,bg); glPopMatrix(); OptionBinding *binds = (OptionBinding*)menu->context; OptionBinding *bind; menu->drawdata[0] += ((SCREEN_W/2 - 100) - menu->drawdata[0])/10.0; menu->drawdata[1] += ((SCREEN_W - 200) - menu->drawdata[1])/10.0; menu->drawdata[2] += (20*menu->cursor - menu->drawdata[2])/10.0; int i, caption_drawn = 0; for(i = 0; i < menu->ecount; i++) { if(!menu->entries[i].name) continue; menu->entries[i].drawdata += 0.2 * (10*(i == menu->cursor) - menu->entries[i].drawdata); float a = menu->entries[i].drawdata * 0.1; bind = &(binds[i]); int hasbind = bind->enabled; float alpha = (!hasbind || bind_isactive(bind))? 1 : 0.5; if(menu->entries[i].action == NULL) { glColor4f(0.5, 0.5, 0.5, 0.7 * alpha); } else { //glColor4f(0.7 + 0.3 * (1-a), 1, 1, (0.7 + 0.3 * a) * alpha); float ia = 1-a; glColor4f(0.9 + ia * 0.1, 0.6 + ia * 0.4, 0.2 + ia * 0.8, (0.7 + 0.3 * a) * alpha); } draw_text(AL_Left, ((hasbind && bind->dependence)? 20 : 0) // hack hack hack + 20 - menu->entries[i].drawdata, 20*i, menu->entries[i].name, _fonts.standard); if(hasbind) { int j, origin = SCREEN_W - 220; switch(bind->type) { case BT_IntValue: if(bind->valrange_max) { char tmp[16]; // who'd use a 16-digit number here anyway? snprintf(tmp, 16, "%d", bind_getvalue(bind)); draw_text(AL_Right, origin, 20*i, tmp, _fonts.standard); } else for(j = bind->valcount-1; j+1; --j) { if(j != bind->valcount-1) origin -= strlen(bind->values[j+1])/2.0 * 20; if(bind_getvalue(bind) == j) { glColor4f(0.9, 0.6, 0.2, alpha); } else { glColor4f(0.5,0.5,0.5,0.7 * alpha); } draw_text(AL_Right, origin, 20*i, bind->values[j], _fonts.standard); } break; case BT_KeyBinding: if(bind->blockinput) { glColor4f(0.5, 1, 0.5, 1); draw_text(AL_Right, origin, 20*i, "Press a key to assign, ESC to cancel", _fonts.standard); } else draw_text(AL_Right, origin, 20*i, SDL_GetKeyName(tconfig.intval[bind->configentry]), _fonts.standard); if(!caption_drawn) { glColor4f(1,1,1,0.7); draw_text(AL_Center, (SCREEN_W - 200)/2, 20*(i-1), "Controls", _fonts.standard); caption_drawn = 1; } break; case BT_StrValue: if(bind->blockinput) { glColor4f(0.5, 1, 0.5, 1.0); if(strlen(*bind->values)) draw_text(AL_Right, origin, 20*i, *bind->values, _fonts.standard); } else draw_text(AL_Right, origin, 20*i, tconfig.strval[bind->configentry], _fonts.standard); break; case BT_Resolution: { char tmp[16]; int w, h; if(bind->selected == -1) { w = video.intended.width; h = video.intended.height; } else { VideoMode *m = &(video.modes[bind->selected]); w = m->width; h = m->height; } snprintf(tmp, 16, "%dx%d", w, h); draw_text(AL_Right, origin, 20*i, tmp, _fonts.standard); break; } } } } glPopMatrix(); fade_out(menu->fade); }