void LDLT_Solve (Tensor2Symmetric_t<Factor> const & a, Factor & x, Factor const & b) { typedef Eigen::Matrix<typename Factor::Scalar,Factor::DIM,Factor::DIM,Eigen::RowMajor> EigenMatrix; typedef Eigen::Matrix<typename Factor::Scalar,Factor::DIM,1,Eigen::ColMajor> EigenVector; typedef Tensor2_t<typename Factor::WithStandardEuclideanBasis, typename Factor::WithStandardEuclideanBasis> Tensor; Tensor blow_up(Tenh::Static<Tenh::WithoutInitialization>::SINGLETON); EuclideanEmbedding_t<Factor> e; EuclideanEmbeddingInverse_t<Factor> e_inv; TypedIndex_t<typename Factor::WithStandardEuclideanBasis,'i'> i; TypedIndex_t<Factor,'j'> j; TypedIndex_t<Factor,'k'> k; TypedIndex_t<typename Factor::WithStandardEuclideanBasis,'l'> l; typename Factor::WithStandardEuclideanBasis tensor_return_value(Tenh::Static<Tenh::WithoutInitialization>::SINGLETON), tensor_column(Tenh::Static<Tenh::WithoutInitialization>::SINGLETON); blow_up(i*l) = e(i*j)*a(j*k)*e(l*k); tensor_column(i) = e(i*j)*b(j); EigenVector return_value, eigen_column; Eigen::LDLT<EigenMatrix> LDLTMatrix(EigenMap_of_Tensor2(blow_up).ldlt()); memcpy(&eigen_column(0,0), tensor_column.pointer_to_allocation(), tensor_column.allocation_size_in_bytes()); return_value = LDLTMatrix.solve(eigen_column); memcpy(tensor_return_value.pointer_to_allocation(), &return_value(0,0), tensor_return_value.allocation_size_in_bytes()); x(j) = e_inv(j*i)*tensor_return_value(i); }
ViewingArea::ViewingArea(GLFWwindow* ptr, GLContext* context):PythonObject<ViewingArea>(this),zCamera_(-1),angle_(0),zScaleOrtho_(0.01f),glfwWindowPointer_(ptr),glContext_(context) { for(unsigned int i = 0;i<N_4X4_ELEMENTS;i++) projectionMatrix_[i]=inverseProjectionMatrix_[i]=screenToDeviceMatrix_[i]=deviceToScreenMatrix_[i]=i%5?0:1; centerAndRelative_[X_INDEX]=centerAndRelative_[Y_INDEX]=0; insetCenter_[X_INDEX]=insetCenter_[Y_INDEX]=insetRelative_[X_INDEX]=insetRelative_[Y_INDEX]=0; int w,h; glfwGetWindowSize(ptr,&w,&h); set_size(w,h); set_margins(100,100,100,100); blow_up(0,0,1,1); set_z_camera(-1); set_viewing_angle(45); }
int game(int type){ int game_over = 0; { surface *background = new_image("background.png"); apply_texture(background, window); destroy_surface(background); } initialize_cameras();initialize_star();initialize_ships(2);initialize_dust(); initialize_shot();initialize_ai(); play_music("music.ogg"); draw_tank(0, (window_width / 2 - 421), window_height / 2 - 150); draw_tank(1, window_width / 2 + 401, window_height / 2 - 150); // Main loop for(;;){ int i; get_input(); if(keyboard[ESC] || game_over){ break; } for(i = 0; i < 2; i ++) if(ship[i].status == DEAD){ struct timeval now; gettimeofday(&now, NULL); if((int) (now.tv_sec - ship[i].time.tv_sec) > 2) game_over = 1; } erase_ships(); erase_shot(); if(type != CPU_X_CPU){ // Rotation: 10 Propulse: 20 Fire: 20 Hyper: 180 int my_ship; // Player 1 moves if(type == CPU_X_PLR){ ai_play(0); my_ship = 1; } else if(type == PLR_X_CPU){ my_ship = 0; ai_play(1); } else my_ship = 0; if(keyboard[LEFT]) rotate_ship(my_ship, LEFT); if(keyboard[RIGHT]) rotate_ship(my_ship, RIGHT); if(keyboard[UP]) propulse_ship(my_ship); if(keyboard[DOWN]) ship_fire(my_ship); if(keyboard[RIGHT_CTRL]) goto_hyperspace(my_ship); } else{ ai_play(0); ai_play(1); } if(type == PLR_X_PLR){ // Player 2 moves if(keyboard[A]) rotate_ship(1, LEFT); if(keyboard[D]) rotate_ship(1, RIGHT); if(keyboard[W]) propulse_ship(1); if(keyboard[L]) blow_up(1); if(keyboard[S]) ship_fire(1); if(keyboard[LEFT_CTRL]) goto_hyperspace(1); } update_star(); // 6 update_ships(); // 2 update_dust(); // 145 update_shot(); // 16 film_ships(); // Até 16 film_dust(); // 20 film_shot(); // Até 20 weaver_rest(10000000); } stop_music(); destroy_star(); destroy_ships(); destroy_cameras(); destroy_dust(); destroy_shot(); clean_keyboard(); return 0; }