void GraphLayoutParser::ParseGraphLayout( const char* layoutBuffer, int size, MaterialGraphWidget* graph ) { char* currPos = const_cast<char*>( layoutBuffer ); if( size > 0 ) { char* bufferEnd = currPos + size; int versionNumber = *reinterpret_cast< int* >( currPos ); currPos += sizeof( int ); if( versionNumber == MATERIAL_VERSION_NUMBER ) { int numNodes = *reinterpret_cast< int* >( currPos ); currPos += sizeof( int ); std::map< int, NodeData* > nodeMap; for( int i = 0; i < numNodes && currPos < bufferEnd; ++i ) { Node* node = ConstructNode( currPos, graph ); if( node != nullptr ) { graph->scene()->addItem( node ); NodeData* nodeData = new NodeData( node ); nodeMap[ node->GetNodeID() ] = nodeData; unsigned int numConnectors = node->InputConnectors().size(); for( unsigned int c = 0; c < numConnectors; ++c ) { nodeData->inputConnectorIDs.push_back( *reinterpret_cast< const int* >( currPos ) ); currPos += sizeof( int ); nodeData->outputConnectorIDs.push_back( *reinterpret_cast< const int* >( currPos ) ); currPos += sizeof( int ); } } } for( auto iter = nodeMap.begin(); iter != nodeMap.end(); ++iter ) { ReconnectNode( iter->second, nodeMap, graph ); } graph->scene()->update(); } } }
int main(int argc, char** argv) { Settings settings; ConstructSettings(&settings); LoadSettingsFile(&settings, "settings.ini"); if(Init(&settings) < 0) return -1; GLuint program; if(SetupProgram(&program) < 0) return -2; GLuint grid_vbuf = CreateGridVertexBuffer(settings.graphics.viewdistance); int grid_icount; GLuint grid_ibuf = CreateGridIndexBuffer(&grid_icount, settings.graphics.viewdistance); glUseProgram(program); GLint grid_pos_loc = glGetAttribLocation(program, "grid_pos"); GLint grid_world_mat_loc = glGetUniformLocation(program, "world_mat"); GLint grid_view_mat_loc = glGetUniformLocation(program, "view_mat"); GLint grid_proj_mat_loc = glGetUniformLocation(program, "proj_mat"); GLint grid_color_loc = glGetUniformLocation(program, "color"); GLint grid_viewdistance_loc = glGetUniformLocation(program, "viewdistance"); glUniform3f(grid_color_loc, 0.f, 0.6f, 0.f); glUniform1f(grid_viewdistance_loc, settings.graphics.viewdistance); GLuint grid_vao; glGenVertexArrays(1, &grid_vao); glBindVertexArray(grid_vao); glBindBuffer(GL_ARRAY_BUFFER, grid_vbuf); glEnableVertexAttribArray(grid_pos_loc); glVertexAttribPointer(grid_pos_loc, 2, GL_FLOAT, GL_FALSE, 0, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, grid_ibuf); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glClearColor(0.5f, 0.5f, 0.5f, 1.f); glViewport(0, 0, settings.video.width, settings.video.height); Node grid_node; ConstructNode(&grid_node); Camera camera; ConstructCamera(&camera); mat4x4 projection_matrix; mat4x4_perspective(projection_matrix, settings.video.pfov, settings.video.width/(float)settings.video.height, settings.video.pnear, settings.video.pfar); glUniformMatrix4fv(grid_proj_mat_loc, 1, GL_FALSE, (const float*)projection_matrix); float speed = 10.f; Uint32 ticks = SDL_GetTicks(); State state = STATE_RUNNING | (settings.video.fullscreen ? STATE_FULLSCREEN : 0); while(state & STATE_RUNNING) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glUseProgram(program); glUniformMatrix4fv(grid_world_mat_loc, 1, GL_FALSE, (const float*)grid_node.world_matrix); glUniformMatrix4fv(grid_view_mat_loc, 1, GL_FALSE, (const float*)camera.view_matrix); glBindVertexArray(grid_vao); glDrawElements(GL_TRIANGLE_STRIP, grid_icount, GL_UNSIGNED_INT, NULL); SDL_GL_SwapWindow(window); SDL_Event event; while(SDL_PollEvent(&event)) { switch(event.type) { case SDL_QUIT: state &= ~STATE_RUNNING; break; case SDL_KEYUP: switch(event.key.keysym.scancode) { case SDL_SCANCODE_F11: state ^= STATE_FULLSCREEN; SDL_SetWindowFullscreen ( window, state & STATE_FULLSCREEN ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0 ); break; case SDL_SCANCODE_ESCAPE: state ^= STATE_MOUSE_GRABBED; SDL_SetRelativeMouseMode(state & STATE_MOUSE_GRABBED); break; case SDL_SCANCODE_LSHIFT: speed = settings.controls.speed1; break; default: break; } break; case SDL_KEYDOWN: switch(event.key.keysym.scancode) { case SDL_SCANCODE_LSHIFT: speed = settings.controls.speed2; break; default: break; } break; case SDL_WINDOWEVENT: if(event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) { int w = event.window.data1; int h = event.window.data2; glViewport(0, 0, w, h); mat4x4_perspective(projection_matrix, settings.video.pfov, w/(float)h, settings.video.pnear, settings.video.pfar); glUniformMatrix4fv(grid_proj_mat_loc, 1, GL_FALSE, (const float*)projection_matrix); } break; case SDL_MOUSEMOTION: if(state & STATE_MOUSE_GRABBED) { camera.yaw -= settings.controls.xsensitivity * event.motion.xrel; camera.pitch -= settings.controls.xsensitivity * event.motion.yrel; } break; default: break; } } Uint32 nticks = SDL_GetTicks(); float delta = (nticks - ticks)/1000.f; ticks = nticks; const Uint8* keys = SDL_GetKeyboardState(NULL); vec3 movement; int i; for(i = 0; i < 3; i++) movement[i] = 0.f; SDL_bool moved = SDL_FALSE; if(keys[SDL_SCANCODE_W] && !keys[SDL_SCANCODE_S]) { vec3_add(movement, movement, camera.direction); moved = SDL_TRUE; } else if(keys[SDL_SCANCODE_S] && !keys[SDL_SCANCODE_W]) { vec3_sub(movement, movement, camera.direction); moved = SDL_TRUE; } if(keys[SDL_SCANCODE_A] && !keys[SDL_SCANCODE_D]) { vec3_sub(movement, movement, camera.right); moved = SDL_TRUE; } else if(keys[SDL_SCANCODE_D] && !keys[SDL_SCANCODE_A]) { vec3_add(movement, movement, camera.right); moved = SDL_TRUE; } if(keys[SDL_SCANCODE_Q] && !keys[SDL_SCANCODE_E]) { vec3_sub(movement, movement, camera.up); moved = SDL_TRUE; } else if(keys[SDL_SCANCODE_E] && !keys[SDL_SCANCODE_Q]) { vec3_add(movement, movement, camera.up); moved = SDL_TRUE; } if(moved) { vec3_norm(movement, movement); vec3_scale(movement, movement, delta * speed); vec3_add(camera.node.translation, camera.node.translation, movement); } UpdateCamera(&camera); if(moved) { vec2 tmp1; tmp1[0] = camera.node.position[0]; tmp1[1] = camera.node.position[2]; vec2 tmp2; tmp2[0] = grid_node.position[0]; tmp2[1] = grid_node.position[2]; vec2_sub(tmp1, tmp1, tmp2); tmp1[0] = floor(tmp1[0]); tmp1[1] = floor(tmp1[1]); grid_node.translation[0] += tmp1[0]; grid_node.translation[2] += tmp1[1]; UpdateNode(&grid_node); } } glDeleteVertexArrays(1, &grid_vao); glDeleteBuffers(1, &grid_vbuf); glDeleteBuffers(1, &grid_ibuf); glDeleteProgram(program); return 0; }