Merge branch 'master' of warwicknew.xyz:portfolio

This commit is contained in:
Warwick 2022-03-30 12:24:37 +01:00
commit 33bacd97d1
12 changed files with 239 additions and 34 deletions

View file

@ -22,6 +22,7 @@
}, },
"dependencies": { "dependencies": {
"@material-ui/core": "^4.11.0", "@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.11.2",
"@types/react": "^16.9.56", "@types/react": "^16.9.56",
"fontsource-roboto": "^3.0.3", "fontsource-roboto": "^3.0.3",
"hls.js": "^1.1.5", "hls.js": "^1.1.5",

View file

@ -13,34 +13,49 @@ import {
} from "@material-ui/core"; } from "@material-ui/core";
import Monq from "../static/images/Monq.jpg"; import Monq from "../static/images/Monq.jpg";
import Graphics from "../static/images/Graphics.png"; import Graphics from "../static/images/Graphics.png";
import NewGraphics from "../static/images/NewGraphics.png";
class GameProjects extends Component { class GameProjects extends Component {
constructor(props) { constructor(props) {
super(props); super(props);
this.content = [ this.content = [
{
header: "Current Graphics Project",
subheader: "Happening alongside Assistent Lecturer - Falmouth University",
image: NewGraphics,
imageAltText: "Generated terrain",
content: `I'm currently working on a another graphics project as this
is the area of computing I want to get back into. I plan on
implementing much more complex generated terrain and other features
such as including a physics engine for a more complex character
controller and an entity system so I can implement other methods of
terrain traversal.`,
buttonText: "Read Blog",
buttonLink: "/graphics-blog",
},
{ {
header: "Monq", header: "Monq",
subheader: "D-tail Entertainment - Programmer", subheader: "D-tail Entertainment - Programmer",
image: Monq, image: Monq,
imageAltText: "Monq", imageAltText: "Monq",
content: `Technically this was my first attempt at creating a startup with content: `This was my first time working in and creating a startup with
university friends. However we over scoped when it came to having an interesting university friends. I mostly worked on ai aspects of the project as
platformer in a single year when it came to our USP of time mechanics and our well as working on some of the puzzle sections of the game. Though in
artist's great work. This paired with a lack of design and writing put too much the doing it for real indie envirenment I had my hand in pretty much
emphasis on the previously mentioned time mechanics without adequately designed every other programming aspect of the game also.`,
levels to show that off nor create a hook to keep people interested in the game.`,
buttonText: "Learn More", buttonText: "Learn More",
buttonLink: "https://d-tail-entertainment.itch.io/monq", buttonLink: "https://d-tail-entertainment.itch.io/monq",
}, },
{ {
header: "Graphics", header: "University Graphics Project",
subheader: "Bsc (hons) Computing for Games - Falmouth University", subheader: "Bsc (hons) Computing for Games - Falmouth University",
image: Graphics, image: Graphics,
imageAltText: "Generated terrain", imageAltText: "Generated terrain",
content: `This is where I learned how to create a graphics engine from content: `This is where I learned how to create a graphics engine from
scratch using OpenGL and was the project which I enjoyed the most during my scratch using OpenGL and was the project which I enjoyed the most
bachelors degree. I especially enjoyed how deep I jumped into C++ to improve it's during my bachelors degree. I especially enjoyed how deep I jumped into
memory footprint returning to this project in my final year of university.`, C++ to improve it's memory footprint returning to this project in my
final year of university.`,
buttonText: undefined, buttonText: undefined,
buttonLink: undefined, buttonLink: undefined,
}, },

169
src/GraphicsBlog.jsx Normal file
View file

@ -0,0 +1,169 @@
import { h, render, Component } from "preact";
import {
Grid,
Container,
Card,
CardHeader,
CardMedia,
CardActions,
CardContent,
Typography,
Button,
List,
ListHeader,
ListItemIcon,
ListItem,
} from "@material-ui/core";
import ArrowRightIcon from '@material-ui/icons/ArrowRight';
import Header from "./Header";
import Blog1 from "../static/images/GraphicsBlog/blog1.png";
const Blog2 = new URL("../static/video/graphics_blog/blog2.webm", import.meta.url);
import Blog3 from "../static/images/GraphicsBlog/blog3.png";
class GraphicsBlog extends Component {
constructor(props) {
super(props);
this.content = [
{
header: "SDL/OpenGL boilerplate",
subheader: "Note: this blog is a copy of a forum thread",
mediaType: "img",
image: Blog1,
imageAltText: "Textured square",
content: `Today I added textures to my game engine. Next up
refactoring... But then camera movement (Or strangely enough world
movement around camera).`,
buttonText: undefined,
buttonLink: undefined,
},
{
header: "Camera Movement",
subheader: "Note: this blog is a copy of a forum thread",
mediaType: "video",
image: Blog2,
imageAltText: "Textured square with camera movement",
content: `The project is now officially 3D, with camera movement. Next
up is more complex meshes.`,
buttonText: undefined,
buttonLink: undefined,
},
{
header: "Multiple Meshes",
subheader: "Note: this blog is a copy of a forum thread",
mediaType: "img",
image: Blog3,
imageAltText: "2 textured squares",
content: `Now I have a mesh class it's pretty easy to make multiple
objects reusing textures and indecies. Next it's giving those meshes
their own relative position rather than hard coding every position on
every triangle point to move it 🙃.`,
buttonText: undefined,
buttonLink: undefined,
},
];
}
render = () => {
return (
<span>
<Header />
<Container>
<p />
<Card>
<CardHeader title="Graphics Blog" />
<CardContent>
<Typography variant="p" >
In this project I plan to generate a cyberpunk cityscape with
an infinite level of verticality to really give it a large
sense of scale.
</Typography>
<List dense>
<ListHeader>
To Do:
</ListHeader>
<ListItem>
<ListItemIcon><ArrowRightIcon /></ListItemIcon>
Give meshes their own relative location.
</ListItem>
<ListItem>
<ListItemIcon><ArrowRightIcon /></ListItemIcon>
Run a marching square implementation to generate a mesh for a
chunk based on test data.
</ListItem>
<ListItem>
<ListItemIcon><ArrowRightIcon /></ListItemIcon>
Handle loading chunks asynchrounously as the game runs.
</ListItem>
<ListItem>
<ListItemIcon><ArrowRightIcon /></ListItemIcon>
Add a noise algorithm to vary the city scape marching square
generation.
</ListItem>
<ListItem>
<ListItemIcon><ArrowRightIcon /></ListItemIcon>
Create mesh data library to make the marching square
algorithm generate something that looks like a city.
(May require a method of importing models)
</ListItem>
<ListItem>
<ListItemIcon><ArrowRightIcon /></ListItemIcon>
Fancy lighting (Potentially bake some shadows into a chunks
tuxture during the generaton phase).
</ListItem>
<ListItem>
<ListItemIcon><ArrowRightIcon /></ListItemIcon>
Design and create an interesting movement system for the world created.
</ListItem>
<ListItem>
<ListItemIcon><ArrowRightIcon /></ListItemIcon>
Look into potential implementation of mono-rails and
suspended trains as a stretch goal.
</ListItem>
</List>
</CardContent>
</Card>
<p />
<Grid container spacing={3}>
{this.content.reverse().map((project) => {
return (
<Grid item xs="12" lg="6">
<Card>
<CardHeader
title={project.header}
subheader={project.subheader}
/>
<CardMedia
component={project.mediaType}
image={project.image}
alt={project.imageAltText}
muted
loop
autoplay
controls
/>
<CardContent>
<Typography variant="body1" >
{project.content}
</Typography>
</CardContent>
<CardActions>
<Button
target="_blank"
href={project.buttonLink}
color="primary"
>
{project.buttonText}
</Button>
</CardActions>
</Card>
</Grid>
);
})}
</Grid>
</Container>
</span>
);
};
}
export default GraphicsBlog;

View file

@ -29,14 +29,23 @@ class Header extends Component {
<Typography style={{ flex: 1 }}>Warwick New</Typography> <Typography style={{ flex: 1 }}>Warwick New</Typography>
</Link> </Link>
<Box /> <Box />
<Button <span style={{ marginLeft: "auto" }} >
variant="contained" <Button
href="/contact" variant="contained"
color="secondary" href="/graphics-blog"
style={{ marginLeft: "auto" }} color="secondary"
> >
Contact Me Graphics Blog
</Button> </Button>
{" "}
<Button
variant="contained"
href="/contact"
color="secondary"
>
Contact Me
</Button>
</span>
</Toolbar> </Toolbar>
</AppBar> </AppBar>
); );

View file

@ -16,6 +16,7 @@ class Home extends Component {
<Container maxWidth="md"> <Container maxWidth="md">
<WebProjects /> <WebProjects />
</Container> </Container>
<p />
</span> </span>
); );
} }

View file

@ -15,32 +15,38 @@ class Ramble extends Component {
return ( return (
<span> <span>
<Header /> <Header />
<p />
<Container maxWidth="md"> <Container maxWidth="md">
<Card> <Card>
<CardHeader title="Ramble" /> <CardHeader title="Ramble" />
<CardContent> <CardContent>
<Typography varient="p"> <Typography varient="p">
Ramble was a web project I created during my masters to try to Ramble was a web project I created during my master's degree to
create a startup. create a startup. In this project I acted as CTO and built a
website that allowed users to stream their podcasts live and
accept call ins in a similar vain to talk shows! I learnt the
entire javascript web development stack from react to audio
streaming to devops in order to make it a reality.
</Typography> </Typography>
<p /> <p />
<Typography varient="p"> <Typography varient="p">
It was essentially a website with chatroom functionality with It also chatroom functionality with the ability to re-stream to
the ability to re-stream to audiences much like other apps that audiences much like other apps that came out in the time since,
came out in the time since, such as clubhouse. These high such as clubhouse.
profile alternatives to our product destroyed any forst to
market advantage we may have had slready secured a lot of
funding which we failed to procure leading us to choose to
abandon the project.
</Typography> </Typography>
<p /> <p />
<Typography varient="p"> <Typography varient="p">
Due to the projects reliance on software as a service projects During the project's lifespan of just under two years, I acted
and it's part ownership of an incubator program, I'm as CTO. I mostly worked on creating the streaming functionality
unfortunately unable to leave a demo running of the of the project and managing how the project was designed to
functionality we had created. So here's a video of it in action function behind the hood when it was deployed. I learned a ton
I took just before the shutoff. about how web deployment works during this time allowing me to
work on web development modules in the Games Academy at
Falmouth University today.
</Typography>
<p />
<Typography varient="p">
Here's a demo of the project I took before before we moved on.
</Typography> </Typography>
<p /> <p />
<div> <div>

View file

@ -25,6 +25,10 @@ class App extends Component {
import("./Ramble").then((module) => module.default) import("./Ramble").then((module) => module.default)
} }
/> />
<AsyncRoute path="/graphics-blog" getComponent={() =>
import("./GraphicsBlog").then((module) => module.default)
}
/>
<AsyncRoute default getComponent={() => <AsyncRoute default getComponent={() =>
import("./404Page").then((module) => module.default) import("./404Page").then((module) => module.default)
} }

View file

@ -22,7 +22,7 @@ const theme = createTheme({
main: '#046865', main: '#046865',
}, },
background: { background: {
default: '#f8ffeb', default: '#f0ffd6',
}, },
error: { error: {
main: '#e53d00', main: '#e53d00',

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.