Exemple #1
0
	void IRenderNode::setRenderOption( RenderOption option , DWORD val )
	{
		switch ( option )
		{
		case CFRO_Z_TEST :
			val = ( val ) ? D3DZB_TRUE : D3DZB_FALSE; 
			break;
		case CFRO_ZBIAS :
			{			
				float bias = 0.1f * val;
				val = *((DWORD*)&bias);
			}
			break;
		case CFRO_SRC_BLEND :
		case CFRO_DEST_BLEND :
			val = D3DTypeMapping::convert( BlendMode(val) );
			break;
		case CFRO_ALPHA_BLENGING :
			if ( val )
				addFlag( NODE_TRANSLUCENT_OBJ );
			else
				removeFlag( NODE_TRANSLUCENT_OBJ );
			break;
		case CFRO_CULL_FACE:
			val = D3DTypeMapping::convert( CullFace( val ) );
			break;
		case CFRO_Z_BUFFER_WRITE :
		case CFRO_LIGHTING :
		case CFRO_FOG :
			break;

		default:
			assert(0);
		}

		if ( D3DTypeMapping::getDefaultValue( option ) == val )
			mUsageRenderOption &= ~ BIT( option );
		else
			mUsageRenderOption |= BIT( option );

		mRenderOption[ option ] = val;
	}
void DrawEERIEInter_Render(EERIE_3DOBJ *eobj, const TransformInfo &t, Entity *io, float invisibility) {

	ColorMod colorMod;
	colorMod.updateFromEntity(io, !io);

	Vec3f tv = t.pos;

	if(io && (io->ioflags & IO_ITEM))
		tv.y -= 60.f;
	else
		tv.y -= 90.f;

	UpdateLlights(tv, false);

	for(size_t i = 0; i < eobj->facelist.size(); i++) {
		const EERIE_FACE & face = eobj->facelist[i];

		if(CullFace(eobj, face))
			continue;

		if(face.texid < 0)
			continue;

		TextureContainer *pTex = eobj->texturecontainer[face.texid];
		if(!pTex)
			continue;

		float fTransp = 0.f;
		TexturedVertex *tvList = GetNewVertexList(pTex, face, invisibility, fTransp);

		for(size_t n = 0; n < 3; n++) {

			if(io && (io->ioflags & IO_ANGULAR)) {
				const Vec3f & position = eobj->vertexlist3[face.vid[n]].v;
				const Vec3f & normal = face.norm;

				eobj->vertexlist3[face.vid[n]].vert.color = ApplyLight(&t.rotation, position, normal, colorMod, 0.5f);
			} else {
				Vec3f & position = eobj->vertexlist3[face.vid[n]].v;
				Vec3f & normal = eobj->vertexlist[face.vid[n]].norm;

				eobj->vertexlist3[face.vid[n]].vert.color = ApplyLight(&t.rotation, position, normal, colorMod);
			}

			tvList[n] = eobj->vertexlist[face.vid[n]].vert;
			tvList[n].uv.x = face.u[n];
			tvList[n].uv.y = face.v[n];

			// Treat WATER Polys (modify UVs)
			if(face.facetype & POLY_WATER) {
				tvList[n].uv += getWaterFxUvOffset(eobj->vertexlist[face.vid[n]].v, 0.3f);
			}

			if(face.facetype & POLY_GLOW) {
				// unaffected by light
				tvList[n].color = 0xffffffff;
			} else {
				// Normal Illuminations
				tvList[n].color = eobj->vertexlist3[face.vid[n]].vert.color;
			}

			// TODO copy-paste
			if(io && Project.improve) {
				long lr=(tvList[n].color>>16) & 255;
				float ffr=(float)(lr);

				float dd = tvList[n].rhw;

				dd = clamp(dd, 0.f, 1.f);

				Vec3f & norm = eobj->vertexlist[face.vid[n]].norm;

				float fb=((1.f-dd)*6.f + (EEfabs(norm.x) + EEfabs(norm.y))) * 0.125f;
				float fr=((.6f-dd)*6.f + (EEfabs(norm.z) + EEfabs(norm.y))) * 0.125f;

				if(fr < 0.f)
					fr = 0.f;
				else
					fr = std::max(ffr, fr * 255.f);

				fr=std::min(fr,255.f);
				fb*=255.f;
				fb=std::min(fb,255.f);
				u8 lfr = fr;
				u8 lfb = fb;
				u8 lfg = 0x1E;
				tvList[n].color = (0xff000000L | (lfr << 16) | (lfg << 8) | (lfb));
			}

			// Transparent poly: storing info to draw later
			if((face.facetype & POLY_TRANS) || invisibility > 0.f) {
				tvList[n].color = Color::gray(fTransp).toBGR();
			}
		}

		// HALO HANDLING START
		if(io && (io->halo.flags & HALO_ACTIVE)) {
			AddFixedObjectHalo(face, t, io, tvList, eobj);
		}
	}
Exemple #3
0
    static void InitGL() {
        OGLEXT(PFNGLCLIENTACTIVETEXTUREPROC, glClientActiveTexture);
        OGLEXT(PFNGLACTIVETEXTUREPROC, glActiveTexture);

        OGLEXT(PFNGLDELETEBUFFERSARBPROC, glDeleteBuffers);
        OGLEXT(PFNGLGENBUFFERSPROC, glGenBuffers);
        OGLEXT(PFNGLBINDBUFFERPROC, glBindBuffer);
        OGLEXT(PFNGLBUFFERDATAPROC, glBufferData);

        OGLEXT(PFNGLATTACHSHADERPROC, glAttachShader);
        OGLEXT(PFNGLCOMPILESHADERPROC, glCompileShader);
        OGLEXT(PFNGLCREATEPROGRAMPROC, glCreateProgram);
        OGLEXT(PFNGLCREATESHADERPROC, glCreateShader);
        OGLEXT(PFNGLDELETEPROGRAMPROC, glDeleteProgram);
        OGLEXT(PFNGLDELETESHADERPROC, glDeleteShader);
        OGLEXT(PFNGLLINKPROGRAMPROC, glLinkProgram);
        OGLEXT(PFNGLSHADERSOURCEPROC, glShaderSource);
        OGLEXT(PFNGLUSEPROGRAMPROC, glUseProgram);
        OGLEXT(PFNGLGETUNIFORMLOCATIONPROC, glGetUniformLocation);
        OGLEXT(PFNGLVERTEXATTRIB4FVARBPROC, glVertexAttrib4fvARB);
        OGLEXT(PFNGLGETATTRIBLOCATIONPROC, glGetAttribLocation);
        OGLEXT(PFNGLUNIFORMMATRIX4FVARBPROC, glUniformMatrix4fvARB);
        OGLEXT(PFNGLUNIFORM3FPROC, glUniform3f);
        OGLEXT(PFNGLUNIFORM1IPROC, glUniform1i);

        OGLEXT(PFNGLVERTEXATTRIBPOINTERPROC, glVertexAttribPointer);
        OGLEXT(PFNGLENABLEVERTEXATTRIBARRAYPROC, glEnableVertexAttribArray);
        OGLEXT(PFNGLDISABLEVERTEXATTRIBARRAYPROC, glDisableVertexAttribArray);

        OGLEXT(PFNGLGENPROGRAMSARBPROC, glGenProgramsARB);
        OGLEXT(PFNGLPROGRAMSTRINGARBPROC, glProgramStringARB);
        OGLEXT(PFNGLBINDPROGRAMARBPROC, glBindProgramARB);
        OGLEXT(PFNGLDELETEPROGRAMSARBPROC, glDeleteProgramARB);
        OGLEXT(PFNGLPROGRAMENVPARAMETER4FARBPROC, glProgramEnvParameter4fARB);
        OGLEXT(PFNGLPROGRAMLOCALPARAMETER4FARBPROC, glProgramLocalParameter4fARB);

        OGLEXT(PFNGLBINDFRAMEBUFFEREXTPROC, glBindFramebufferEXT);
        OGLEXT(PFNGLDELETEFRAMEBUFFERSEXTPROC, glDeleteFramebuffersEXT);
        OGLEXT(PFNGLGENFRAMEBUFFERSEXTPROC, glGenFramebuffersEXT);
        OGLEXT(PFNGLBINDRENDERBUFFEREXTPROC, glBindRenderbufferEXT);
        OGLEXT(PFNGLDELETERENDERBUFFERSEXTPROC, glDeleteRenderbuffersEXT);
        OGLEXT(PFNGLGENRENDERBUFFERSEXTPROC, glGenRenderbuffersEXT);
        OGLEXT(PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC, glFramebufferRenderbufferEXT);
        OGLEXT(PFNGLRENDERBUFFERSTORAGEEXTPROC, glRenderbufferStorageEXT);
        OGLEXT(PFNGLFRAMEBUFFERTEXTURE2DEXTPROC, glFramebufferTexture2DEXT);
        OGLEXT(PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC, glCheckFramebufferStatusEXT);

        glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);

        glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
        glClearDepth(1.0f);

        ClientActiveTexture(GL_TEXTURE0_ARB);

        glShadeModel(GL_FLAT);
        glDepthFunc(GL_LEQUAL);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

        CullFace(true);
        AlphaTest(false);
        DepthTest(false);
        DepthWrite(false);
        Blend(false);
    }
static void Cedric_RenderObject(EERIE_3DOBJ * eobj, Skeleton * obj, Entity * io, const Vec3f & pos, float invisibility) {

	if(invisibility == 1.f)
		return;

	Entity *use_io = io;

	if(!io && IN_BOOK_DRAW && eobj == entities.player()->obj)
		use_io = entities.player();

	HaloInfo haloInfo;
	if(use_io) {
		if(use_io == entities.player()) {
			pushSlotHalo(haloInfo, EQUIP_SLOT_HELMET,   eobj->fastaccess.sel_head);
			pushSlotHalo(haloInfo, EQUIP_SLOT_ARMOR,    eobj->fastaccess.sel_chest);
			pushSlotHalo(haloInfo, EQUIP_SLOT_LEGGINGS, eobj->fastaccess.sel_leggings);
		}
	
		if(use_io->halo.flags & HALO_ACTIVE) {
			haloInfo.push(HaloRenderInfo(&use_io->halo));
		}
		
		if(haloInfo.size > 0) {
			PrepareAnimatedObjectHalo(haloInfo, pos, obj, eobj);
		}
	}

	bool glow = false;
	ColorRGBA glowColor;
	if(io && (io->sfx_flag & SFX_TYPE_YLSIDE_DEATH) && io->show != SHOW_FLAG_TELEPORTING) {
		const ArxDuration elapsed = arxtime.now() - io->sfx_time;
		if(elapsed >= ArxDurationMs(3000) && elapsed < ArxDurationMs(6000)) {
			float ratio = toMs(elapsed - ArxDurationMs(3000)) * (1.0f / 3000);
			glowColor = Color::gray(ratio).toRGB();
			glow = true;
		}
	}
	
	for(size_t i = 0; i < eobj->facelist.size(); i++) {
		const EERIE_FACE & face = eobj->facelist[i];

		if((face.facetype & POLY_HIDE) && !IN_BOOK_DRAW)
			continue;

		if(CullFace(eobj, face))
			continue;

		if(face.texid < 0)
			continue;

		TextureContainer *pTex = eobj->texturecontainer[face.texid];
		if(!pTex)
			continue;

		float fTransp = 0.f;

		TexturedVertex *tvList = GetNewVertexList(&pTex->m_modelBatch, face, invisibility, fTransp);

		for(size_t n = 0; n < 3; n++) {
			tvList[n].p     = eobj->vertexlist3[face.vid[n]].vert.p;
			tvList[n].rhw   = eobj->vertexlist3[face.vid[n]].vert.rhw;
			tvList[n].color = eobj->vertexlist3[face.vid[n]].vert.color;
			tvList[n].uv.x  = face.u[n];
			tvList[n].uv.y  = face.v[n];
		}

		if((face.facetype & POLY_TRANS) || invisibility > 0.f) {
			tvList[0].color = tvList[1].color = tvList[2].color = Color::gray(fTransp).toRGB();
		}

		if(haloInfo.size) {
			AddAnimatedObjectHalo(haloInfo, face.vid, invisibility, eobj, io, tvList);
		}
		
		if(glow) {
			TexturedVertex * tv2 = PushVertexInTable(&TexSpecialColor.m_modelBatch, BatchBucket_Opaque);
			std::copy(tvList, tvList + 3, tv2);
			tv2[0].color = tv2[1].color = tv2[2].color = glowColor;
		}
	}
}
Exemple #5
0
GL_APICALL void GL_APIENTRY glCullFace (GLenum mode)
{
	CONTEXT_EXEC(CullFace(mode));
}
Exemple #6
0
CullFace *CullFace::getOrCreate(GLenum func)
{
    return getOrCreateImpl(CullFace(func));
}