Example #1
0
 STARTDECL(gl_loadmaterials) (Value &fn)
 {
     TestGL();
     auto err = LoadMaterialFile(fn.sval->str());
     fn.DECRT();
     return err[0] ? Value(g_vm->NewString(err)) : Value(0, V_NIL);
 }
Example #2
0
    STARTDECL(gl_window) (Value &title, Value &xs, Value &ys)
    {
        if (graphics_initialized)
            g_vm->BuiltinError("cannot call gl_window() twice");

        screensize = int2(xs.ival, ys.ival);
        string err = SDLInit(title.sval->str(), screensize);
        title.DECRT();

        if (err.empty())
        {
            OpenGLInit();

            err = LoadMaterialFile("shaders/default.materials");
        }

        if (!err.empty())
        {
            DebugLog(1, err.c_str());
            return Value(g_vm->NewString(err));
        }

        colorshader = LookupShader("color");
        assert(colorshader);

        meshes   = new IntResourceManagerCompact<Mesh>();

        DebugLog(-1, "graphics fully initialized...");
        graphics_initialized = true;

        return Value(0, V_NIL);
    }
int HydMaterialManager_RegisterMaterial(char* szMaterialPath, char* szPath, const D3D11_INPUT_ELEMENT_DESC* pLayout, int iNumElements, D3D11_SAMPLER_DESC* pDesc)
{
	assert(szMaterialPath);

	// - This shouldn't use just the texture ID for hashing as different materials can reference the same texture with different shaders
	long iHash = HydMaterialManager_GetHash(szMaterialPath);
	int iMaterialIndex = HydMaterialManager_GetMaterialIndex(iHash);

	// - Texture exists, increment the reference count and return a pointer to it 
	if(iMaterialIndex != -1)
	{
		HydMaterialManager_aMaterials[iMaterialIndex].m_iRefCount++;
		return iMaterialIndex;
	}

	// - Texture is new so try and load it
	int iFreeSlotIndex = HydMaterialManager_GetFirstFreeSlot();
	HydMaterialManager_iUsedSlots++;

	assert(iFreeSlotIndex >= 0);

	TMaterialPaths tPaths = LoadMaterialFile(szMaterialPath);
	assert(!tPaths.bError);

	// - Here the vertex layout format can be overriden
	const D3D11_INPUT_ELEMENT_DESC* pVertLayout = pLayout;

	if(iNumElements == -1)
	{
		pVertLayout = HYD3D_DEC_NormTex;
		iNumElements = 3;
	}

	if(strcmp(tPaths.szTexturePath, "") != 0)
	{
		HydMaterialManager_aMaterials[iFreeSlotIndex].m_iTextureID[HydMaterialManager_aMaterials[iFreeSlotIndex].m_iNumTextures]	= HYDTex_RegisterTexture(tPaths.szTexturePath, pDesc);
		HydMaterialManager_aMaterials[iFreeSlotIndex].m_aShaderFlags[HydMaterialManager_aMaterials[iFreeSlotIndex].m_iNumTextures] = tPaths.eDiffuseShaderFlags;
		HydMaterialManager_aMaterials[iFreeSlotIndex].m_iNumTextures++;
	}

	if(strcmp(tPaths.szSpecularPath, "") != 0)
	{
		HydMaterialManager_aMaterials[iFreeSlotIndex].m_iTextureID[HydMaterialManager_aMaterials[iFreeSlotIndex].m_iNumTextures] = HYDTex_RegisterTexture(tPaths.szSpecularPath, pDesc);
		HydMaterialManager_aMaterials[iFreeSlotIndex].m_aShaderFlags[HydMaterialManager_aMaterials[iFreeSlotIndex].m_iNumTextures] = tPaths.eSpecularShaderFlags;
		HydMaterialManager_aMaterials[iFreeSlotIndex].m_iNumTextures++;
	}

	if(strcmp(tPaths.szNormalPath, "") != 0)
	{
		D3D11_SAMPLER_DESC sampDesc;
		ZeroMemory( &sampDesc, sizeof(sampDesc) );
		sampDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT;
		sampDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
		sampDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
		sampDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
		sampDesc.ComparisonFunc = D3D11_COMPARISON_NEVER;  
		sampDesc.MinLOD = 0;
		sampDesc.MaxLOD = 0;
		HydMaterialManager_aMaterials[iFreeSlotIndex].m_iTextureID[HydMaterialManager_aMaterials[iFreeSlotIndex].m_iNumTextures] = HYDTex_RegisterTexture(tPaths.szNormalPath, pDesc);
		HydMaterialManager_aMaterials[iFreeSlotIndex].m_aShaderFlags[HydMaterialManager_aMaterials[iFreeSlotIndex].m_iNumTextures] = tPaths.eBumpShaderFlags;
		HydMaterialManager_aMaterials[iFreeSlotIndex].m_iNumTextures++;
	}
	
	HydMaterialManager_aMaterials[iFreeSlotIndex].m_iShaderID = HYDShader_RegisterShader(tPaths.szShaderPath, pVertLayout, iNumElements, tPaths.eShaderFlags, tPaths.iGeometryTopology);
	HydMaterialManager_aMaterials[iFreeSlotIndex].m_bInUse = true;
	HydMaterialManager_aMaterials[iFreeSlotIndex].m_iPathHash = iHash;
	HydMaterialManager_aMaterials[iFreeSlotIndex].m_iRefCount = 1;

	assert(szMaterialPath);
	assert(HydMaterialManager_aMaterials[iFreeSlotIndex].m_sSourcePath);
	strcpy_s(HydMaterialManager_aMaterials[iFreeSlotIndex].m_sSourcePath, 256, szMaterialPath);

	return iFreeSlotIndex;
}