/* Copyright 2008 Nathan Phillip Brink, Ethan Zonca This file is a part of DistRen. DistRen is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. DistRen is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with DistRen. If not, see . */ /* This file contains the code which both processes (renders) jobs as a slave, and the code which distributes frames to slaves after receiving them from the client portion of the codebase. */ /* Just some notes -- Ethan Zonca * ++ Make data availible for other apps to parse * Server<==>Client Communication * Upload while rendering */ #include #define max 100 // maximum number of stored jobs in memory, per job type (lux/blend). Eventually we can dump this data to disk, or atleast the remainder not in memory... int jobnum = 0; // Structures for storing job information struct { char *name; char *submitter; char *email; int priority; struct frameset **frameset; // What exactly is this now? hehe } blendjob[max]; struct { char *name; char *submitter; char *email; int priority; int mode; // 0 = Static Render, stop at Spp, or infinity if spp is null. Framerange is ignored || 1 = animation, stop at Spp and stay in framerange. int spp; struct frameset ** frameset; } luxjob[max]; int main(int argc, char *argv[]) { /* frame[frame] Assignments: "0" - cancelled "1" - unassigned "2" - assigned to slave "3" - completed by slave and uploaded Have a script crawl through each job in the arrays, ordered by priority?, and assign a certain number of frames to each slave. Then we will need some sort of watchdog to monitor slaves on the main server to check for stales. */ // Queuer: this function should add files to the queue // Type: 0 = blender, 1 = luxrender // jobnum is the current job number void queue(int type, char *name, char *submitter, char *email, int priority, int mode, int spp, struct frameset **frameset) { if(type == 1){ blendjob[jobnum].name = name; blendjob[jobnum].submitter = submitter; blendjob[jobnum].email = email; blendjob[jobnum].priority = priority; blendjob[jobnum].frameset = frameset; } if(type == 2){ luxjob[jobnum].name = name; luxjob[jobnum].submitter = submitter; luxjob[jobnum].email = email; luxjob[jobnum].priority = priority; luxjob[jobnum].mode = mode; luxjob[jobnum].spp = spp; luxjob[jobnum].frameset = frameset; // handle lux modes somehow. } else{ // Throw error. } jobnum++; } ///////////////////////// SLAVE /////////////////////////////// /* Slave listens on server for a command in the format of each function... We need if's for returns... ==> watchdog */ // Executors void exec_blender(char *input, char *output, int sframe, int eframe) { int ret; /* SEGFAULTAGE :-D */ char *cmd[] = { "blender", "-b", "-o", output, input, "-s", sframe, "-e", eframe, (char *)0 }; ret = execv("/usr/bin/blender", cmd); } void exec_luxrender_single(char *input, char *output) { int ret; char *cmd[] = { "luxrender", "-something", "something", "something", (char *)0 }; ret = execv("/usr/bin/luxrender", cmd); } void exec_luxrender_anim(char *input, char *output, int sframe, int eframe, int spp) { // spp is samples per pixel limitation on each frame int ret; char *cmd[] = { "luxrender", "-something", "something", "something", (char *)0 }; ret = execv ("/usr/bin/luxrender", cmd); } return 0; }