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); }
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; }