C4ValueArray *C4FindObject::FindMany(const C4ObjectList &Objs, const C4LSectors &Sct) { // Trivial case if (IsImpossible()) return new C4ValueArray(); C4Rect *pBounds = GetBounds(); if (!pBounds) return FindMany(Objs); // Prepare for array that may be generated C4ValueArray *pArray; int32_t iSize; // Check shape lists? if (UseShapes()) { // Get area C4LArea Area(&Game.Objects.Sectors, *pBounds); C4LSector *pSct; C4ObjectList *pLst = Area.FirstObjectShapes(&pSct); // Check if a single-sector check is enough if (!Area.Next(pSct)) return FindMany(pSct->ObjectShapes); // Set up array pArray = new C4ValueArray(32); iSize = 0; // Create marker, search all areas uint32_t iMarker = ::Game.Objects.GetNextMarker(); for (; pLst; pLst = Area.NextObjectShapes(pLst, &pSct)) for (C4ObjectLink *pLnk = pLst->First; pLnk; pLnk = pLnk->Next) if (pLnk->Obj->Status) if (pLnk->Obj->Marker != iMarker) { pLnk->Obj->Marker = iMarker; if (Check(pLnk->Obj)) { // Grow the array, if neccessary if (iSize >= pArray->GetSize()) pArray->SetSize(iSize * 2); // Add object (*pArray)[iSize++] = C4VObj(pLnk->Obj); } } } else { // Set up array pArray = new C4ValueArray(32); iSize = 0; // Search C4LArea Area(&Game.Objects.Sectors, *pBounds); C4LSector *pSct; for (C4ObjectList *pLst = Area.FirstObjects(&pSct); pLst; pLst = Area.NextObjects(pLst, &pSct)) for (C4ObjectLink *pLnk = pLst->First; pLnk; pLnk = pLnk->Next) if (pLnk->Obj->Status) if (Check(pLnk->Obj)) { // Grow the array, if neccessary if (iSize >= pArray->GetSize()) pArray->SetSize(iSize * 2); // Add object (*pArray)[iSize++] = C4VObj(pLnk->Obj); } } // Shrink array pArray->SetSize(iSize); // Recheck object status (may shrink array again) CheckObjectStatus(pArray); // Apply sorting if (pSort) pSort->SortObjects(pArray); return pArray; }
static void load_test_file (const char *filename) { FILE *f; GLint size; char *code; GLint i; f = fopen (filename, "r"); if (f == NULL) return; fseek (f, 0, SEEK_END); size = ftell (f); fseek (f, 0, SEEK_SET); code = (char *) (malloc (size)); if (code == NULL) { fclose (f); return; } size = fread (code, 1, size, f); fclose (f); glShaderSourceARB (vert, 1, (const GLcharARB **) (&code), &size); glCompileShaderARB (vert); if (!CheckObjectStatus (vert)) exit (0); for (i = 0; i < sizeof (attribs) / sizeof (*attribs); i++) if (attribs[i].dispatch == A && attribs[i].bind != -1) glBindAttribLocationARB (prog, attribs[i].bind, attribs[i].name); }
// return is to be freed by the caller C4ValueArray *C4FindObject::FindMany(const C4ObjectList &Objs) { // Trivial case if (IsImpossible()) return new C4ValueArray(); // Set up array C4ValueArray *pArray = new C4ValueArray(32); int32_t iSize = 0; // Search for (C4Object *obj : Objs) if (obj->Status) if (Check(obj)) { // Grow the array, if neccessary if (iSize >= pArray->GetSize()) pArray->SetSize(iSize * 2); // Add object (*pArray)[iSize++] = C4VObj(obj); } // Shrink array pArray->SetSize(iSize); // Recheck object status (may shrink array again) CheckObjectStatus(pArray); // Apply sorting if (pSort) pSort->SortObjects(pArray); return pArray; }
void InitScene (void) { prog = glCreateProgramObjectARB (); vert = glCreateShaderObjectARB (GL_VERTEX_SHADER_ARB); glAttachObjectARB (prog, vert); glDeleteObjectARB (vert); load_test_file ("vstest.txt"); glLinkProgramARB (prog); if (!CheckObjectStatus (prog)) exit (0); glUseProgramObjectARB (prog); }
bool MythRenderOpenGL2::ValidateShaderObject(uint obj) { if (!m_shader_objects.contains(obj)) return false; if (!m_shader_objects[obj].m_fragment_shader || !m_shader_objects[obj].m_vertex_shader) return false; m_glAttachShader(obj, m_shader_objects[obj].m_fragment_shader); m_glAttachShader(obj, m_shader_objects[obj].m_vertex_shader); m_glBindAttribLocation(obj, VERTEX_INDEX, "a_position"); m_glBindAttribLocation(obj, COLOR_INDEX, "a_color"); m_glBindAttribLocation(obj, TEXTURE_INDEX, "a_texcoord0"); m_glLinkProgram(obj); return CheckObjectStatus(obj); }
void InitScene (void) { GLint params[1]; const char *tab[2]; /* * GL should silently ignore calls that delete object 0. */ begintest (TT_GETERROR_NOERROR, "glDeleteObject(0)"); glDeleteObjectARB (0); endtest (); /* * GL generates an error on invalid object handle. */ begintest (TT_GETERROR_INVALIDVALUE, "Pass invalid non-zero object handle"); glDeleteObjectARB (find_invalid_handle ()); endtest (); glUseProgramObjectARB (find_invalid_handle ()); endtest (); /* * Create object. GL should return unique non-zero values. */ begintest (TT_PARAM1_NONZERO, "Create object"); vert = glCreateShaderObjectARB (GL_VERTEX_SHADER_ARB); endtest1 (vert); frag = glCreateShaderObjectARB (GL_FRAGMENT_SHADER_ARB); endtest1 (frag); prog = glCreateProgramObjectARB (); endtest1 (prog); endtest1 (vert != frag && frag != prog && prog != vert); /* * Link empty program. */ begintest (TT_PARAM1_NONZERO, "Link empty program"); glLinkProgramARB (prog); endtest1 (CheckObjectStatus (prog)); /* * Use empty program object. Empty program objects are valid. */ begintest (TT_GETERROR_NOERROR, "Use empty program object"); glUseProgramObjectARB (prog); endtest (); /* * Attach invalid object handles. Program object 0 should not be accepted. */ begintest (TT_GETERROR_INVALIDVALUE, "Attach invalid object handle"); glAttachObjectARB (0, find_invalid_handle ()); endtest (); glAttachObjectARB (0, frag); endtest (); glAttachObjectARB (find_invalid_handle (), find_invalid_handle ()); endtest (); glAttachObjectARB (find_invalid_handle (), frag); endtest (); glAttachObjectARB (prog, find_invalid_handle ()); endtest (); /* * Attach valid object handles with wrong semantics. */ begintest (TT_GETERROR_INVALIDOPERATION, "Attach object badly"); glAttachObjectARB (vert, frag); endtest (); glAttachObjectARB (vert, prog); endtest (); glAttachObjectARB (prog, prog); endtest (); /* * Detach non-attached object. */ begintest (TT_GETERROR_INVALIDOPERATION, "Detach non-attached object"); glDetachObjectARB (prog, vert); endtest (); glDetachObjectARB (prog, frag); endtest (); /* * Attach shader. */ begintest (TT_GETERROR_NOERROR, "Attach shader to program object"); glAttachObjectARB (prog, vert); endtest (); glAttachObjectARB (prog, frag); endtest (); /* * Attach object twice. */ begintest (TT_GETERROR_INVALIDOPERATION, "Attach object twice"); glAttachObjectARB (prog, vert); endtest (); glAttachObjectARB (prog, frag); endtest (); /* * Detach attached object. */ begintest (TT_GETERROR_NOERROR, "Detach attached object"); glDetachObjectARB (prog, vert); endtest (); glDetachObjectARB (prog, frag); endtest (); /* * Attach shader again. */ begintest (TT_GETERROR_NOERROR, "Attach shader again"); glAttachObjectARB (prog, vert); endtest (); glAttachObjectARB (prog, frag); endtest (); /* * Delete attached object. */ begintest (TT_GETERROR_NOERROR, "Delete attached object"); glDeleteObjectARB (vert); endtest (); glDeleteObjectARB (frag); endtest (); /* * Query delete status. It should return TRUE. Object handles are still valid * as they are referenced by program object container. */ begintest (TT_PARAM1_NONZERO, "Query delete status"); glGetObjectParameterivARB (vert, GL_OBJECT_DELETE_STATUS_ARB, params); endtest1 (params[0]); glGetObjectParameterivARB (frag, GL_OBJECT_DELETE_STATUS_ARB, params); endtest1 (params[0]); /* * Delete already deleted attached object. The behaviour is undefined, but we * check for no errors. The object still exists, so the handle value is okay. * In other words, these calls should be silently ignored by GL. */ begintest (TT_GETERROR_NOERROR, "Delete already deleted attached object"); glDeleteObjectARB (vert); endtest (); glDeleteObjectARB (frag); endtest (); /* * Compile shader source with syntax error. */ begintest (TT_PARAM1_ZERO, "Compile shader source with syntax error"); glShaderSourceARB (vert, 1, &invsynvertsrc, NULL); glCompileShaderARB (vert); endtest1 (CheckObjectStatus (vert)); glShaderSourceARB (frag, 1, &invsynfragsrc, NULL); glCompileShaderARB (frag); endtest1 (CheckObjectStatus (frag)); /* * Compile shader source with semantic error. */ begintest (TT_PARAM1_ZERO, "Compile shader source with semantic error"); glShaderSourceARB (vert, 1, &invsemvertsrc, NULL); glCompileShaderARB (vert); endtest1 (CheckObjectStatus (vert)); glShaderSourceARB (frag, 1, &invsemfragsrc, NULL); glCompileShaderARB (frag); endtest1 (CheckObjectStatus (frag)); /* * Link ill-formed vertex-fragment program. */ begintest (TT_PARAM1_ZERO, "Link ill-formed vertex-fragment program"); glLinkProgramARB (prog); endtest1 (CheckObjectStatus (prog)); /* * Use badly linked program object. */ begintest (TT_GETERROR_INVALIDOPERATION, "Use badly linked program object"); glUseProgramObjectARB (prog); endtest (); /* * Compile well-formed shader source. Check if multi-string sources can be handled. */ begintest (TT_PARAM1_NONZERO, "Compile well-formed shader source"); tab[0] = uniforms; tab[1] = validvertsrc; glShaderSourceARB (vert, 2, tab, NULL); glCompileShaderARB (vert); endtest1 (CheckObjectStatus (vert)); tab[0] = uniforms; tab[1] = validfragsrc; glShaderSourceARB (frag, 2, tab, NULL); glCompileShaderARB (frag); endtest1 (CheckObjectStatus (frag)); /* * Link vertex-fragment program. */ begintest (TT_PARAM1_NONZERO, "Link vertex-fragment program"); glLinkProgramARB (prog); endtest1 (CheckObjectStatus (prog)); /* * Use valid linked program object. */ begintest (TT_GETERROR_NOERROR, "Use linked program object"); glUseProgramObjectARB (prog); endtest (); /* * Get current program. */ begintest (TT_PARAM1_NONZERO, "Get current program"); endtest1 (glGetHandleARB (GL_PROGRAM_OBJECT_ARB) == prog); /* * Use 0 program object. */ begintest (TT_GETERROR_NOERROR, "Use 0 program object"); glUseProgramObjectARB (0); endtest (); /* * Query uniform location. Uniforms with gl_ prefix cannot be queried. */ begintest (TT_PARAM1_NONZERO, "Query uniform location"); endtest1 (glGetUniformLocationARB (prog, "gl_ModelViewMatrix") == -1); endtest1 (glGetUniformLocationARB (prog, "UniformThatDoesNotExist") == -1); endtest1 (glGetUniformLocationARB (prog, "") == -1); endtest1 (glGetUniformLocationARB (prog, "CommonUniform") != -1); endtest1 (glGetUniformLocationARB (prog, "VertexUniform") != -1); endtest1 (glGetUniformLocationARB (prog, "FragmentUniform") != -1); /* * Query attrib location. Attribs with gl_ prefix cannot be queried. * When gl_Vertex is used, none of the generic attribs can have index 0. */ begintest (TT_PARAM1_NONZERO, "Query attrib location"); endtest1 (glGetAttribLocationARB (prog, "gl_Vertex") == -1); endtest1 (glGetAttribLocationARB (prog, "AttribThatDoesNotExist") == -1); endtest1 (glGetAttribLocationARB (prog, "") == -1); endtest1 (glGetAttribLocationARB (prog, "FirstAttrib") > 0); endtest1 (glGetAttribLocationARB (prog, "SecondAttrib") > 0); /* * Bind attrib locations, link and check if locations are correct. */ begintest (TT_PARAM1_NONZERO, "Bind attrib location #1"); glBindAttribLocationARB (prog, 1, "FirstAttrib"); glBindAttribLocationARB (prog, 2, "SecondAttrib"); glLinkProgramARB (prog); endtest1 (CheckObjectStatus (prog)); endtest1 (glGetAttribLocationARB (prog, "FirstAttrib") == 1); endtest1 (glGetAttribLocationARB (prog, "SecondAttrib") == 2); /* * Bind attrib locations in different order. Link and check if locations are correct. */ begintest (TT_PARAM1_NONZERO, "Bind attrib location #2"); glBindAttribLocationARB (prog, 1, "SecondAttrib"); glBindAttribLocationARB (prog, 2, "FirstAttrib"); glLinkProgramARB (prog); endtest1 (CheckObjectStatus (prog)); endtest1 (glGetAttribLocationARB (prog, "SecondAttrib") == 1); endtest1 (glGetAttribLocationARB (prog, "FirstAttrib") == 2); /* * Detach deleted object. */ begintest (TT_GETERROR_NOERROR, "Detach deleted object"); glDetachObjectARB (prog, vert); endtest (); glDetachObjectARB (prog, frag); endtest (); /* * Delete deleted detached object. */ begintest (TT_GETERROR_INVALIDVALUE, "Delete deleted detached object"); glDeleteObjectARB (vert); endtest (); glDeleteObjectARB (frag); endtest (); exit (0); }