ShaderID Renderer::addShader(const char *fileName, const char *extraDefines){ FILE *file = fopen(fileName, "rb"); if (file == NULL){ addToLog(String("Couldn't load \"") + fileName + "\""); } else { // Find file size fseek(file, 0, SEEK_END); int length = ftell(file); fseek(file, 0, SEEK_SET); char *shaderText = new char[length + 1]; fread(shaderText, length, 1, file); fclose(file); shaderText[length] = '\0'; char *vertexShader = strstr(shaderText, "[Vertex shader]"); char *fragmentShader = strstr(shaderText, "[Fragment shader]"); if (vertexShader != NULL){ *vertexShader = '\0'; vertexShader += 15; } if (fragmentShader != NULL){ *fragmentShader = '\0'; fragmentShader += 17; } String vShaderString, fShaderString; if (vertexShader != NULL){ int n = 0; char *str = shaderText; while (str < vertexShader){ if (*str == '\n') n++; str++; } if (extraDefines) vShaderString = extraDefines; vShaderString.sprintf("#line %d\n", n); vShaderString += vertexShader; } if (fragmentShader != NULL){ int n = 0; char *str = shaderText; while (str < fragmentShader){ if (*str == '\n') n++; str++; } if (extraDefines) fShaderString = extraDefines; fShaderString.sprintf("#line %d\n", n); fShaderString += fragmentShader; } Shader shader; bool res = createShader(shader, vertexShader? (const char *) vShaderString : NULL, fragmentShader? (const char *) fShaderString : NULL); delete shaderText; if (res) return insertShader(shader); } return SHADER_NONE; }
ShaderClass::ShaderClass(std::string _vertexShader, std::string _geometryShader, std::string _hullShader, std::string _domainShader, std::string _pixelShader, RenderInterface *_g, int _layoutType, bool _streamOutEnabled) { graphics = _g; vertexShaderIndex = insertShader(_vertexShader, "vs_5_0", _layoutType); if(_streamOutEnabled == false) { geometryShaderIndex = insertShader(_geometryShader, "gs_5_0", -1); } else { geometryShaderIndex = graphics->createGeometryStreamOut(_geometryShader, "gs_5_0"); } hullShaderIndex = insertShader(_hullShader, "hs_5_0", -1); domainShaderIndex = insertShader(_domainShader, "ds_5_0", -1); pixelShaderIndex = insertShader(_pixelShader, "ps_5_0", -1); }
void MainForm::insertGeometry(engine::IGeometry* geometry, HTREEITEM parentItem) { HTREEITEM geometryItem = assetGraph.InsertItem( geometry->getName(), 4, 4, parentItem, TVI_LAST ); assert( geometryItem != NULL ); assetGraph.SetItemData( geometryItem, (DWORD)( geometry ) ); for( int i=0; i<geometry->getNumShaders(); i++ ) { insertShader( geometry->getShader( i ), geometryItem ); } }